糖ORM只是不会创建表

时间:2016-03-03 07:28:37

标签: android sqlite android-sqlite android-testing sugarorm

我正在开发一个独立的库项目,需要持久化一个简单的模型。这是我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;
    }
}

在存储库类中,我试图通过调用此方法来持久化它:

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

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

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

运行测试时会出现此错误: (截断以使这个问题简洁易读)

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

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

  • 为测试包保留不同的Manifest,以将.test包名称传递给SugarORM。行为没有变化
  • 在其他SO帖子中添加MessageRequestIdModel.findById(MessageRequestIdModel.class, (long) 1);之类的内容。将错误更改为自身(如果有帮助,则显示完整堆栈跟踪):

    android.database.sqlite.SQLiteException: no such table: MESSAGE_REQUEST_ID_MODEL (code 1): , while compiling: SELECT * FROM MESSAGE_REQUEST_ID_MODEL WHERE id=? LIMIT 1
    
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1240)
    at com.orm.SugarRecord.find(SugarRecord.java:192)
    at com.orm.SugarRecord.findById(SugarRecord.java:102)
    at pm.tin.apprise.entities.message_request_ids.MessageRequestIdModelRepository.save(MessageRequestIdModelRepository.java:19)
    
  • 我尝试从Manifest中删除所有Sugar ORM配置,就像很多人建议的那样 - 这没有任何改变

  • 我尝试创建一个示例应用模块并尝试将其作为该应用的测试用例运行,以防独立应用在模拟器/设备上获得正确的资源(I&已经对两者进行了测试

  • 我尝试过递增数据库的VERSION

  • 我尝试过切换到ActivityTestCase并使用getActivity().getApplicationContext()。这基本上失败了一个错误,表明这个上下文不完整,无法设置SQLite

正如你所看到的,我整夜都在这块巨石上狠狠地推了一下,但是在这一点上它看起来像是Sisyphean,除了使用与Sugar不同的ORM之外,我完全没有领导我的下一次调试尝试。 #39;真的好像是问题)。没有什么可以在测试用例中无法运行SQLite的阉割了,我向你的神圣程序员意识求助: - &#39;(

3 个答案:

答案 0 :(得分:23)

在Android Studio 2.x.x-beta版本(最值得注意的是2.0.0-beta6)中观察到此问题,其根本原因在于“即时运行”功能。

我想这可能很快就会解决,但为了在此期间工作,您应该禁用以下菜单中的功能

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

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

您可以看到相关的Sugar Bug报告here

答案 1 :(得分:8)

这应该最终解决这个问题,因为那里的所有人都在努力让Sugar ORM开箱即用 - 使用SQL版本系统来手动触发创建SQL。

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

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

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为您创建表(尽管是手动)。

附加说明

  • Sugar ORM手册的这一部分是这个(虽然是hacky)修复背后的灵感:http://satyan.github.io/sugar/migration.html
  • 我已经从Sugar config
  • 中注释掉了包名
  • Sugar与Instrumentation Application Context一起使用。在InstrumentationTestCase的基类中,只需执行SugarContext.init(getInstrumentation().getTargetContext()),如原始问题所示

答案 2 :(得分:1)

您的问题可能是创建课程......

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;
    }
}

请重新检查我的代码。