我正在尝试使用
SQLiteDatabase.openDatabase(
"/data/data/edwin11.myapp/databases/myapp.db", null, (SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS));
创建/打开数据库而不是使用 SQLiteOpenHelper(因为我想传入标志 SQLiteDatabase.NO_LOCALIZED_COLLATORS
。
但是,对于那行代码,我得到了这个异常:
04-18 09:50:03.585: ERROR/Database(3471): sqlite3_open_v2("/data/data/edwin11.myapp/databases/myapp.db", &handle, 6, NULL) failed
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): java.lang.RuntimeException: An error occured while executing doInBackground()
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at java.lang.Thread.run(Thread.java:1060)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): Caused by: android.database.sqlite.SQLiteException: unable to open database file
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584)
04-18 09:50:03.665: ERROR/AndroidRuntime(3471): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
...
在那行代码之前做一些测试(使用 File.isExists
)显示文件 /data/data/edwin11.myapp/databases/myapp.db
不存在。
这会是错误的原因吗? (或者我只是以错误的方式使用 SQLiteDatabase.openDatabase
?)
如果我事先创建文件会有帮助吗? (这不应该由我传入的 SQLiteDatabase.CREATE_IF_NECESSARY
标志来处理吗?)
如果手动创建文件是可行的方法,它只是一个空文件,还是我必须向其中写入一些内容?
感谢和问候。
最佳答案
数据库文件存在于以下路径结构中:
String sDbPath = "/data/data/" + YourMainActivityClass.class.getPackage().getName() + "/databases/YourDBFileName";
例如:如果您的应用程序存在于名为的包中; com.foo.bar
,主要的 Activity 类名为 BabarActivity
,DB 文件名为 MyData.db
您可以发出上述命令;
String sDbPath = "/data/data/" + com.foo.bar.BabarActivity.class.getPackage().getName() + "/databases/MyData.db";
现在,您可以使用此方法检查数据库文件是否存在:
boolean isDbExist() {
SQLiteDatabase checkDB = null;
try {
checkDB = SQLiteDatabase.openDatabase(sDbPath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
Log.d(DB_NAME, "Database does't exist yet.", e);
}
if (checkDB != null) {
checkDB.close();
checkDB = null;
return true;
} else
return false;
}
希望这对您有所帮助!
关于Android - 如何使用 SQLiteDatabase.open?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2660806/