Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
1

SQLite обновление базы данных

03.02.2014, 08:50. Просмотров 1975. Ответов 2
Метки нет (Все метки)

Всем привет.

Использую базу данных в приложении. При обновлении программы нужно обновить базу данных в том числе, база данных хранится в архиве в папке assets/database
У меня есть класс DataBase:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class DataBase extends SQLiteAssetHelper {
 
    private static final String DATABASE_NAME = "ups.db";
    private static final int DATABASE_VERSION = 2;
 
    public DataBase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
 
        // you can use an alternate constructor to specify a database location 
        // (such as a folder on the sd card)
        // you must ensure that this folder is available and you have permission
        // to write to it
        //super(context, DATABASE_NAME, context.getExternalFilesDir(null).getAbsolutePath(), null, DATABASE_VERSION);
 
    }
 
    public Cursor getEmployees() {
 
        SQLiteDatabase db = getReadableDatabase();
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
 
        String [] sqlSelect = {"0 _id", "art"}; 
        String sqlTables = "ups";
 
        qb.setTables(sqlTables);
        Cursor c = qb.query(db, sqlSelect, null, null,
                null, null, null);
 
        c.moveToFirst();
        return c;
 
    }
 
}
Если оставлю строчку
Java
1
private static final int DATABASE_VERSION = 1;
База данных не обновляется, если поставлю
Java
1
private static final int DATABASE_VERSION = 2;
то выдает ошибку:
Кликните здесь для просмотра всего текста
02-03 10:44:48.456: I/SQLiteAssetHelper(32627): successfully opened database ups.db
02-03 10:44:48.456: W/SQLiteAssetHelper(32627): Upgrading database ups.db from version 1 to 2...
02-03 10:44:48.456: W/SQLiteAssetHelper(32627): missing database upgrade script: databases/ups.db_upgrade_1-2.sql
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): no upgrade script path from 1 to 2
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): Couldn't open ups.db for writing (will try read-only):
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: no upgrade script path from 1 to 2
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.onUpgrade(SQLiteAssetHelper.java:314)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:197)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:254)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at ru.nag.nagupscalc.DataBase.getEmployees(DataBase.java:28)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at ru.nag.nagupscalc.Calc.onCreate(Calc.java:45)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.app.Activity.performCreate(Activity.java:5104)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.app.ActivityThread.access$600(ActivityThread.java:153)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.os.Handler.dispatchMessage(Handler.java:99)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.os.Looper.loop(Looper.java:137)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at android.app.ActivityThread.main(ActivityThread.java:5226)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at java.lang.reflect.Method.invokeNative(Native Method)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at java.lang.reflect.Method.invoke(Method.java:511)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
02-03 10:44:48.456: E/SQLiteAssetHelper(32627): at dalvik.system.NativeStart.main(Native Method)
02-03 10:44:48.466: D/AndroidRuntime(32627): Shutting down VM
02-03 10:44:48.466: W/dalvikvm(32627): threadid=1: thread exiting with uncaught exception (group=0x41989930)
02-03 10:44:48.466: E/AndroidRuntime(32627): FATAL EXCEPTION: main
02-03 10:44:48.466: E/AndroidRuntime(32627): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.nag.nagupscalc/ru.nag.nagupscalc.Calc}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 1 to 2: /data/data/ru.nag.nagupscalc/databases/ups.db
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.ActivityThread.access$600(ActivityThread.java:153)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.os.Handler.dispatchMessage(Handler.java:99)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.os.Looper.loop(Looper.java:137)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.ActivityThread.main(ActivityThread.java:5226)
02-03 10:44:48.466: E/AndroidRuntime(32627): at java.lang.reflect.Method.invokeNative(Native Method)
02-03 10:44:48.466: E/AndroidRuntime(32627): at java.lang.reflect.Method.invoke(Method.java:511)
02-03 10:44:48.466: E/AndroidRuntime(32627): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-03 10:44:48.466: E/AndroidRuntime(32627): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
02-03 10:44:48.466: E/AndroidRuntime(32627): at dalvik.system.NativeStart.main(Native Method)
02-03 10:44:48.466: E/AndroidRuntime(32627): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 1 to 2: /data/data/ru.nag.nagupscalc/databases/ups.db
02-03 10:44:48.466: E/AndroidRuntime(32627): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:266)
02-03 10:44:48.466: E/AndroidRuntime(32627): at ru.nag.nagupscalc.DataBase.getEmployees(DataBase.java:28)
02-03 10:44:48.466: E/AndroidRuntime(32627): at ru.nag.nagupscalc.Calc.onCreate(Calc.java:45)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.Activity.performCreate(Activity.java:5104)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-03 10:44:48.466: E/AndroidRuntime(32627): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
02-03 10:44:48.466: E/AndroidRuntime(32627): ... 11 more


