отсутствует таблица в SQLite с определенной версией HTC DESIRE HD - PullRequest
7 голосов
/ 12 января 2011

У моего приложения есть база данных 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.

Logcat:

android.database.sqlite.SQLiteException: нет такой таблицы: LISTE:, whileкомпиляция: выберите _id из LISTE в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2833) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2854) в android.app.ActivityThread.access $ 2300 (ActivityThread.java:136) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2179) в android.os.Handler.dispatchMessage (Handler.java:99) в android.os.Looper.loop (Looper.java:143) вandroid.app.ActivityThread.main (ActivityThread.java:5068) в java.lang.reflect.Method.invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:521) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) в dalvik.system.NativeStart.main (собственный метод) Причины: android.database.sqlite.SQLiteException: нет такихtable: 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.SQLDid.запрос (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 myInput = 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 = myInput.read(buffer))!= -1){
  if (length > 0){
   myOutput.write(buffer, 0, length); 
  }     }

 //Close the streams
 myOutput.flush();
 myOutput.close();
 myInput.close();

}

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

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

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

1 Ответ

0 голосов
/ 12 января 2011

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

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

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

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

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

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