Android SQLDelight (二) 向本地 SQLite 数据库插入数据

更新日期: 2023-05-26 阅读次数: 777 字数: 520 分类: Android

首先需要 在 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 语句。

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 中文入门教程

tags: sqldelight

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式