Как понятно - не хватает ему скрипта обновления.
Подскажите где это должно быть прописано.
Спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2014, 08:50
Ответы с готовыми решениями:

Обновление базы данных SQLite
В приложении имеется база данных с таблицей, заранее заполненной информацией....

Обновление базы данных sqlite
Уже который день бьюсь никак не выходит Подскажите, что я делаю неверно у...

Постолбцовое отображение данных из базы данных SQLite
Уважаемые форумчане, помогите пожалуйста. Необходимо вывести данные из таблицы...

Выборка с базы данных SQLite
Доброго времени суток ребята. Занимаюсь простым приложением, что-то типа...

Вытащить информацию из базы данных Sqlite
Здравствуйте! Пишу простенькое приложение "Справочник". В кратком что у меня...

2
Slon747
59 / 37 / 2
Регистрация: 24.08.2013
Сообщений: 522
03.02.2014, 10:20 2
База открывается в режиме getReadableDatabase, а нужен режим getWritableDatabase
0
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
03.02.2014, 14:27  [ТС] 3
Цитата Сообщение от Slon747 Посмотреть сообщение
База открывается в режиме getReadableDatabase, а нужен режим getWritableDatabase
Не помогло:

Кликните здесь для просмотра всего текста
02-03 13:23:23.248: I/SQLiteAssetHelper(4578): successfully opened database ups.db
02-03 13:23:23.248: W/SQLiteAssetHelper(4578): Upgrading database ups.db from version 1 to 2...
02-03 13:23:23.248: W/SQLiteAssetHelper(4578): missing database upgrade script: databases/ups.db_upgrade_1-2.sql
02-03 13:23:23.248: E/SQLiteAssetHelper(4578): no upgrade script path from 1 to 2
02-03 13:23:23.248: D/AndroidRuntime(4578): Shutting down VM
02-03 13:23:23.248: W/dalvikvm(4578): threadid=1: thread exiting with uncaught exception (group=0x41989930)
02-03 13:23:23.258: E/AndroidRuntime(4578): FATAL EXCEPTION: main
02-03 13:23:23.258: E/AndroidRuntime(4578): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.nag.nagupscalc/ru.nag.nagupscalc.Calc}: com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: no upgrade script path from 1 to 2
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.ActivityThread.access$600(ActivityThread.java:153)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.os.Handler.dispatchMessage(Handler.java:99)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.os.Looper.loop(Looper.java:137)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.ActivityThread.main(ActivityThread.java:5226)
02-03 13:23:23.258: E/AndroidRuntime(4578): at java.lang.reflect.Method.invokeNative(Native Method)
02-03 13:23:23.258: E/AndroidRuntime(4578): at java.lang.reflect.Method.invoke(Method.java:511)
02-03 13:23:23.258: E/AndroidRuntime(4578): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-03 13:23:23.258: E/AndroidRuntime(4578): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
02-03 13:23:23.258: E/AndroidRuntime(4578): at dalvik.system.NativeStart.main(Native Method)
02-03 13:23:23.258: E/AndroidRuntime(4578): Caused by: com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: no upgrade script path from 1 to 2
02-03 13:23:23.258: E/AndroidRuntime(4578): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.onUpgrade(SQLiteAssetHelper.java:314)
02-03 13:23:23.258: E/AndroidRuntime(4578): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:197)
02-03 13:23:23.258: E/AndroidRuntime(4578): at ru.nag.nagupscalc.DataBase.getEmployees(DataBase.java:28)
02-03 13:23:23.258: E/AndroidRuntime(4578): at ru.nag.nagupscalc.Calc.onCreate(Calc.java:45)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.Activity.performCreate(Activity.java:5104)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-03 13:23:23.258: E/AndroidRuntime(4578): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
02-03 13:23:23.258: E/AndroidRuntime(4578): ... 11 more


