Android - Как использовать SQLiteDatabase.open? - PullRequest
4 голосов
/ 18 апреля 2010

я пытаюсь использовать

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, который я передал?)

Если создание файла вручную - это путь, это просто пустой файл, или я должен что-то записать в него?

Спасибо и всего наилучшего.

1 Ответ

0 голосов
/ 29 ноября 2011

Файлы базы данных существуют в следующей структуре пути:

   String sDbPath = "/data/data/" + YourMainActivityClass.class.getPackage().getName() + "/databases/YourDBFileName";

Например: если ваше приложение существует в пакете с именем; com.foo.bar, а имя основного класса Activity - BabarActivity, с именем файла БД 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;
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...