#android #sqlite
#Android #sqlite
Вопрос:
У меня есть база данных в папке активов, которая копируется в приложение. Это делается точно так же, как здесь: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications /
Все это отлично работает в Android 2.3.3 и выше, но не работает в версиях ниже. Это телефоны, на которых я тестировал приложение:
Samsung Galaxy S II — ANDROID 2.3.3 — работает
Sony Ericsson neo — ANDROID 2.3.3 — работает
LG P350 — ANDROID 2.2.2 — ошибка копирования базы данных
Sony Ericsson Xperia X8 — ANDROID 2.1-обновление 1 — ошибка копирования базы данных
Samsung GalaxyACE Android 2.2.1. — ошибка копирования базы данных
Samsung Galaxy Tab 10.1 Android 3.1 — работает
Ошибка выглядит следующим образом:
10-13 13:03:43.773: ERROR/Database(2770): SELECT locale FROM android_metadata failed
10-13 13:03:43.783: ERROR/Database(2770): Failed to setLocale() when constructing, closing the database
10-13 13:03:43.783: ERROR/Database(2770): android.database.sqlite.SQLiteException: no such table: android_metadata
10-13 13:03:43.783: ERROR/Database(2770): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
10-13 13:03:43.783: ERROR/Database(2770): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)
10-13 13:03:43.783: ERROR/Database(2770): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)
10-13 13:03:43.783: ERROR/Database(2770): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
10-13 13:03:43.783: ERROR/Database(2770): at org.com.db.DataBaseHelper.checkDataBase(DataBaseHelper.java:81)
10-13 13:03:43.783: ERROR/Database(2770): at org.com.db.DataBaseHelper.createDataBase(DataBaseHelper.java:42)
10-13 13:03:43.783: ERROR/Database(2770): at org.com.SentencesActivity.onCreate(SentencesActivity.java:49)
10-13 13:03:43.783: ERROR/Database(2770): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-13 13:03:43.783: ERROR/Database(2770): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-13 13:03:43.783: ERROR/Database(2770): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
10-13 13:03:43.783: ERROR/Database(2770): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-13 13:03:43.783: ERROR/Database(2770): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-13 13:03:43.783: ERROR/Database(2770): at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 13:03:43.783: ERROR/Database(2770): at android.os.Looper.loop(Looper.java:123)
10-13 13:03:43.783: ERROR/Database(2770): at android.app.ActivityThread.main(ActivityThread.java:4627)
10-13 13:03:43.783: ERROR/Database(2770): at java.lang.reflect.Method.invokeNative(Native Method)
10-13 13:03:43.783: ERROR/Database(2770): at java.lang.reflect.Method.invoke(Method.java:521)
10-13 13:03:43.783: ERROR/Database(2770): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-13 13:03:43.783: ERROR/Database(2770): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-13 13:03:43.783: ERROR/Database(2770): at dalvik.system.NativeStart.main(Native Method)
10-13 13:03:43.793: VERBOSE/Debugger(2770): Copying db
10-13 13:03:43.893: WARN/dalvikvm(2770): threadid=1: thread exiting with uncaught exception (group=0x40020ac0)
Комментарии:
1. убедитесь, что у вас есть таблица android_metadata в вашей базе данных и языковой стандарт, установленный по умолчанию.
2. единственной записью в android_metadata является en_US
3. на самом деле вам не нужно создавать эту таблицу в моем случае, я создаю только свои таблицы, и когда я извлекаю базу данных из проводника в eclipse, она создает эту таблицу automatically.so удалите таблицу android_metadata и удалите свое приложение, запустите проект снова. если вы хотите, я могу опубликовать код.
4. Я тоже ее не создаю. Он создается автоматически. Он работает с Android 2.3.3 и выше, но похоже, что более низкие версии не могут найти таблицу android_metadata.
5. Я думаю, проблема в том, что БД слишком большая. Это около 18 МБ. Когда я удалил часть данных и сократил базу данных до 149 КБ, она скопировалась без проблем.
Ответ №1:
Проблема не работала на более старых версиях Android, потому что база данных была слишком большой для них, а ограничение — 18 МБ. Решение этой проблемы заключается в разделении базы данных на 18 файлов размером 1 МБ.