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

SQLite обновление базы данных - Программирование Android

03.02.2014, 08:50. Просмотров 1910. Ответов 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


Как понятно - не хватает ему скрипта обновления.
Подскажите где это должно быть прописано.
Спасибо
http://www.cyberforum.ru/android-dev/thread2216497.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2014, 08:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос SQLite обновление базы данных (Программирование Android):

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

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

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

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

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

2
Slon747
59 / 37 / 2
Регистрация: 24.08.2013
Сообщений: 474
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 БД
Здравствуйте. Есть метод loadBDOfWordsToList(), который из текстового файла...

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

Обновление Базы данных
Есть база данных которую просматриваю в Активити1, сделал все работает. При...

Обновление базы данных вручную
Бьюсь я над проблемой изменения значений в БД (...


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

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

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