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

文章目录

    首先需要 在 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 中文入门教程

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式