2015-10-14 31 views
0

請注意,這個問題不是關於如果密鑰未知的情況下獲取SharedPreferences對象的內容,而是關於如果它的名稱未知,是否可以自己獲取SharedPreferences。只有部分名稱是已知的時,是否有可能獲得共享首選項對象?

假設有SharedPrefreferences集合'文件名'「something-a」,「something-b」,「something-c」。那麼是否有可能確定有3套SharedPreferences對象可用,並且只有在知道其名稱的「某些」部分時才能夠獲得它們?

我猜不是但希望有。

我沒有深入瞭解這個需求背後的原因,除了說有一個需要更新一個應用程序到Marshmallows權限模型,它需要能夠閱讀偏好文件,由老版本的應用程序編寫,其中的偏好名字是「something-imsi」。如果用戶沒有在棉花糖上授予相關權限,那麼該應用程序不會知道imsi,因此我試圖瞭解是否可以在應用程序不知道全名時閱讀共享偏好。

+0

我認爲這會做什麼,我一直在尋找http://stackoverflow.com/questions/14580085/android-how-to -get-list-of-all-preference-xmls-for-my-app-and-read-them – Gruntcakes

回答

0

您可以使用SharedPreferences.getAll()檢索所有首選項,並在該集合上迭代匹配模式的字符串鍵。例如:

SharedPreferences prefs = ctx.getSharedPreferences(PREFS_NAME, 0); 
Map<String, ?> pairs = prefs.getAll(); 
for (Map.Entry<String, ?> entry : pairs.entrySet()) { 
    // Check for your string pattern here... 
} 

此答案假定您有一個共享的首選項文件,其中的鍵與問題中描述的模式相匹配。如果情況並非如此,並且您擁有多個與該模式匹配的動態命名的共享首選項文件,則這是一個更難的問題。您可以通過迭代Context.getFilesDir()

+0

OP詢問他是否可以找出不同的偏好文件。 – pgiitu

+0

謝謝,但問題不是如何獲取SharedPeferences對象的內容,如何獲取該對象的第一個地方,如果它的名字是未知的。 – Gruntcakes

+0

現在我明白了。正如編輯答案所說,這是一個更難的問題。如果您真的有動力解決問題,請參閱Context.java的源代碼:https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/ Context.java雖然它包含的'getSharedPrefsFile'方法是隱藏的,它可以使用Java反射訪問,並且您可以從那裏... –

0

中的文件來取得一些進展我不認爲有可能獲得可用的首選項的文件名列表。雖然如果您知道文件名,然後您可以獲得SharedPreferences的實例並使用getAll方法獲取該組首選項中的所有密鑰。

下面是文檔: https://developer.android.com/reference/android/content/SharedPreferences.html#getAll()

例子:

SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, 0); 
    Map<String, ?> map = sharedPreferences.getAll(); 
    for (Map.Entry<String, ?> e : map.entrySet()) { 
     String key = e.getKey(); 
     // this is the key that is present 
    } 
+0

謝謝,但問題不在於如何獲取SharedPeferences對象的內容,如何獲取該對象的第一個位置,如果它的名稱未知。 – Gruntcakes

相關問題