Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android拒绝写入/创建SharedReferences文件_Android_Emulation_Commit_Adb_Sharedpreferences - Fatal编程技术网

Android拒绝写入/创建SharedReferences文件

Android拒绝写入/创建SharedReferences文件,android,emulation,commit,adb,sharedpreferences,Android,Emulation,Commit,Adb,Sharedpreferences,我正在使用Eclipse3.5.2IDE进行Android开发。我正在使用以下代码写入默认的SharedReferences文件,并在adb emulator中运行该文件: private SharedPreferences getOurSharedPreferences(Activity act) { // return getSharedPreferences(SHARED_PREFS_FILENAME, MODE_PRIVATE); return act.getPrefer

我正在使用Eclipse3.5.2IDE进行Android开发。我正在使用以下代码写入默认的SharedReferences文件,并在adb emulator中运行该文件:

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);
}
上述方法属于我的应用程序子类,这就是为什么该方法带有活动对象参数,以便我可以访问活动.getPreferences()。注意,以前我使用的是全局getSharedReferences()调用,但由于遇到问题,我迫不及待地改为getPreferences()。我之所以编写“test123”而不是变量“s”,是为了确保我遇到的问题与共享首选项文件可能不喜欢的某个“s”值无关

每当我运行代码编辑器时,commit()总是返回FALSE。一些历史。不久前,我能够使用名为“app_global”的共享首选项文件写入共享首选项文件,该文件是通过使用全局getSharedReferences()调用而不是Activity.getPreferences()创建的。我能够从共享首选项文件中写入和读取值,但是,每当我重新启动应用程序时,我在上一次会话中写入的值都会消失。作为调试工作的一部分,我进入了adb shell,并从我的应用程序的共享prefs文件夹中删除了“app_global”。从那时起,emulator似乎不愿意创建一个新的共享首选项文件,不管是默认文件还是其他文件

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

我的问题是:

  • 我顺便读了一篇关于为模拟器“重建用户映像”的文章。这是一种我可以用来解决共享首选项存储问题的技术吗?如果是,我该怎么做

  • 我还可以尝试解决这个问题吗


--roschler

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

  • 加载ADB外壳
  • 更改为SharedReferences文件夹(请注意,您必须运行emulator,否则将出现“未找到设备”错误,假设您也没有连接电话)
  • 使用代码中使用的SharedReferences文件的名称创建一个空文件。在我的例子中,我创建了一个名为“app_global”的文件
您可以在此处找到SharedReferences文件夹:

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

echo -n >app_global
其中“app_global”是您命名的共享引用文件。-n选项可防止行式提要被抛出到文件中。如果使用的是getPreferences(),则默认SharedReferences文件的名称为“your.app.package.name\u preferences.xml”

我从这篇StackOverflow文章中获得了有关SharedReferences文件夹的信息:


--roschler

只是一个旁注:抛出RuntimeException并不是一个很好的做法。您是否尝试过在editor.remove(keyName)之后使用commit()?没有,但我解决了问题。请参阅下面我的“自我回复”。谢谢