我有一个现有的Android应用程序,它预先打包一个名为app.db的数据库。 app.db文件位于src / main / res / raw中。在启动应用程序时,它会被复制到数据/数据/应用程序/数据库。
当前版本的db是2,它是使用SQLiteOpenHelper设置的。我不想将此db绑定到任何模型对象,而只是通过运行一些dmls来添加或删除它。
Manifest看起来像这样:
<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 :(得分:0)
我决定写一个答案而不是评论,因为我需要一些额外的格式化帮助。我会根据需要更新这篇文章。
首先,您应该查看SchemaGenerator
班级here。您会注意到有几个日志语句可以帮助缩小您的问题范围。以下是一个例子:
Log.i("Sugar", "not a sugar script. ignored." + file);
所以我建议在你的logcat输出中搜索&#34; Sugar&#34;标记并查看是否显示任何有用的信息。
第二个对调试有价值的地方是找到SugarDb
类here。此类扩展SQLiteOpenHelper
并实现onUpgrade
方法:
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
schemaGenerator.doUpgrade(sqLiteDatabase, oldVersion, newVersion);
}
克隆Sugar源代码并手动编译项目并将其添加为依赖项可能会有所帮助。然后,您将能够直接在SQLite数据库上测试SQL查询,如下所示:
@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"});
}
最后,如果您发现数据不可用,就像您怀疑在启动时的/ data文件夹中那样,您必须修改Sugar源代码以在数据加载后更改数据。