Как сохранить данные в базе данных комнаты после выборки с сервера с помощью модернизации - PullRequest
1 голос
/ 13 октября 2019

Я создаю логин для своего приложения и хотел бы сохранить данные пользователя, полученные с сервера. Я использую mvvm. Как сохранить данные, которые я получаю, в свою комнатуdb?

Вот мой ответ от сервера

{
        "isSuccessful": true,
        "message": "successful",
        "user": [
            {
                "name": "Raymond Jezz",
                "email": "rayjezz@gmail.com",
                "phone": "254XXXXXXX"
            }
        ]
}

моя пользовательская модель

data class User(
    val name: String,
    val email:String,
    val phone:String
)

модель ответа при входе

data class LoginResponse(
        val isSuccessful:Boolean,
        val message: String,
        val user: List<User>
)

Сущность комнаты

@Entity(tableName = "user_table")
        data class UserRoom(val name:String, val email:String, val phone:String) {
            @PrimaryKey(autoGenerate = true)
            var id: Int = 0
}

Класс Дао

@Dao
    interface UserDao {
        @Insert
        fun insert(userRoom: UserRoom)

        @Query("SELECT * FROM user_table")
        fun getUserDetails(): LiveData<List<UserRoom>>
}

База данных комнаты

@Database(entities = [UserRoom::class], version = 1)
        abstract class UserDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao



        companion object {
            private var instance: UserDatabase? = null
            fun getInstance( context: Context): UserDatabase? {
                if (instance == null) {
                    synchronized(UserDatabase::class.java) {
                        instance = Room.databaseBuilder(context.applicationContext, UserDatabase::class.java, "users_database")
                            .fallbackToDestructiveMigration()
                            .build()
                    }
                }
                return instance
            }
        }
}

Класс репозитория

class UserRepository(application: Application) {

        private lateinit var userDao: UserDao

        private var userDetails: LiveData<List<UserRoom>>

        init {
            val database: UserDatabase? = UserDatabase.getInstance(application)
            if (database != null) {
                userDao = database.userDao()
            }
            userDetails = userDao.getUserDetails()
        }

        fun insert(userRoom: UserRoom){
            val insertUserAsyncTask = InsertUserAsyncTask(userDao).execute(userRoom)
        }

        fun getUserDetails():LiveData<List<UserRoom>>{
            return userDetails
        }

        private class InsertUserAsyncTask(userDao: UserDao) : AsyncTask<UserRoom, Unit, Unit>() {
            val userDao = userDao

            override fun doInBackground(vararg p0: UserRoom?) {
                userDao.insert(p0[0]!!)
            }
        }

    }

Посмотреть модель класса

class LoginViewModel : ViewModel() {

        fun userLogin(email: String, password: String): LiveData<String> {
            val loginResponse = MutableLiveData<String>()

            RetrofitClient.makeRetrofitApi().userLogin(email, password)
                .enqueue(object : Callback<LoginResponse> {
                    override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                        loginResponse.value = t.message
                    }

                    override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
                        if (response.isSuccessful){
                            loginResponse.value = response.body()?.message.toString()

                        }else{
                            loginResponse.value = response.body()?.message.toString()
                        }
                    }

                })
            return loginResponse
        }
}

1 Ответ

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

Во-первых, в вашем UserDao создайте функцию insertAll().

@Insert(onConflict = OnConflictStrategy.REPLACE) 
fun insertAllUsers(userRoomList : List<UserRoom>);

Затем вы должны написать соответствующий класс AsyncTask для вставки списка пользователей в базу данных.

class LoginViewModel : ViewModel() {
    fun userLogin(email: String, password: String): LiveData<String> {
    val loginResponse = MutableLiveData<String>()

    RetrofitClient.makeRetrofitApi().userLogin(email, password).enqueue(object : Callback<LoginResponse> {

        override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
            loginResponse.value = t.message
        }

        override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
            if (response.isSuccessful) {
                loginResponse.value = response.body()?.message.toString()

                // create a List of User and get it by response.body().getUserList()

                //iterate over this list and create another list of UserRoom class

                //insert it into the database using the Repository class.

            } else
                loginResponse.value = response.body()?.message.toString()
        }

    });
    return loginResponse
    }   
}
...