Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 SQLiteException:无法将db的区域设置更改为';美国';_Android_Sqlite_Sqliteopenhelper - Fatal编程技术网

Android SQLiteException:无法将db的区域设置更改为';美国';

Android SQLiteException:无法将db的区域设置更改为';美国';,android,sqlite,sqliteopenhelper,Android,Sqlite,Sqliteopenhelper,我最近更新了我的一个(开源)Android应用程序,我的用户得到了一个我无法复制的异常。关键部分是: android.database.sqlite.SQLiteDatabaseLockedException:数据库已锁定(代码5) 然后 原因:android.database.sqlite.SQLiteException:未能将db'/data/data/com.airlocksoftware.hackernews/databases/hacker\u news\u cache.db'的区域设

我最近更新了我的一个(开源)Android应用程序,我的用户得到了一个我无法复制的异常。关键部分是:

android.database.sqlite.SQLiteDatabaseLockedException:数据库已锁定(代码5)

然后

原因:android.database.sqlite.SQLiteException:未能将db'/data/data/com.airlocksoftware.hackernews/databases/hacker\u news\u cache.db'的区域设置更改为“en\u US”。

这种情况发生在Android 2.3-4.2.1的设备上,也发生在我尝试连接数据库的应用程序中的多个地方。我正在使用数据库后关闭它

我找不到有关“未能更改db的语言环境”异常的详细信息。当我查看时,“android_元数据”表或“使用新的区域设置更新索引”似乎有问题


这并不能完全回答问题,但您可能还想看看这篇文章,看看是否可以将其应用到
DbHelperSingleton
,因为这似乎与您面临的错误相同:


检查数据库内容,特别是“android\u元数据”。这是一个包含以下DDL的表:

CREATE TABLE android_metadata ( 
    locale TEXT 
);
其中应至少包含一条包含此内容的记录:

en_US
这解决了我自己的问题

有关更多详细信息:
使用sqlite编辑器打开数据库文件,如openandroid_metadatatable(如果不存在),则创建它。(您可以使用查询编辑器(工具>打开查询编辑器)创建它,并复制/粘贴上面的DDL代码)

要插入记录,可以在查询编辑器中复制/粘贴此行:

insert into android_metadata values ('en_us');

提示:要在SQLiteStudio中运行查询,应按下工具栏中带有图标的按钮。

键为
android.database.sqlite.SQLiteDatabaseLockedException

我也遇到了同样的问题,并且随着数据库锁定的增加,问题不断增加

怎么办?消除数据库锁定

如何进行?-确保没有并发写调用发生,以及

您可以阅读更多关于避免数据库锁定的内容,并在本文中进行了很好的解释


我建议将所有写调用转移到一个线程上,这样可以避免锁定。您可以使用它。

如果您要在应用程序中更改区域设置,请确保在打开数据库之前更改它


当我在打开数据库后切换区域设置时,我的应用程序中也出现了同样的问题,它试图根据不存在的区域设置切换到另一个数据库。

我遇到了完全相同的问题,并且只在少数设备中的一个设备上遇到了同样的问题。这不取决于设备上设置的区域设置,无论我选择哪个设备,都会引发异常设置。是否从AsyncTask访问数据库?是否在一个
SQLiteDatabase
对象中有两个或多个表(可能同时访问)?@anoniim我正在从加载程序访问数据库,所以是的,它是在另一个线程上完成的。此特定代码应该只访问一个表,但可能有其他线程同时访问其他表。您认为这就是问题所在吗?请显示
CacheDbOpener
的源代码。@t0mm13b for
CacheDbOpener
我想,您正在
异步加载器
中使用
getContext()
,最好尝试在范围之外使用静态
上下文,即在应用程序级别或活动级别声明,并在调用
CacheDbOpener(静态上下文)时使用该上下文
例如,看看你得到了什么结果?SQLiteOpenHelper包装调用以直接打开数据库。因此答案建议修改该调用,但SQLiteOpenHelper不是OP编写的代码。你能解释一下你的答案吗?请添加更多详细信息,你是如何为我们提供内容的?谢谢更新,但我是你使用Eclipse。我是否还需要为en-us创建包含内容的新表(我正在创建的表是否需要为en-us再次创建)?Eclipse与sqlite数据库无关。您不能有两个同名的表!因此,如果您已经有了这样的表,只需使用SQLiteStudio运行“插入到”查询即可。
insert into android_metadata values ('en_us');