2011-03-04 22 views
6

我有下面的代码,它给出了运行时错误如下。为什么?外部SQLite文件内容访问错误

try{ 
String myPath = DB_PATH + DB_NAME; 
mDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
}catch(SQLiteException e){} 

运行时错误:

:sqlite returned: error code = 1, msg = no such table: android_metadata 
:SELECT locale FROM android_metadata failed 
:Failed to setLocale() when constructing, closing the database 
:android.database.sqlite.SQLiteException: no such table: android_metadata 
+0

一个解决方案可以是,使用openOrCreateDatabase而不是openDatabase。这将创建数据库,如果它不可用。 – Mudassir 2011-03-04 07:23:35

回答

24

确保表名android_metadata是存在的,与列名locale,可以插入EN_US作为价值locale

或者说执行这条SQL语句:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US'); 

编辑:如果你调用的openDatabase()与SQLiteDatabase.NO_LOCALIZED_COLLATORS标志,你就不需要有这个表,否则你将需要有解决此表。

请参阅setLocale()

+1

否..为什么需要该列?在我的应用程序中,我正在访问远程.sqlite文件并显示它。它不包含任何这样的文件..这是强制性的android? – vnshetty 2011-03-04 07:23:48

+0

答案已经更新。 – SteD 2011-03-04 07:31:26

+1

是啊..你是对的!但是这张表的意义是什么...... – vnshetty 2011-03-04 07:39:31

5

调用的openDatabase()与SQLiteDatabase.NO_LOCALIZED_COLLATORS标志,这是我做的,当我遇到上次的问题......

8

当以只读方式打开数据库和它尚未创建,使用NO_LOCALIZED_COLLATORS。

try{ 
    String myPath = DB_PATH + DB_NAME; 
    mDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY+ SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
}catch(SQLiteException e){} 

如果使用写入权限打开数据库,将创建android_metadata表。

+0

标志加“+”是正确的吗?可能应该是一个OR“|”不是吗? – 2013-04-03 10:42:15

+0

其管道符号,按位或| – spy 2016-09-15 00:10:15