3

我有一个现有的 Android 应用程序,它预先打包了一个名为 app.db 的数据库。app.db 文件位于 src/main/res/raw 中。在启动应用程序时,它会被复制到 data/data/app/databases。

db 的当前版本是 2,它是使用 SQLiteOpenHelper 设置的。我不想将此数据库绑定到任何模型对象,而只想通过运行一些 dmls 来添加或删除行。

清单看起来像这样:

<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。我在 assets 中创建了一个名为 sugar_upgrades 的文件夹,并在其中创建了一个名为 3.sql 的文件。该文件包含如下脚本:

DELETE FROM images WHERE id = 53;

但是在运行应用程序之后,这个脚本永远不会运行。我认为问题是 Sugar 期望 db 出现在 /data 文件夹中。但是在应用程序开始时它存在于 res/raw 中,这就是它无法拾取它的原因。我有什么办法可以做到这一点?

4

1 回答 1

0

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

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

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

因此,我建议在您的 logcat 输出中搜索“Sugar”标签,看看是否显示了任何有用的信息。

第二个对调试有价值的地方是在 这里SugarDb找到的类。此类扩展并实现了该方法:SQLiteOpenHelperonUpgrade

@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 源代码以在加载数据后更改数据。

于 2015-06-23T05:34:02.783 回答