存储带引号的字符串时,Android SharedPreferences崩溃

时间:2011-08-16 19:17:10

标签: android sqlite escaping sharedpreferences orientation-changes

我在共享偏好方面遇到了一些麻烦。我试图在方向更改之前保存搜索框(编辑文本)的文本,然后在方向更改后重新创建活动后恢复它。它的工作方式就像魅力....除非编辑文本包含引号。当有引号并且我旋转设备时,应用程序在尝试以新方向创建活动时崩溃。只有当双引号“,所有其他符号,包括单引号”工作正常时,才会出现这种唯一符号。

我得到的错误是android.database.sqlite.SQLiteException:无法识别的标记:“”ORDER BY name COLLATE NOCASE“。我的猜测是”干扰了SQL查询的编写方式。我尝试在将它们存储在SharedPreferences之前替换所有“with”,然后在取回字符串时替换所有“with”。我仍然遇到同样的问题。任何人都知道如何解决这个问题?

我的代码如下:

@Override
public void onResume()
{
    super.onResume();
    String searchText = f_sharedPreferences.getString("searchText", "");
    f_searchBox.setText(searchText);
}

@Override
public void onPause()
{
    super.onPause();
    String searchText = f_searchBox.getText().toString();
    f_sharedPreferences.edit().putString("searchText", searchText).commit();
}

谢谢!非常感谢您的帮助。

编辑: 在我的onCreate方法中,我使用以下行获得f_sharedPreferences:

    f_sharedPreferences = getSharedPreferences(this.getClass().getName(), Context.MODE_PRIVATE);

另外,我不能使用android:configChanges =“orientation”,因为它会干扰其他功能。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用sqlEscapeString from DatabaseUtils转义字符串中的字符(未经过测试,只是在谷歌上找到)

答案 1 :(得分:0)

好像是Android问题。为什么不将此属性添加到Manifest的Activity部分?它会使文本保存,因此您不必存储它。

android:configChanges="orientation"

请记住,这将禁用Android处理旋转的默认方式,因此如果您依赖于使用不同的纵向/横向布局,您可能希望使用其他方法。