Отсутствует таблица в SQLite с конкретной версией HTC DESIRE HD

Мое приложение имеет базу данных SQLite в папке с активами. Когда пользователь запускает мое приложение, создается база данных и таблицы.

Это прекрасно работает с множеством устройств (Nexus One, Htc Magic, SGS, X10... и даже Htc Desire HD v2.2). Мое приложение работает со всеми версиями Android (тестируется на моем устройстве (1.6, 2.2, 2.2.1 Htc Magic) и на эмуляторе (v1,5 до v2.3).

У меня только проблема с HTC DESIRE HD v2.2.1 1.72.405.3.

Лог-код:

android.database.sqlite.SQLiteException: нет такой таблицы: LISTE: при компиляции: выберите _id из LISTE at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2833) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2854) at android.app.ActivityThread.access $2300 (ActivityThread.java:136) at android.app.ActivityThread $H.handleMessage(ActivityThread.java:2179) на android.os.Handler.dispatchMessage(Handler.java:99) на android.os.Looper.loop(Looper.java:143) at android.app.ActivityThread.main(ActivityThread.java:5068) в java.lang.reflect.Method.invokeNative(собственный метод) в java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) в dalvik.system.NativeStart.main(собственный метод) Вызвано: android.database.sqlite.SQLiteException: нет такой таблицы: LISTE: при компиляции: выберите _id из LISTE в файле android.database.sqlite.SQLiteCompiledSql.native_compile (собственный метод) в файле android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) в файле android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:64) в android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:80) в android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:46) в android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) в android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1417) в android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1387)... еще 11

Мое приложение создает базу данных, но оно не копирует таблицы файла папки с ресурсами в data\data\packagename\databases\mydatabase.

Мой код:

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.
 this.getReadableDatabase();
 try {
 copyDataBase();
 } catch (IOException e) {
 throw new Error("Error copying database");
 }
 }
}
private void copyDataBase() throws IOException{
 //Open your local db as the input stream
 InputStream ******* = myContext.getAssets().open(DB_NAME);
 // Path to the just created empty db
 String outFileName = DB_PATH + DB_NAME;
 //Open the empty db as the output stream
 OutputStream myOutput = new FileOutputStream(outFileName);
 //transfer bytes from the inputfile to the outputfile
 byte[] buffer = new byte[1024];
 int length;
 while ((length = *******.read(buffer))!= -1){
 if (length > 0){
 myOutput.write(buffer, 0, length); 
 } }
 //Close the streams
 myOutput.flush();
 myOutput.close();
 *******.close();
}

Я думаю, что функция copydatabase имеет проблему, но я не вижу.

Этот код отлично работает со всеми устройствами, кроме HTC DESIRE HD v2.2.1 1.72.405.3.

Какие проблемы могут возникнуть здесь для HTC Desire с указанной версией выше? Как это можно исправить?

1 ответ

Это немного догадка и подразумевает, что в этой версии Android для Desire HD есть "ошибка", поэтому я могу быть вне игры.

Мне интересно, не будет ли эта версия Android не создавать базу данных, где она должна работать. Вы предполагаете, что DB_PATH - это \data\data\packagename\databases \, как обычно, но что, если это не так? Результатом будет следующее...

  • this.getReadableDatabase() создаст пустую базу данных в \some\correct\path\mydatabase
  • Использование new FileOutputStream(outFileName) просто создает новый пустой двоичный файл файл, потому что выше не создавался базу данных в том месте, которое вы ожидаете.
  • Копия успешно завершена.
  • Перед выполнением запроса SELECT доступ к базе данных запрашивается с помощью getReadableDatabase() или getWriteableDatabase(), но оба они просто откроют пустую базу данных, созданную на шаге 1.

Короче говоря, процесс копирования, возможно, работал правильно, но работающая БД пуста и в другом месте, где вы ожидаете.

Просто идея (я видел, что подобные вещи случаются на протяжении многих лет).

licensed under cc by-sa 3.0 with attribution.