Сохраните файлы SharedPreferences в пользовательский каталог или получите каталог SharedPreferences по умолчанию - PullRequest
7 голосов
/ 19 ноября 2011

Можно ли сохранить файлы SharedPreferences в пользовательский каталог? Скажем в /data/data/package.name/my_prefs/.

Или возможно получить каталог, в котором SharedPreferences по умолчанию сохранены?

P.S. Жесткое кодирование пути /data/data/package.name/shared_prefs/ не является решением.

Ответы [ 2 ]

6 голосов
/ 20 ноября 2011

Или есть возможность получить каталог SharedPreferences по умолчанию сохраняется в?

Да.

Это в основном dataDir / shared_prefs, который вы можете получить из объекта ApplicationInfo (который, в свою очередь, вы можете получить из PackageManager ). (Кроме того, это может быть то же самое, что и каталог «getFilesDir», который можно легко получить из самого Context ? Не уверен, не проверял это.)

Из источника, начиная с Context.getSharedPreferences ( Источник ContextImpl ):

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");
    }

И «mPackageInfo» является экземпляром LoadedApk :

public File getDataDirFile() {
        return mDataDirFile;
    }

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

 mDataDir = aInfo.dataDir;

И это возвращает нас к ApplicationInfo .

Я бы сказал, что если вы не хотите полагаться на соглашение / data / data / <имя_пакета> / shared_prefs , тогда будет безопасно получить dataDir и полагаться на shared_prefs. " оттуда?

0 голосов
/ 22 ноября 2015

Или есть возможность получить каталог SharedPreferences по умолчанию сохраняется в?

См. Этот ответ, чтобы узнать, как безопасно получить путь: https://stackoverflow.com/a/33849650/1504248

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...