Sugar ORM просто не создаст таблицы
Я работаю над проектом автономной библиотеки, который требует постоянной простой модели. Вот как выглядит мой 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...
Устранение неполадок, которые я уже предпринял:
- Сохранение другого манифеста для тестового пакета для передачи имени пакета
.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)
-
Я попытался удалить всю конфигурацию Sugar ORM из манифеста, как это было предложено многими - это ничего не меняет
-
Я попытался создать модуль Sample App и попытался запустить его в качестве тестового примера для этого приложения, в случае, если автономные приложения не получили нужные ресурсы на эмуляторе/устройстве (я тестировал на оба)
-
Я попытался увеличить число VERSION
для базы данных
-
Я попытался переключиться на ActivityTestCase
и использовать getActivity().getApplicationContext()
. Это по существу выходит из строя с ошибкой, которая предполагает, что этот Контекст неполный, чтобы иметь возможность настроить SQLite
Как вы можете видеть, я всю ночь надавил на этот валун, но на данный момент это похоже на Sisyphean, и у меня нет абсолютно никакой цели для моей следующей попытки отладки, кроме как использовать другую ORM, чем Sugar (что не делает Кажется, это проблема). Нет ничего более выхолощенного, что вы не сможете запустить SQLite в тестовом примере, и я взываю к вам в помощь Священному программисту: - '(
Ответы
Ответ 1
Это должно решительно решить эту проблему для всех людей, пытающихся заставить Sugar ORM работать из коробки. Используйте систему управления версиями SQL для ручного запуска создания SQL.
В приведенном выше примере использования, вот как вы это делаете:
1.) Измените версию конфигурации Sugar ORM config на новый номер (скажем 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 для создания таблицы для вас (хотя и вручную).
Дополнительные примечания
- Этот раздел руководства ORM Sugar является источником вдохновения для этого (хотя и хакерского) исправления: http://satyan.github.io/sugar/migration.html
- Я прокомментировал имя пакета из конфигурации Sugar
- Sugar работает с контекстом приложения инструментария. В базовом классе
InstrumentationTestCase
просто выполните SugarContext.init(getInstrumentation().getTargetContext())
, как показано в исходном вопросе
Ответ 2
Эта проблема наблюдается в версиях Android Studio 2.x.x-beta (в особенности 2.0.0-beta6) и имеет первопричину в функции "Instant Run".
Я предполагаю, что это может быть исправлено в ближайшее время, но для этого нужно работать в то же время, вы должны отключить эту функцию в следующем меню
File | Settings | Build, Execution, Deployment | Instant Run
Очистка, а затем создание приложения должно решить эти проблемы.
Вы можете увидеть соответствующий отчет об ошибке Sugar здесь.
Ответ 3
Ваша проблема может заключаться в создании класса...
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;
}
}
повторите проверку кода.