【发布时间】:2016-03-03 07:28:36
【问题描述】:
我正在开发一个需要持久化简单模型的独立库项目。这是我的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) 我已尝试按照许多人的建议从清单中删除所有 Sugar ORM 配置 - 这没有任何改变
我已尝试创建一个示例应用程序模块并尝试将其作为该应用程序的测试用例运行,以防独立应用程序没有在模拟器/设备上获得正确的资源(我已在两者)
我已尝试增加数据库的
VERSION编号我尝试切换到
ActivityTestCase并使用getActivity().getApplicationContext()。这基本上失败,并出现一个错误,表明此上下文不完整,无法设置 SQLite
如您所见,我整晚都在努力推动这块巨石,但此时它似乎是西西弗斯,除了使用与 Sugar 不同的 ORM(它不会'似乎不是问题)。没有什么比不能在测试用例中运行 SQLite 更令人沮丧的了,我向你神圣的程序员意识求助:-'(
【问题讨论】:
-
您使用的是哪个版本的 Android Studio?可能与following issue有关
-
@EdGeorge 看起来非常不错!
-
那我把它添加为答案:)
-
@EdGeorge 然而,我在 Gradle 1.5.0 上 :( 虽然是的,但它肯定可能对某人有所帮助 - 会关注这个问题,如果这解决了它,它将切换为接受的答案!
标签: android sqlite android-sqlite android-testing sugarorm