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报告.
这应该最终解决这个问题,因为那里的所有人都在努力让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为您创建表(尽管是手动).
补充说明
InstrumentationTestCase,只需执行SugarContext.init(getInstrumentation().getTargetContext())原始问题中所示