2015-06-07 3 views
3

У меня есть существующее приложение для Android, которое предварительно упаковывает базу данных под названием app.db. Файл app.db находится в файле src/main/res/raw. При запуске приложения он копируется в data/data/app/databases.Как использовать orm для запуска миграции

Текущая версия db - это 2, которая была установлена ​​с использованием SQLiteOpenHelper. Я не хочу привязывать этот db к любому объекту модели, но только добавляю или удаляю строки из него, запустив некоторые dmls.

Манифест выглядит следующим образом:

<application 
    android:label="@string/app_name" 
    android:icon="@drawable/launcher" 
    android:name="MyApplication"> 
    ... 
<meta-data android:name="DATABASE" android:value="app.db" /> 
<meta-data android:name="VERSION" android:value="3" /> 
<meta-data android:name="QUERY_LOG" android:value="true" /> 
</application> 

MyAppplication класс расширяет SugarApp. Я создал папку с именем sugar_upgrades в активах и создал в ней файл под названием 3.sql. Этот файл содержит скрипт вроде:

DELETE FROM images WHERE id = 53; 

Но после запуска приложения этот скрипт никогда не запускается. Я думаю, что проблема заключается в том, что Sugar ожидает, что db будет присутствовать в папке/data. Но в начале приложения он присутствует в res/raw, и поэтому он не может его поднять. Как я могу это сделать?

ответ

0

Я решил написать ответ, а не комментарий, потому что мне нужна дополнительная помощь в форматировании. Я буду обновлять этот пост по мере необходимости.

Прежде всего, вы должны ознакомиться с классом SchemaGeneratorhere. Вы заметите, что есть несколько журнальных операторов, которые могут помочь сузить проблему. Вот один, например:

Log.i("Sugar", "not a sugar script. ignored." + file); 

Так что я хотел бы предложить поиск вашего вывода LogCat для тега «Sugar» и посмотреть, если есть любая полезная информация, которая отображается.

Второе место, которое было бы ценным для отладки, было бы найденным классом SugarDbhere. Этот класс расширяет SQLiteOpenHelper и реализует onUpgrade метода:

@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
    schemaGenerator.doUpgrade(sqLiteDatabase, oldVersion, newVersion); 
} 

Это может быть полезно, чтобы клонировать исходный код Sugar и компилировать проект вручную и добавить его в качестве зависимости. Тогда вы будете в состоянии тестирования SQL запроса непосредственно в базе данных SQLite, как так:

@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
    schemaGenerator.doUpgrade(sqLiteDatabase, oldVersion, newVersion); 

    sqLiteDatabase.rawQuery("DELETE FROM images WHERE id = ?", new String[]{"53"}); 
} 

Наконец, если вы открыть для данных не доступны, как вы подозреваете в папке/данных при запуске вы должны изменить исходный код Sugar для изменения данных после его загрузки.

 Смежные вопросы

  • Нет связанных вопросов^_^