Android - 如何使用 SQLiteDatabase.open?

标签 android

我正在尝试使用

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/

相关文章:

java - 函数声明必须有名称

php - ASyncTask HTTP 错误

Android 自定义字体 (nunito) 未在 TextView 中正确设置

android - 是否可以使用设备专门运行一个应用程序?

java - android主类中函数的并行执行

安卓工作室 NDK 等级 : Cannot find share library

android - "Enable foldable display"即使将 android studio 更新到版本 3.5 并将 android 模拟器更新到 29.1.12 也不会显示

java - SQLite 数据库的 RuntimeException - Android

android - 如何以编程方式确定 Android 应用程序是否在三星 Galaxy 上进入休眠状态?

java - 学习 C/C++ 和 Java