Добавлено через 1 час 19 минут
Ошибка начинается с того что нет некого скрипта обновления ups.db_upgrade_1-2.sql в папке с базой.

Я сравнил несколько проектов и нашел что при upgrade действительно требуется такой файл. Единственное похожее на содержимое что я нашел - это Дамп базы данных.
Но все равно не помогло, ошибка немного изменилась:

Кликните здесь для просмотра всего текста
02-03 14:40:04.037: I/SQLiteAssetHelper(7766): successfully opened database ups.db
02-03 14:40:04.047: W/SQLiteAssetHelper(7766): Upgrading database ups.db from version 1 to 2...
02-03 14:40:04.047: W/SQLiteAssetHelper(7766): processing upgrade: databases/ups.db_upgrade_1-2.sql
02-03 14:40:04.057: E/SQLiteLog(7766): (1) statement aborts at 2: [-- ----------------------------
02-03 14:40:04.057: E/SQLiteLog(7766): -- Records of akb
02-03 14:40:04.057: E/SQLiteLog(7766): -- ----------------------------
02-03 14:40:04.057: E/SQLiteLog(7766): BEGIN] cannot start a transaction within a transaction
02-03 14:40:04.197: D/AndroidRuntime(7766): Shutting down VM
02-03 14:40:04.197: W/dalvikvm(7766): threadid=1: thread exiting with uncaught exception (group=0x41989930)
02-03 14:40:04.217: E/AndroidRuntime(7766): FATAL EXCEPTION: main
02-03 14:40:04.217: E/AndroidRuntime(7766): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.nag.nagupscalc/ru.nag.nagupscalc.Calc}: android.database.sqlite.SQLiteException: cannot start a transaction within a transaction (code 1)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.ActivityThread.access$600(ActivityThread.java:153)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.os.Handler.dispatchMessage(Handler.java:99)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.os.Looper.loop(Looper.java:137)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.ActivityThread.main(ActivityThread.java:5226)
02-03 14:40:04.217: E/AndroidRuntime(7766): at java.lang.reflect.Method.invokeNative(Native Method)
02-03 14:40:04.217: E/AndroidRuntime(7766): at java.lang.reflect.Method.invoke(Method.java:511)
02-03 14:40:04.217: E/AndroidRuntime(7766): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-03 14:40:04.217: E/AndroidRuntime(7766): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
02-03 14:40:04.217: E/AndroidRuntime(7766): at dalvik.system.NativeStart.main(Native Method)
02-03 14:40:04.217: E/AndroidRuntime(7766): Caused by: android.database.sqlite.SQLiteException: cannot start a transaction within a transaction (code 1)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:727)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1665)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)
02-03 14:40:04.217: E/AndroidRuntime(7766): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.onUpgrade(SQLiteAssetHelper.java:328)
02-03 14:40:04.217: E/AndroidRuntime(7766): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:197)
02-03 14:40:04.217: E/AndroidRuntime(7766): at ru.nag.nagupscalc.DataBase.getEmployees(DataBase.java:28)
02-03 14:40:04.217: E/AndroidRuntime(7766): at ru.nag.nagupscalc.Calc.onCreate(Calc.java:45)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.Activity.performCreate(Activity.java:5104)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-03 14:40:04.217: E/AndroidRuntime(7766): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
02-03 14:40:04.217: E/AndroidRuntime(7766): ... 11 more


Добавлено через 1 час 43 минуты
Немного разобрался.
ups.db_upgrade_1-2.sql - это скрипт, по сути merge как в MySql, не подскажите редактор SQLite баз данных, который мог бы генерировать подобный скрипт, чтобы руками его не писать.

Спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 14:27

Вывод данных из базы данных SQLite
Здравствуйте уважаемые форумчане! Делаю программу для работы с базой данных...

Загрузка базы данных из файла, в классе SQLite БД
Здравствуйте. Есть метод loadBDOfWordsToList(), который из текстового файла...

Где хранится файл базы данных SQLite на устройстве?
Здравствуйте друзья! Где храниться файл базы данных SQLite на устройстве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru