在使用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
会得到相同的结果。
1条答案
按热度按时间pieyvz9o1#
没关系,我通过像这样更改我的onCreate函数来解决它