首先需要 在 Android 中配置好 SQLDelight 及数据库初始化,然后就可以测试写入数据了。
.sq
在 SQLDelight 的 sq 文件中补充用于插入的 SQL 语句:
- 一个用于插入
- 一个用于保存
save:
INSERT OR REPLACE INTO items VALUES ?;
insert:
INSERT INTO items(name, num, notes)
VALUES (?, ?, ?);
这里有个不好的习惯,就是表名用了复数,会导致生成的 kotlin data class 类名也是复数形式,影响代码可读性。 为了兼容旧版本的 app,所以没有改正。
MainActivity.kt
为了简化程序,没有使用 hilt 做依赖注入,而是直接在 MainActivity 中定义一个 database 共享给其他 fragment 使用。
private val driver: SqlDriver = AndroidSqliteDriver(Database.Schema, this, "item_database.db")
val database = Database(driver)
EditFragment.kt
从父级 activity 中获取 database,执行插入操作。
binding.btnSave.setOnClickListener {
view?.let { it1 ->
lifecycleScope.launch(Dispatchers.IO) {
(activity as MainActivity).database.itemQueries.insert(
binding.name.text.toString(),
binding.number.text.toString().toLong(),
binding.notes.text.toString()
)
}
Snackbar.make(it1, "Saved", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
}
注意:为了防止写入数据库操作阻塞 UI 线程,所以在 coroutine 中执行 insert 语句。
- Dispatchers.IO: 非主线程开启一个 coroutine, 适合写入数据库这种磁盘操作,及网络 IO 操作。 详细参考:Dispatchers.IO 与 Dispatchers.Main, Dispatchers.Default 的区别
- lifecycleScope 提供了一个协程范围,该范围受到与组件生命周期相关的限制。例如,当Activity或Fragment被销毁时,此作用域也会自动清除。详细参考:lifecycleScope 与 viewModelScope, CoroutineScope 的区别
ChatGPT 的辅助
自从看了 Github CEO 现场用 AI 辅助写代码之后,我感觉确实大部分场景可以脱离搜索引擎,直接改用 ChatGPT 来辅助生成代码,真是又快又准确。StackOverflow 大裁员是必然的。
提问:
android fragment 中获取父级 activity 中的一个属性,使用 kotlin 一行代码实现
下面是 AI 的答复:
val someProperty = (activity as? YourActivity)?.someProperty
在上面的代码中,我们使用了安全类型转换 as?
来将 activity
转换为 YourActivity
类型,如果转换成功,则返回该 Activity 对象,否则返回 null。然后我们使用 Elvis 操作符 ?.
来访问该 Activity 对象中的属性,如果对象为 null,则整个表达式结果为 null。这种方式可以使代码更简洁,但需要注意避免出现空指针异常。
探索更多关于 SQLDelight
📖 Android Room 替代品 SQLDelight 中文入门教程
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式