Android - Комната заранее заполнена базой сомнений - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно предварительно заполнить базу данных Room при первом запуске, и я увидел, что Флорина Мунтенеску суть в этом.

https://gist.github.com/florina-muntenescu/697e543652b03d3d2a06703f5d6b44b5#pre-populate-a-room-database

Итак, у нас есть ...

   @Database(entities = arrayOf(Data::class), version = 1)
   abstract class DataDatabase : RoomDatabase() {

   abstract fun dataDao(): DataDao

  companion object {

    @Volatile private var INSTANCE: DataDatabase? = null

    fun getInstance(context: Context): DataDatabase =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
            }

    private fun buildDatabase(context: Context) =
            Room.databaseBuilder(context.applicationContext,
                    DataDatabase::class.java, "Sample.db")
                    // prepopulate the database after onCreate was called
                    .addCallback(object : Callback() {
                        override fun onCreate(db: SupportSQLiteDatabase) {
                            super.onCreate(db)
                            // insert the data on the IO Thread
                            ioThread {
                                getInstance(context).dataDao().insertData(PREPOPULATE_DATA)
                            }
                        }
                    })
                    .build()

    val PREPOPULATE_DATA = listOf(Data("1", "val"), Data("2", "val 2"))
  }

Но я не понимаю, где мне вызывать этот метод getInstance, нужно ли мне сделать какой-нибудь фиктивный вызов DAO (просто для заполнения БД) в моих фрагментах, MainActivity или где-то еще?(Допустим, я планирую использовать MVVM в этом проекте).

Или, может быть, я просто устал и слеп, чтобы увидеть решение ...

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Для меня, есть 5 шагов в создании создания и доступа к базе данных с ROOM.

1) Установочный объект - это ваше имя объекта (каждая запись в базе данных).


    @Entity(tableName = "my_table")
    public class MyEntity {
         @PrimaryKey(autoGenerate = true)
         private int mId;

         private String mFirstName;
         private String mLastName;
         public MyEntity(String firstName, String lastName) {
             this.mFirstName = firstName;
             this.mLastName = lastName;
         }
        public int getId() {
            return mId;
        }

        public String getFirstName() {
            return mFirstName;
        }

        public String getLastName() {
            return mLastName;
        }

        public void setId(int mId) {
            this.mId = mId;
        }
    }

2) Настроить DAO, DAO - это способ взаимодействия с базами данных.

@Dao
public interface MyDao {
    @Query("SELECT * FROM my_table")
    LiveData<List<MyEntity>> getAllNames();

    @Inster
     void insert(MyEntity name);

3) Настройка базы данных

@DataBase(entities = {MyEntity.class}, version 1, exportschema = false}
public abastract class MyDatabase extends RoomDatabase {
    private static MyDatabase INSTANCE;
    public MyDao mMyDao;

    public static synchronized MyDatabase getInstance(Context context) {
        if(INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                MyDatabase.class "database_name")
                .fallbackToDestructiveMigration()
                .addCallback(roomCallBack)
                .build();
        }
        return INSTANCE;

    private static RoomDatabase.Callback roomCallBack = new RoomDatabase.Callback() {
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            new PopulateDbAsyncTask(INSTANCE).execute();
        }
    };
}

private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {
        private MyDao mMyDao;

        public PopulateDbAsyncTask(MyDatabase db) {
            this.mMyDao = db.MyDao();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            mMyDao.insert(new MyEntity("FirstName", "LastName")
            // Repeat as many times as needed.
            return null;
        }
    }

4) Настройка репозитория, вызов репозитория / Создание базы данных

public class MyRepository {

    private MyDao mMyDao;
    private LiveData<List<MyEntity>> mMyList;

    // Constructor will call the database Class.
    public MyRepository(Application application) {
        MyDatabase db = MyDatabase.getInstance(application);
        this.mMyDao = db.mMyDao;
        mMyList = mMyDao.getAllNames();
    }

    public LiveData<List<MyEntity> getAllNames() {
        return mMyList;
    }
}

5) Настройка View Model, доступ к вашей ViewModel издеятельность или фрагмент.

public class MyViewModel extends ViewModel {
    private LiveData<List<MyEntity>> mMyList;
    private Repository mRepository;    

    public MyViewModel(Application application) {
        this.mApplication = application;
        mRepository = new Repository(application);
        this.mMyList = mRepository.getAllNames;
    }

    public LiveData<List<MyEntity>> getAllNames() {
        return mMyList = mRepository.getAllNames();
    }
0 голосов
/ 24 сентября 2019

Я не уверен на 100%, что понимаю вашу конечную цель;однако, когда я пишу приложения, использующие базу данных SQLite, мне нравится иметь некоторую фиктивную информацию, которую я могу немедленно добавить в базу данных, чтобы я мог видеть, как все мои различные действия будут отвечать на запросы и тому подобное.

Вкл.На моем главном экране я обычно помещаю кнопку с надписью «Добавить фиктивные данные».OnClick, он вызывает функцию addDummyData () из моего класса SQLHelper, чтобы написать примерно 20 операторов вставки.Как только мое приложение будет запущено и запущено так, как я хочу, я удалю кнопку перед его распространением.

Если вы добавите операторы вставки, которые будут вызываться автоматически (т.е. без какого-либо вмешательства пользователя нажатием кнопки,выбрав пункт меню и т. д.), вы рискуете добавить в приложение те же 20 строк вставки при каждом запуске приложения.Ваша база данных будет перегружена множеством дубликатов довольно быстро.Вам необходимо добавить оператор if {}, который сначала проверяет, существуют ли данные в базе данных (например, выполнить запрос с курсором возврата для одного из фиктивных значений и, если счетчик курсоров равен нулю, затем продолжитьс заполнением базы данных, или нет).

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