如何使用糖orm来运行迁移

时间:2015-06-07 19:18:31

标签: android android-sqlite sugarorm

我有一个现有的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中,这就是为什么它无法获取它。我能以任何方式实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

我决定写一个答案而不是评论,因为我需要一些额外的格式化帮助。我会根据需要更新这篇文章。

首先,您应该查看SchemaGenerator班级here。您会注意到有几个日志语句可以帮助缩小您的问题范围。以下是一个例子:

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

所以我建议在你的logcat输出中搜索&#34; Sugar&#34;标记并查看是否显示任何有用的信息。

第二个对调试有价值的地方是找到SugarDbhere。此类扩展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源代码以在数据加载后更改数据。