Ошибка базы данных при запуске приложения Android с базой данных SQLite - PullRequest
0 голосов
/ 04 ноября 2011

Конкретная ошибка: Сбой приложения Android с базой данных SQLite при попытке доступа к данным / данным / пакетам / базам данных

Примечание. Мне известно, что в Stackoverflow было опубликовано много статей, а также ряд рекомендуемых сайтов, посвященных тому, как скопировать файл sqlite из папки Assets в папку data / data / package / database. Однако моя реализация работает только на эмуляторе, а не на реальных устройствах. Я думаю, что мне не хватает части головоломки.

Мой вопрос Кто-нибудь может определить точку отказа в моем коде? Я действительно думаю, что это один из тех вопросов, когда свежая пара глаз быстро найдет ошибку. Заранее благодарим вас за любые идеи, которые вы можете предоставить ...

Журналы ошибок (жирным шрифтом обозначены точки отказа): 11-02 20: 22: 17.045: INFO / Process (15318): отправка сигнала. PID: 15318 SIG: 9 11-02 20: 22: 17.055: INFO / ActivityManager (2697): процесс com.game.myapp (pid 15318) умер. 11-02 20: 22: 17.055: INFO / WindowManager (2697): WIN DEATH: Window {40922a70 com.game.myapp / com.game.myapp.MainActivity приостановлено = true}

Мой код

public class DatabaseHelper extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "ttg.db";
public static String DATABASE_PATH = "/data/data/com.game.myapp/databases/";

private SQLiteDatabase ttgDatabase;
private Context myContext = null;

DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.myContext = context;
}



    public void createDataBase() throws IOException{
            boolean dbExist = checkDataBase();
                if(dbExist){
       //do nothing
            }else{

        this.getReadableDatabase();

            try {
                copyDataBase();

                    } catch (IOException e) {
                  throw new Error("Error copying database");
                }   
            }
          }


                 private boolean checkDataBase(){
                        SQLiteDatabase checkDB = null;

                        try{
                    String myPath = DATABASE_PATH + DATABASE_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null,         SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){

        } 

        if(checkDB != null){
            checkDB.close();
        }

                return checkDB != null ? true : false;
      }


            private void copyDataBase() throws IOException{
                    File fileTest = myContext.getFileStreamPath(DATABASE_NAME);
                            boolean exists = fileTest.exists();
                    if (!exists) {

            OutputStream databaseOutputStream = new FileOutputStream(DATABASE_PATH + DATABASE_NAME);
            InputStream databaseInputStream;

             databaseInputStream = myContext.getAssets().open(DATABASE_NAME);
                    byte[] buffer = new byte[1024];
             int length;
                while ((length = databaseInputStream.read(buffer)) > 0) {
               databaseOutputStream.write(buffer);
             }
                // Close the streams
               databaseInputStream.close();
               databaseOutputStream.flush();
                   databaseOutputStream.close();
                 }
               }

                public void openDataBase() throws SQLException{
                        //Open the database
                    String myPath = DATABASE_PATH + DATABASE_NAME;
                    ttgDatabase = SQLiteDatabase.openDatabase(myPath, null,  SQLiteDatabase.OPEN_READONLY);
                   } 

                      @Override
                public synchronized void close() {
                        if(ttgDatabase != null)
                            ttgDatabase.close();
                super.close();
        }


@Override
public void onCreate(SQLiteDatabase db) {

}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

1 Ответ

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

Здесь. Возможно, у вас есть поврежденные файлы базы данных (на самом деле, 1 из 1024, которые вы НЕ делаете)

while ((length = databaseInputStream.read(buffer)) > 0) {
    databaseOutputStream.write(buffer);
}

Необходимо указать длину буфера чтения при записи. Вы получите целые 1024 байта при каждой записи.

Я ненавижу писать код для копирования "InputStream / OutputStream" и вижу его повсюду. Если вы хотите использовать его, я создал уменьшенную версию библиотек Apache Commons. Множество вещей, которые вы никогда не использовали бы, но там есть отличный утилитарный код:

http://www.touchlab.co/blog/android-mini-commons/

В противном случае используйте этот метод вместо того, что вы используете сейчас:

http://download.oracle.com/javase/1.4.2/docs/api/java/io/OutputStream.html#write(byte[], int, int)

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