Android 拒绝写入/创建共享首选项文件

标签 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()< 创建的/强>。我能够从该共享首选项文件写入和读取值,但是,每当我重新启动我的应用程序时,我在上次 session 期间写入的值都消失了。作为调试工作的一部分,我进入了 adb shell 并从我的应用程序的 shared_prefs 文件夹中删除了“app_global”。从那时起,模拟器似乎不愿意创建新的共享首选项文件,无论是默认文件还是其他文件。

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

我的问题是:

  • 我在某处顺便读到有关模拟器“重建用户图像”的内容。这是我可以用来尝试解决我在共享偏好存储方面遇到的这组问题的技术吗?如果是这样,我该怎么做?

  • 还有什么我可以尝试解决这个问题的吗?

-- 罗施勒

最佳答案

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

  • 加载 ADB shell
  • 更改到 sharedpreferences 文件夹(请注意,您必须运行模拟器,否则您将收到“找不到设备”错误,前提是您也没有连接手机)
  • 使用您在代码中使用的共享首选项文件的名称创建一个空文件。就我而言,我创建了一个名为“app_global”的文件。

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

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

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

echo -n >app_global

“app_global”是您命名共享首选项文件的地方。 -n 选项可防止将换行符放入文件中。如果您使用 getPreferences(),则默认共享首选项文件的名称为“your.app.package.name_preferences.xml”。

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

How to examine SharedPreferences from adb shell?

-- 罗施勒

关于Android 拒绝写入/创建共享首选项文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765207/

相关文章:

android - 隐藏设备是模拟器的事实?

linux - 通过 USB 将 Linux native 文件系统作为 VFAT 或 NTFS 导出到 Windows

android - 在框架布局上设置动态创建的 TextView

java - 将模块添加到我的 Android 应用程序时出现 DuplicateFileException

android - 无法创建 Android 虚拟设备 "/dev/kvm"在 Windows 上找不到

git - 当我使用 "git branch"时是否可以显示最新的提交?

java - 当autocommit=false并且没有提交或回滚时Oracle如何处理SQL?

android - 如何将 C++ 文件正确链接到 Android Studio 中的现有 Android 项目?

android - 如何在 android O 的系统设置中对通知 channel 进行排序

git - 通过已知文件夹名称恢复丢失的提交