2011-11-19 15 views
7

Czy można zapisać pliki SharedPreferences w katalogu niestandardowym? Powiedzmy, że w /data/data/package.name/my_prefs/.Zapisuj pliki SharedPreferences do katalogu niestandardowego lub uzyskaj domyślną nazwę SharedPreferences dir

Czy można odzyskać katalog SharedPreferences są domyślnie zapisane na?

P.S. Hardcoding na ścieżce /data/data/package.name/shared_prefs/ nie jest rozwiązaniem.

+0

można spróbować to: 'pliku dir = getDir ("shared_prefs");' – Dalmas

+0

Ten katalog będzie tworzyć tylko '/ dane/dane/package.name/app_shared_prefs/' –

Odpowiedz

6

Czy można odzyskać katalog SharedPreferences to domyślnie zapisany jako?

Tak.

Jest to w zasadzie dataDir/shared_prefs które można uzyskać z ApplicationInfo obiektu (który z kolei można uzyskać z PackageManager). (Również, to może być taka sama jak „getFilesDir” dir można uzyskać łatwo z kontekście sama? Nie wiem, nie sprawdzałem tego.)

Od źródła, począwszy Context.getSharedPreferences (ContextImpl source)

public SharedPreferences getSharedPreferences(String name, int mode) { 
     SharedPreferencesImpl sp; 
     File prefsFile; 
     boolean needInitialLoad = false; 
     synchronized (sSharedPrefs) { 
      sp = sSharedPrefs.get(name); 
      if (sp != null && !sp.hasFileChangedUnexpectedly()) { 
       return sp; 
      } 
      prefsFile = getSharedPrefsFile(name); 
... 

public File getSharedPrefsFile(String name) { 
     return makeFilename(getPreferencesDir(), name + ".xml"); 
    } 

private File getPreferencesDir() { 
     synchronized (mSync) { 
      if (mPreferencesDir == null) { 
       mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); 
      } 
      return mPreferencesDir; 
     } 
    } 

private File getDataDirFile() { 
     if (mPackageInfo != null) { 
      return mPackageInfo.getDataDirFile(); 
     } 
     throw new RuntimeException("Not supported in system context"); 
    } 

i "mPackageInfo" jest przykładem LoadedApk:

public File getDataDirFile() { 
     return mDataDirFile; 
    } 

mDataDirFile = mDataDir != null ? new File(mDataDir) : null; 

mDataDir = aInfo.dataDir; 

i T kapelusz przywraca nas do ApplicationInfo.

powiedziałbym, jeśli nie chcesz polegać na konwencji /data/data/<package_name>/shared_prefs to powinno być bezpieczne, aby uzyskać „datadir” i polegać na „shared_prefs” stamtąd ?

+0

W przypadku niektórych firmware' shared_prefs' można zapisać w innych miejscach. Zobacz: http://stackoverflow.com/questions/5531289/copy-the-shared-preferences-xml-file-from-data-on-samsung-device-failed – Enyby

Powiązane problemy