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...
我已经尝试过的故障排除:
- 为测试包保留不同的清单以将
.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 配置 - 这没有任何改变
我已经尝试创建一个示例应用程序模块并尝试 运行将其作为该应用程序的测试用例,以防独立应用程序无法在emulator/device(我都测试过)
我试过增加数据库的 VERSION
数字
我试过切换到 ActivityTestCase
并使用 getActivity().getApplicationContext()
。这基本上失败了,错误表明此上下文不完整,无法设置 SQLite
如你所见,我整晚都在努力推这块巨石,但在这一点上,它似乎是 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。
我正在处理一个需要持久化简单模型的独立库项目。这是我的 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...
我已经尝试过的故障排除:
- 为测试包保留不同的清单以将
.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 配置 - 这没有任何改变
我已经尝试创建一个示例应用程序模块并尝试 运行将其作为该应用程序的测试用例,以防独立应用程序无法在emulator/device(我都测试过)
我试过增加数据库的
VERSION
数字我试过切换到
ActivityTestCase
并使用getActivity().getApplicationContext()
。这基本上失败了,错误表明此上下文不完整,无法设置 SQLite
如你所见,我整晚都在努力推这块巨石,但在这一点上,它似乎是 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。