Sugar ORM 只是不会创建表

Sugar ORM just won't create tables

我正在处理一个需要持久化简单模型的独立库项目。这是我的 SugarRecord 的样子:

/**
 *  Keeping track of previously received messages by ID
 */

public class MessageRequestIdModel extends SugarRecord {

    protected String messageRequestId;

    public MessageRequestIdModel() {

    }

    public MessageRequestIdModel(String messageRequestId) {
        this.messageRequestId = messageRequestId;
    }

    public String getMessageRequestId() {
        return this.messageRequestId;
    }

    public static boolean exists(String id) {
        return MessageRequestIdModel.find(
                MessageRequestIdModel.class,
                "messageRequestId = ?",
                id
        ).size() != 0;
    }
}

在存储库 class 中,我试图通过调用此方法来保存它:

@Override
public void save(MessageRequestId messageRequestId) {
    new MessageRequestIdModel(messageRequestId.getId()).save();
}

我现在尝试使用 android.test.InstrumentationTestCase 来测试它,我将 Context 传递给 Sugar,如下所示:

SugarContext.init(getInstrumentation().getContext());

当我 运行 测试时,这会导致此错误: (t运行为了让这个问题保持简洁阅读)

android.database.sqlite.SQLiteException: no such table: MESSAGE_REQUEST_ID_MODEL (code 1): , while compiling: INSERT or REPLACE...

我已经尝试过的故障排除:

如你所见,我整晚都在努力推这块巨石,但在这一点上,它似乎是 Sisyphean,除了使用与 Sugar 不同的 ORM 之外,我的下一次调试尝试绝对没有任何线索(这似乎并不是真正的问题)。没有什么比在测试用例中不能 运行 SQLite 更令人沮丧的了,我向你神圣的程序员意识寻求帮助:-'(

您的问题可能是创建 class...

public class MessageRequestIdModel extends SugarRecord<MessageRequestIdModel> {

    protected String messageRequestId;

    public MessageRequestIdModel() {

    }

    public MessageRequestIdModel(String messageRequestId) {
        this.messageRequestId = messageRequestId;
    }

    public String getMessageRequestId() {
        return this.messageRequestId;
    }

    public static boolean exists(String id) {
        return MessageRequestIdModel.find(
                MessageRequestIdModel.class,
                "messageRequestId = ?",
                id
        ).size() != 0;
    }
}

请重新检查我的代码。

对于所有努力让 Sugar ORM 开箱即用的人来说,这应该最终解决这个问题 - 使用 SQL 版本控制系统手动触发创建 SQL.

在上述用例中,您的操作方法如下:

1.) 将 Sugar ORM 配置的数据库版本更改为一个新数字(例如 N),使其大于当前版本 更改数据库名称

2.) 用你的 SQL 创建一个文件 ModuleName/src/main/assets/sugar_upgrades/<N>.sql;展示我的,以防有帮助:

DROP TABLE MESSAGE_REQUEST_ID_MODEL;

CREATE TABLE MESSAGE_REQUEST_ID_MODEL(ID INTEGER PRIMARY KEY AUTOINCREMENT, MESSAGE_REQUEST_ID CHAR(128));

这将迫使 Sugar 触发您的 SQL 来为您创建 table(尽管是手动的)。

补充说明

  • Sugar ORM 手册的这一部分是此(尽管有点老套)修复背后的灵感:http://satyan.github.io/sugar/migration.html
  • 我在Sugar配置中注释掉了包名
  • Sugar 与 Instrumentation Application Context 一起工作。在 InstrumentationTestCase 的基数 class 中,只需按照原始问题
  • 中所示执行 SugarContext.init(getInstrumentation().getTargetContext())

此问题已在 Android Studio 2.x.x-beta 版本(最著名的是 2.0.0-beta6)中发现,其根本原因在于 'Instant Run' 功能。

我想这可能很快就会得到解决,但要同时正常工作,您应该在以下菜单中禁用该功能

File | Settings | Build, Execution, Deployment | Instant Run

清理然后构建应用程序应该可以解决这些问题。

您可以查看相关的 Sugar 错误报告 here