База данных предпосевной комнаты не работает, но база данных создана в Kotlin - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь предварительно заполнить мою базу данных в Kotlin, используя Room Database. Это не дает мне никакой ошибки, когда я собираю и запускаю его, и база данных создается, но она не заполнена. Пожалуйста, смотрите мой код ниже:

FareMatrix.kt

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "fare_matrix")
data class FareMatrix(
    @PrimaryKey
    var id: Int = 0,
    val entry_plaza: Int? = null,
    val exit_plaza: Int? = null,
    val classification: Int? = null,
    val amt_total: Int? = null,
    val vat: Double? = null,
    val payment_mode: Int? = null
)

fareMatrixDao

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface FareMatrixDao {
    @Insert
    fun addFareMatrix(fareMatrix: List<FareMatrix>)
}

FareMatrixDatabase

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase

@Database(
    entities = [FareMatrix::class],
    version = 9
)
abstract class LcsDatabase: RoomDatabase() {

    abstract fun getFareMatrixDao(): FareMatrixDao

    companion object {
        @Volatile private var instance: LcsDatabase? = null
        private val lock = Any()

        operator fun invoke(context: Context) = instance ?: synchronized(lock){
            instance ?: buildDatabase(context).also {
                instance = it
            }
        }

        private fun buildDatabase(context: Context) = Room.databaseBuilder(
            context.applicationContext,
            LcsDatabase::class.java,
            "lcsdatabase.db"
        ).fallbackToDestructiveMigration()
            .addCallback(object: Callback() {
                override fun onCreate(db: SupportSQLiteDatabase) {
                    super.onCreate(db)

                    Thread(Runnable {
                        seeDatabase(context)
                        println("END")
                    }).start()
                }
            })
            .build()

        fun seeDatabase(context: Context) {
            val POPULATED_FAREMATRIX_DATA = listOf<FareMatrix>(
                FareMatrix(1,800,803,1,30,3.21,1),
                FareMatrix(2,800,803,2,75,8.04,1),
                FareMatrix(3,800,803,3,90,9.64,1),
                FareMatrix(4,800,805,1,58,6.21,1),
                FareMatrix(5,800,805,2,145,15.54,1)
            )
            val db = invoke(context)
            var fmDao = db.getFareMatrixDao()
            fmDao.addFareMatrix(POPULATED_FAREMATRIX_DATA)
        }
    }
}

Я даже пытался использовать этот способ:

fun seeDatabase(context: Context) {
            val POPULATED_FAREMATRIX_DATA = listOf<FareMatrix>(
                FareMatrix(1,800,803,1,30,3.21,1),
                FareMatrix(2,800,803,2,75,8.04,1),
                FareMatrix(3,800,803,3,90,9.64,1),
                FareMatrix(4,800,805,1,58,6.21,1),
                FareMatrix(5,800,805,2,145,15.54,1)
            )
            val db = invoke(context)
            var fmDao = db.getFareMatrixDao()
            for (i in POPULATED_FAREMATRIX_DATA) {
                fmDao.addFareMatrix(FareMatrix(i.id, i.entry_plaza, i.exit_plaza, i.classification, i.amt_total, i.vat, i.payment_mode))
            }
        }

DAO

 @Insert
    fun addFareMatrix(fareMatrix: FareMatrix)

Я действительно не могу получить это на работу. Мне нужна ваша помощь, пожалуйста. Спасибо.

1 Ответ

2 голосов
/ 24 марта 2020

Может быть, вы можете попробовать с kotlin сопрограммы. Ваш код пока хорош, но, возможно, что-то плохо отформатировано во время исследования данных. Поэтому я предлагаю вам использовать kotlinx.coroutines и сделать это, в конце метода invoke вы можете просто использовать что-то вроде

   operator fun invoke(context: Context) = instance ?: synchronized(LOCK) {
      instance ?: buildDatabase(context).also {
            instance = it

      GlobalScope.launch {
            val POPULATED_FAREMATRIX_DATA = listOf<FareMatrix>(
            FareMatrix(1,800,803,1,30,3.21,1),
            FareMatrix(2,800,803,2,75,8.04,1),
            FareMatrix(3,800,803,3,90,9.64,1),
            FareMatrix(4,800,805,1,58,6.21,1),
            FareMatrix(5,800,805,2,145,15.54,1)
        )
           POPULATED_FAREMATRIX_DATA.forEach { something -> it.getFareMatrixDao().addFareMatrix(something) }
     }
 }}

Это должно работать как шарм. Все остальное выглядит хорошо.

Редактировать: и ваш метод построения базы данных должен заканчиваться на .fallbackToDestructiveMigration (). Build (). Вам не нужно ничего добавлять

...