#android #sqlite #installation
#Android #sqlite #установка
Вопрос:
У меня проблема с SQLite. Я разрабатывал с подключенными устройствами, а не с эмулятором. Это всегда было нормально. Я создавал и устанавливал приложение много, много раз на свой телефон и планшет. Примерно неделю назад я внес изменения в базу данных SQLite, которая находится у меня в папке assets. Я удалил приложение со своих устройств, потому что хотел выполнить чистую установку, но теперь кажется, что база данных никогда туда не попадает. это тот же код, который всегда был там. Такого рода вещи:
ПОЖАЛУЙСТА, СМОТРИТЕ внизу ПРИМЕР НОВОГО КОДА
private static String _DB_PATH = "/data/data/com.android.myapp/databases/";
private static final String _DATABASE_NAME = "myapp.sqlite";
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = _DB_PATH _DATABASE_NAME;
***//THE PROBLEM IS THIS LINE, FOR WHATEVER REASON IT'S NO LONGER FINDING THE DATABASE IN THE ASSETS FOLDER
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);***
}
catch (SQLiteException e) {
//database does't exist yet.
}
if (checkDB != null) checkDB.close();
return checkDB != null ? true : false;
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
//do nothing - database already exist
}
else {
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
try {
getReadableDatabase();
copyDataBase();
}
catch (IOException e) {
throw new Error("Error copying database");
}
}
}
Оно устанавливается без ошибок, но когда я делаю что-то для доступа к базе данных на устройстве, оно запускает getReadableDatabase();.
Вот LogCat:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.myapp/com.android.myapp.ActivityL}:
java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
at android.app.ActivityThread.access$1500(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
11-09 21:55:26.250: E/AndroidRuntime(11474): Caused by: java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:223)
at com.yesjapan.android.database.DatabaseHelper.createDataBase(DatabaseHelper.java:82)
at com.yesjapan.android.database.DbAdapter.open(DbAdapter.java:71)
at com.android.myapp.FragmentP.LoadC(FragmentP.java:226)
at com.android.myapp.FragmentP.onCreateView(FragmentP.java:97)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:735)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:909)
at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1584)
at android.app.Activity.performStart(Activity.java:4377)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1721)
Я могу установить предыдущую версию, и, похоже, она работает. Я удалил и перестроил с нуля базу данных. Я понятия не имею, почему он не считает, что там есть база данных или почему база данных не устанавливается.
Это так чертовски неприятно — тратить время на это дерьмо, когда нужно написать код!! ого!
РЕДАКТИРОВАТЬ: вот еще одна распространенная ошибка
11-10 17:33:55.983: E/Database(22087): sqlite3_open_v2("/data/data/com.android.myapp/databases/myapp.sqlite", amp;handle, 2, NULL) failed
РЕДАКТИРОВАТЬ: НОВЫЙ ПРИМЕР КОДА
private boolean checkDataBase() {
//SQLiteDatabase checkDB = null;
File dbfile = null;
try {
//String myPath = _DB_PATH _DATABASE_NAME;
//File myPath = _helperContext.getDatabasePath(_DATABASE_NAME);
//checkDB = SQLiteDatabase.openDatabase(myPath.toString(), null, SQLiteDatabase.OPEN_READWRITE);
String myPath = _DB_PATH _DATABASE_NAME;
dbfile = new File(myPath);
//checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
Log.e("DatabaseHelper", e.getMessage());
}
//if (checkDB != null) checkDB.close();
return dbfile.exists();
//return checkDB != null;
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
//do nothing - database already exist
}
else {
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
getReadableDatabase();
try {
copyDataBase();
}
catch (IOException e) {
throw new Error("Error copying database");
}
}
}
Комментарии:
1. насколько велик файл базы данных?
2. Пожалуйста, покажите код
getReadableDatabase()
. И, лучше изменитьreturn checkDB != null ? true : false;
наreturn checkDB != null;
, даже это не решит проблему.3. @wannik Это встроенная база данных SQLiteDatabase android.database.sqlite. SQLiteOpenHelper.getReadableDatabase() общедоступная синхронизированная база данных SQLiteDatabase getReadableDatabase () Начиная с: уровня API 1
4. @AlanMoore Его размер составляет 108 тыс.
5. Ваш класс
DatabaseHelper
расширяется с?
Ответ №1:
Запустите unzip -l <your_app.apk>
и убедитесь, что база данных включена. Если ее там нет, попробуйте выполнить чистую сборку.
Комментарии:
1. Поздравляю с репутацией L33t: P
2. @levis501 Да, база данных есть. Что вы подразумеваете под «чистой сборкой»?
3. @levi501 Если вы имеете в виду «очистить» в меню проекта, я делал это бесчисленное количество раз :).
4. Хорошо, если это есть в APK, тогда не обращайте внимания на чистую сборку. База данных попадает на ваше устройство, и проблема кроется в другом.
5. Если вы этого еще не сделали, убедитесь, что на вашем устройстве нет свободного места.
Ответ №2:
Прежде всего, никогда не вводите жесткий путь, так как другой OEM-производитель может изменить его в любое время, сделав ваше приложение непригодным для использования, вместо этого используйте getDatabasePath()
Комментарии:
1. Во всех примерах, которые я помню, это жестко закодировано, как у меня … и мне это не очень понравилось. Я внесу это изменение, спасибо.
Ответ №3:
Привет, пожалуйста, повторите строку ниже. в вашем коде
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
Вместо
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
Спасибо