Android升级sql数据库使用android-sqlite-asset-helper

时间:2015-06-11 17:38:27

标签: android sqlite android-sqlite upgrade

我正在使用android-sqlite-asset-helper。我有一个数据库文件,我只用它来读取一些条目。我有一个新的数据库文件,我想要升级,我按照文档here按照说明操作。 根据描述,我必须生成具有特定名称格式的SQL命令文本文件。我使用SQLite Compare Utility来生成命令。由于表只是数据元素中的条目不同,我得到一个简单的SQL命令文件:

    -- Generated by SQLite Compare utility

-- The script can be used to migrate database
-- C:\database_06102015_experiment\olddatabase\vibhakti_pratyaya_san.sqlite schema
-- to the schema of database
-- C:\database_06102015_experiment\vibhakti_pratyaya_san.sqlite

BEGIN TRANSACTION;


COMMIT TRANSACTION;

当我复制SQL命令文件和数据库ZIP文件(仅包含* -v2.db文件)并运行时,我收到以下错误:

06-11 13:30:55.140: I/SQLiteAssetHelper(1093): successfully opened database vibhakti_pratyaya_san
06-11 13:30:55.140: W/SQLiteAssetHelper(1093): Upgrading database vibhakti_pratyaya_san from version 1 to 2...
06-11 13:30:55.150: W/SQLiteAssetHelper(1093): processing upgrade: databases/vibhakti_pratyaya_san_upgrade_1-2.sql
06-11 13:30:55.160: E/SQLiteLog(1093): (1) statement aborts at 2: [-- Generated by SQLite Compare utility

06-11 13:30:55.160: E/SQLiteLog(1093): 

06-11 13:30:55.160: E/SQLiteLog(1093): -- The script can be used to migrate database

06-11 13:30:55.160: E/SQLiteLog(1093): -- C:\database_06102015_experiment\olddatabase\vibhak
06-11 13:30:55.220: E/SQLiteAssetHelper(1093): Couldn't open vibhakti_pratyaya_san for writing (will try read-only):
06-11 13:30:55.220: E/SQLiteAssetHelper(1093): android.database.sqlite.SQLiteException: cannot start a transaction within a transaction (code 1)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.onUpgrade(SQLiteAssetHelper.java:326)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:199)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:257)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at com.mamillasoft.vipra_sanskrit.MyDatabase.getAllLikeList(MyDatabase.java:345)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at com.mamillasoft.vipra_sanskrit.MainActivity.onCreate(MainActivity.java:334)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.app.Activity.performCreate(Activity.java:5133)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.os.Looper.loop(Looper.java:137)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at android.app.ActivityThread.main(ActivityThread.java:5103)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at java.lang.reflect.Method.invokeNative(Native Method)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at java.lang.reflect.Method.invoke(Method.java:525)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-11 13:30:55.220: E/SQLiteAssetHelper(1093):  at dalvik.system.NativeStart.main(Native Method)
06-11 13:30:55.241: D/AndroidRuntime(1093): Shutting down VM

问题:

  1. 为什么无法打开数据库进行编写?

  2. 例外的含义是什么:

  3.   

    无法在交易中启动交易

    1. 为什么SQL命令文件中的注释被视为代码行?

1 个答案:

答案 0 :(得分:0)

整个升级过程已由SQLiteAssetHelper包含在事务中,因此您不得在脚本中使用事务。

SQLite比较实用程序仅比较架构,而不是表的内容,因此它不适合此作业。

“无法打开...写入”消息只是升级失败的结果。

日志只显示一些注释,因为整个命令(以BEGIN TRANSACTION结尾;)被截断;错误消息显示它已完整阅读。