Sugar ORM不会创建表

Ang*_*gad 18 sqlite android android-testing android-sqlite 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@Override
public void save(MessageRequestId messageRequestId) {
    new MessageRequestIdModel(messageRequestId.getId()).save();
}
Run Code Online (Sandbox Code Playgroud)

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

SugarContext.init(getInstrumentation().getContext());
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,这会导致此错误:(截断以使此问题简洁易读)

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

故障排除我已尝试过:

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

    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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 我已经尝试从Manifest中删除所有Sugar ORM配置,就像很多人建议的那样 - 这没有任何改变

  • 我试图创建一个示例应用程序模块,并试图运行它作为一个测试用例该应用,如果独立应用程序没有得到模拟器/设备上正确的资源(我在两个测试)

  • 我已经尝试增加VERSION数据库的数量

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

正如你所看到的那样,我整夜都在这块巨石上狠狠地推了一下,但是在这一点上它似乎是Sisyphean而我在下次调试时绝对没有领先,除了使用与Sugar不同的ORM(实际上并不是这样)似乎是问题).没有什么比在测试案例中无法运行SQLite更阉割的了,我向你的神圣程序员意识求助: - '(

Ed *_*rge 23

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

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

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

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

您可以在此处查看相关的Sugar bug报告.

  • 现在已修复并在主分支中.请参阅https://github.com/satyan/sugar/pull/564它还没有正式发布,但是`compile'c​​om.github.satyan:sugar:b16e65326a'`有修复(这使用jitpack) (2认同)

Ang*_*gad 8

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

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

1.)将Sugar ORM config的DB版本更改为新的数字(比如说N),使其大于当前版本更改数据库名称

2.)ModuleName/src/main/assets/sugar_upgrades/<N>.sql用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配置中注释掉了包名
  • Sugar与Instrumentation Application Context一起使用.在基类中InstrumentationTestCase,只需执行SugarContext.init(getInstrumentation().getTargetContext())原始问题中所示