Сахар 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 сахару так:

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)
    
  • Я попытался удалить всю конфигурацию сахара ORM из манифеста, как предложено много - это ничего не меняет

  • Я попытался создать образец модуля приложения и попытался запустить его в качестве тестового случая для этого приложения, если автономные приложения не получили правильные ресурсы на эмуляторе / устройстве (я тестировал на обоих)

  • Я попытался увеличить VERSION номер базы данных

  • Я попытался переключиться на ActivityTestCase и с помощью getActivity().getApplicationContext(). Это по существу терпит неудачу с ошибкой, которая предполагает что этот контекст является неполным, чтобы иметь возможность настроить SQLite

как вы можете видеть, я сильно толкал этот валун всю ночь, но на данный момент он кажется сизифовым, и у меня нет абсолютно никакого руководства для моей следующей попытки отладки, кроме как использовать другой ORM, чем сахар (что на самом деле не кажется проблемой). Нет ничего более кастрирующего, что невозможно запустить SQLite в тестовом случае, и я взываю к Святому сознанию программиста в вас помогите :-'(

3 ответов


эта проблема наблюдалась в Android Studio 2.X. x-beta версии (особенно 2.0.0-beta6) и имеет свою первопричину в функции "мгновенного запуска".

Я полагаю, что это может быть исправлено в ближайшее время, но для этого, чтобы работать в то же время, вы должны отключить функцию в следующем меню

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

очистка, а затем построение приложения должны решить эти проблемы.

вы можете увидеть соответствующий отчет об ошибке сахара здесь.


это должно окончательно решить эту проблему для всех людей, которые там борются, чтобы получить сахар ОРМ работать из коробки -используйте систему управления версиями SQL, чтобы вручную запустить создание SQL.

В приведенном выше случае, вот как вы делаете это:

1.) Измените версию DB Sugar ORM config на новый номер (скажем N) такой, что он больше текущей версии или изменить имя базы данных

2.) Создать файл ModuleName/src/main/assets/sugar_upgrades/<N>.sql с вашим SQL; показывая мой, Если это поможет:

ПАДЕНИЕ ТАБЛИЦЫ MESSAGE_REQUEST_ID_MODEL;

СОЗДАТЬ ТАБЛИЦУ MESSAGE_REQUEST_ID_MODEL (ID ЦЕЛОЧИСЛЕННЫЙ ПЕРВИЧНЫЙ КЛЮЧ AUTOINCREMENT, MESSAGE_REQUEST_ID CHAR (128));

Это заставит сахар запустить ваш SQL, чтобы создать таблицу для вас (хотя и вручную).

Дополнительная Информация

  • этот раздел руководства по сахару ORM является вдохновением это (хотя и хаки) исправить:http://satyan.github.io/sugar/migration.html
  • я прокомментировал имя пакета из Sugar config
  • сахар работает с контекстом приложения инструментирования. В базовом классе InstrumentationTestCase, просто SugarContext.init(getInstrumentation().getTargetContext()) как показано в исходном вопросе

вашей проблемой может быть создание класса...

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;
    }
}

пожалуйста, проверьте мой код.