Предварительное заполнение комнаты из ресурсов не работает - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь отправить приложение с предварительно заполненной базой данных. Для этого я использую комнату. Как говорится в документации, для этой задачи я использую Room.databaseBuilder (). CreateFromAsset, но, похоже, он не работает. Шаги, которые я сделал для копирования базы данных:

  • создать активы / базы данных в моем / app / src / main / assets
  • поместить туда мой файл sqlite.db
  • выполнить задачу.

Здесь вы найдете мою базу данных приложений:

@Database(entities = {MenuItem.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase
{
    public static AppDatabase INSTANCE;

    public abstract MenuItemDao menuItemDao();

    /**
     * Create an instance if not existent or return the existing one.
     *
     * @param context application context.
     * @return instance of this class.
     */
    public static AppDatabase getAppDatabase(Context context)
    {
        if (INSTANCE == null)
        {
            INSTANCE = Room
                .databaseBuilder(context, AppDatabase.class, "sqlite.db")
                .createFromAsset("databases/sqlite.db")
                .build();
        }
        return INSTANCE;
    }


    /**
     * Destroy instance.
     */
    public static void destroyInstance()
    {
        INSTANCE = null;
    }
}

Это класс DAO:

@Dao
public interface MenuItemDao
{
    @Query("SELECT * FROM menuItem WHERE parentId = (:parentId)")
    List<MenuItem> getMenuItems(long parentId);

    @Query("SELECT * FROM MenuItem WHERE id = (:id)")
    MenuItem getSelectedItem(long id);

    @Query("SELECT * FROM menuItem")
    List<MenuItem> getAll();
}

И это сам элемент:

@Entity
public class MenuItem
{
    @PrimaryKey
    public long id;

    @ColumnInfo(name = "title")
    public String title;

    @ColumnInfo(name = "isActivity")
    public boolean isActivity;

    @ColumnInfo(name = "parentId")
    public long parentId;
}

Таким образом я получаю экземпляр AppDatabase:

AppDatabase db = AppDatabase.getAppDatabase(getApplicationContext());

Вот схема SQL:

-- TABLE
CREATE TABLE menu (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, isActivity INTEGER, parentId INTEGER);
CREATE TABLE sqlite_sequence(name,seq);
 
-- INDEX
 
-- TRIGGER
 
-- VIEW
 

В базе данных есть некоторые элементы я уже протестировал, импортировав базу данных в браузер sqlite и проверив, присутствует ли контент. Это. Но после запуска приложения внутри нет строк. Есть идеи, что я делаю неправильно? Есть множество людей, которые утверждают, что эта функция комнаты работает нормально, так что я думаю, что делаю что-то не так.

1 Ответ

0 голосов
/ 07 августа 2020

Хорошо, я нашел решение. Проблема заключается в моем автоинкременте первичного ключа. Идентификатор в классе сущности должен быть изменен с:

@PrimaryKey
public long id;

на:

@PrimaryKey(autoGenerate = true)
public long id;

, потому что в комнате автоинкремент ложный, и это вызвало конфликт в схеме базы данных.

...