Android拒绝编写/创建sharedpreferences文件

时间:2011-04-23 15:52:20

标签: android emulation commit adb sharedpreferences

我正在使用Eclipse 3.5.2 IDE进行Android开发。我使用以下代码写入默认的sharedpreferences文件,我在 adb模拟器中运行它:

private SharedPreferences getOurSharedPreferences(Activity act) {
    // return getSharedPreferences(SHARED_PREFS_FILENAME, MODE_PRIVATE);
    return act.getPreferences(MODE_PRIVATE);
}

private void putStringToStorage(Activity act, String keyName, String s) {

    // Store it.
    SharedPreferences sharedPrefs = getOurSharedPreferences(act);
    SharedPreferences.Editor editor = sharedPrefs.edit();
    editor.remove(keyName);
    // editor.putString(keyName, s);
    editor.putString(keyName, "test123");
    boolean bCommitted = editor.commit();
    if (!bCommitted) 
        throw new RuntimeException("(AndroidApplication) Unable to save new string.");

    // Get it back as a test.
    // String s2 = getStringFromStorage(keyName);
}

上述方法属于我的 Application 子类,这就是为什么该方法带有 Activity 对象参数,以便我可以访问 Activity .getPreferences()即可。请注意,之前我使用的是全局 getSharedPreferences()调用,但由于我遇到的问题,我因绝望而改为 getPreferences()。我写“ test123 ”而不是变量“ s ”的原因是为了确保我遇到的问题与“”的某些值无关s “也许共享首选项文件可能不喜欢。

每当我运行代码 editor.commit()时,总会返回 FALSE 。一些历史。前段时间我能够使用名为“app_global”的共享首选项文件写入共享首选项文件,该文件是使用全局 getSharedPreferences()调用而不是 Activity.getPreferences()<创建的。 / strong>即可。我能够从该共享偏好文件中写入和读取值,但是,每当我重新启动我的应用程序时,我在上一个会话期间写的值都消失了。作为调试工作的一部分,我进入了 adb shell ,并从我的应用程序的shared_prefs文件夹中删除了“app_global”。从那时起,模拟器似乎不愿意创建新的共享首选项文件,默认文件或其他。

请注意, LogCat 窗口始终为空,控制台窗口不会显示任何错误,包括在模拟器中启动应用程序期间。我还尝试在调试模式下启动应用程序,并在调试配置中选中“擦除用户数据”。这也无济于事。无论我做什么, editor.commit()都会失败,并且当我从adb执行“ ls -a ”时我的应用程序的 shared_prefs 文件夹shell 始终为空

我的问题是:

  • 我通过某处了解了模拟器的“重建用户图像”。这是一种我可以用来尝试解决我在共享首选项存储中遇到的这类问题的技术吗?如果是这样,我该怎么做?

  • 我还有什么办法可以解决这个问题吗?

- roschler

1 个答案:

答案 0 :(得分:2)

我设法通过手动重新创建sharedpreferences文件来解决问题。我无法确定这一点,但似乎如果您手动删除属于模拟器的共享首选项文件,即使您选择“擦除用户数据”选项,它也不会重新创建它。要手动重新创建sharedpreferences文件,我执行了以下操作:

  • 加载ADB shell
  • 更改为sharedpreferences文件夹(请注意,您必须运行模拟器,否则您将收到“设备未找到”错误,假设您还没有连接手机)
  • 使用您在代码中使用的sharedpreferences文件的名称创建一个空文件。在我的例子中,我创建了一个名为“app_global”的文件。

您可以在此处找到sharedpreferences文件夹:

/data/data/your.app.package.name/shared_prefs

其中 your.app.package.name 是您的应用程序的包名称。要从ADB shell中创建空文件,我使用了命令:

echo -n >app_global

“app_global”是您为sharedpreferences文件命名的内容。 -n 选项可防止将换行符抛入文件中。如果您使用的是 getPreferences(),那么默认的sharedpreferences文件的名称是“your.app.package.name_preferences.xml”。

我从这个StackOverflow帖子获得了有关sharedpreferences文件夹的信息:

How to examine SharedPreferences from adb shell?

- roschler