sqlite 数据库预填充未插入

yhived7q  于 2023-06-30  发布在  SQLite
关注(0)|答案(1)|浏览(166)

在使用JSONArray进行数据库预填充时,创建了表,但未插入数据。数据库创建(taskDao()不在伴随对象上):

abstract fun taskDao(): TaskDao

@Volatile
private var INSTANCE: TaskDatabase? = null

fun getInstance(context: Context): TaskDatabase {
    return INSTANCE ?: synchronized(this) {
        val instance = Room.databaseBuilder(
            context.applicationContext,
            TaskDatabase::class.java,
            "task.db"
        ).addCallback(object : Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)
                val dao = getInstance(context.applicationContext).taskDao()
                fillWithStartingData(context.applicationContext, dao)
            }
        }).build()
        INSTANCE = instance
        instance
    }
}

道:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(vararg tasks: Task)

填充函数(执行Dao):

private fun fillWithStartingData(context: Context, dao: TaskDao) {
    val task = loadJsonArray(context)
    try {
        if (task != null) {
            for (i in 0 until task.length()) {
                val item = task.getJSONObject(i)
                dao.insertAll(
                    Task(
                        item.getInt("id"),
                        item.getString("title"),
                        item.getString("description"),
                        item.getLong("dueDate"),
                        item.getBoolean("completed")
                    )
                )

                Log.d("Test", dao.getNearestActiveTask().toString())
            }
        }
    } catch (exception: JSONException) {
        exception.printStackTrace()
    }
}

JSON到JSONArray函数:

private fun loadJsonArray(context: Context): JSONArray? {
    val builder = StringBuilder()
    val `in` = context.resources.openRawResource(R.raw.task)
    val reader = BufferedReader(InputStreamReader(`in`))
    var line: String?
    try {
        while (reader.readLine().also { line = it } != null) {
            builder.append(line)
        }
        val json = JSONObject(builder.toString())
        return json.getJSONArray("tasks")
    } catch (exception: IOException) {
        exception.printStackTrace()
    } catch (exception: JSONException) {
        exception.printStackTrace()
    }
    return null
}

JSON:

{
  "tasks": [
    {
      "id": 1,
      "title": "Belajar AAD",
      "description": "Belajar dasar-dasar materi di kelas Dicoding",
      "dueDate": 1577811600000,
      "completed": false
    },
    {
      "id": 2,
      "title": "Simulasi Ujian AAD",
      "description": "Mencoba mengerjakan project latihan AAD",
      "dueDate": 1655226000000,
      "completed": true
    },
    {
      "id": 3,
      "title": "Ambil Ujian AAD",
      "description": "Saatnya menjadi Associate Android Developer!",
      "dueDate": 1735578000000,
      "completed": false
    }
  ]
}

将上下文更改为context.applicationContext会得到相同的结果。

pieyvz9o

pieyvz9o1#

没关系,我通过像这样更改我的onCreate函数来解决它

fun getInstance(context: Context): TaskDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    TaskDatabase::class.java,
                    "task.db"
                ).fallbackToDestructiveMigration().addCallback(object : Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        super.onCreate(db)
                        Executors.newSingleThreadExecutor().execute {
                            INSTANCE?.let {
                                CoroutineScope(Dispatchers.IO).launch {
                                    fillWithStartingData(context, it.taskDao())
                                }
                            }
                        }
                    }
                }).build()
                INSTANCE = instance
                instance
            }
        }

相关问题