Room DB Upgrade необходимо написать полный запрос вставки - PullRequest
2 голосов
/ 10 октября 2019

Привет! Я занимаюсь разработкой приложения для Android и использую комнатную БД, и я создал одну таблицу, и теперь я хочу добавить другую таблицу, мне нужно написать миграцию для этого, а в миграции мне нужно написать полные запросы SQL дляВ новой таблице предполагается, что у меня более 20 полей, насколько сложным будет запрос.

В SQLite нам нужно писать такие сложные запросы, которые иногда усложняют написание и поиск ошибок. Итак, резервная БД возобновилась, но теперь нам нужно сделать то же самое при переносе БД. Чем это тогда полезно?

Если мы используем SQLite, то если мы уже добавили одну таблицу, а теперь мы хотим добавить другую таблицу, тогда мы можем просто удалить приложение, и новые таблицы будут сгенерированы, но в комнатеБД, это не тот случай, когда я пытался сделать то же самое, но он все еще показывает мне, что вам нужно написать миграцию для новой таблицы. Таким образом, в этом случае при разработке будет много сценариев миграции, которые будет сложно поддерживать в будущем.

Чем это полезно, тогда мне нужно написать несколько запросов на создание при разработкеПриложение это очень простой поток в любом приложении.

Как только мы перейдем к производству, тогда имеет смысл написать миграцию для каждой таблицы, но не в режиме разработки.

Как room DB делает работу разработчика более легкой?

Ответы [ 3 ]

2 голосов
/ 10 октября 2019

У меня более 20 полей, насколько сложным будет запрос.

Это может быть очень просто, поскольку сущность определяет объект, например, ваши 20 столбцов, и получить 20 столбцов можнопросто как

@Query(SELECT * FROM thetable)
List<Thetable> getAll();

Вышеуказанное в интерфейсе с аннотацией @Dao и все, что вы делаете в коде - это извлекаете экземпляр из базы данных встроенной комнаты и затем используете метод getAll, который возвращаетСписок объектов Thetable. Каждая из которых содержит все переменные-члены, заполненные из базы данных.

например, вы можете иметь: -

  mMyTheTableDaoObject = mMyBuiltRoomDatabase.getAll();
  List<TheTable> myTheTableList = mMyTheTableDaoObject.getAll();
  for(TheTable t: myTheTableList) {
     int current???? = t.get????();
  }

При использовании стандартного / некоммерческого пространства вам придется что-то делать в соответствии с: -

SQLitedatabase db = whatever_you_need_to_do_to_get_an_SQLiteDatabase_instance;
Cursor c = db.query("theTable",null,null,null,null,null,null);
ArrayList<TheTable> myTheTableList  = new ArrayList();
while(c.moveToNext()) {
    currentTheTable = new TheTable();
    current.TheTable.setId = c.getLong(c.getColumnIndex("id");
    current.TheTable.setNextColumn1 = c.getString("next_column1");
    current.TheTable.setNextColumn2 = c.getString("next_column2");
    ........ another 17 similar lines of code
    currentTheTable.setNextColumn20 = c.getString("next_column20"); 
    myTheTableList.add(currentTheTable);
}
for(TheTable t: myTheTableList) {
   int current???? = t.get????();
}

Если мы используем SQLite, то если мы уже добавили одну таблицу, а теперь мы хотим добавить другую таблицу, то мы можем просто удалить приложение, и новые таблицы будут сгенерированы, но вЭто не тот случай, когда я пытался сделать то же самое, но он все еще показывает мне, что вам нужно написать миграцию для новой таблицы.

Как только мы перейдем к производству, то имеет смысл написать миграцию длякаждая таблица, но не в режиме разработки.

Вместо миграции просто удалите базу данных (удалите данные приложения или удалите приложение, база данных будет храниться в расположении по умолчанию (data / data / package_name /)базы данных)) и перезапустить без изменения версии. База данных будет создана в соответствии с новой схемой. Возможно, использование временного кода для соответствующей загрузки данных.

Как room DB делает работу разработчика более легкой?

Короче ROOM генерирует то, что называется стандартным кодом из относительно простогокод, например, @Query выше, пишет базовый код для извлечения данных и построения объектов (например, код, как указано выше).

1 голос
/ 10 октября 2019

Резкий ваш вопрос в некотором смысле действителен, но, как вы знаете, android поддерживает базу данных SQLite, а библиотеки, такие как room, greendao или даже собственный SQLiteOpenHelper, обрабатывают транзакцию с sqllite за сценой для разработчиков.

ВКроме того, все более ранние библиотеки должны поддерживать версии вашей базы данных и какие поля или таблицы были добавлены в вашу базу данных и записывать миграции для обновления версий базы данных.

Красота room вступает в игрув том, как легко они выполняли операции CRUD с базой данных SQLite и переносили данные в LiveData или Observable, а не в том, что вам не нужно писать миграцию.

1 голос
/ 10 октября 2019

Пожалуйста, проверьте официальный документ: https://developer.android.com/training/data-storage/room/migrating-db-versions

На самом деле Комната, используя SQLITE за сценой. Это предоставляет вам множество других объектов. В случае миграции вы должны написать полный код для создания таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...