如何将 Room 表格导出为 CSV 格式?

5
我现在有一个应用程序,使用多个实体在Room数据库中存储数据。我需要做的是将表格内容转换为CSV格式,然后通过电子邮件发送该格式。 我已经完成了最后一部分,因为它只涉及通过ACTION_SEND意图发送文件。这很容易。
我知道我可以获取实际数据库的路径并操作该文件。但是,Room的设计者们非常努力地将SQLite放入黑匣子中,这似乎不是个好主意。
我知道我也可以在DAO之一中编写查询方法,返回CSV格式的字符串,然后将其转换为File对象。然而,那是很多工作,如果有人已经为我做过了,我就不会浪费时间了。
所以,我的问题是:如何将Room数据库表导出为CSV格式的字符串?如果有多种方法,请问是否有首选方法?
额外的问题:是否有任何首选方法来备份整个数据库?

这个回答解决了你的问题吗?在Android中将Room数据库导出为csv文件 - Michele Dorigatti
3个回答

9
我知道我可以获取实际数据库路径并操作该文件。但Google已经采取了许多措施来隐藏SQLite的细节,因此这似乎是一个不好的主意。
如果您有理由想要更直接地使用数据库(例如执行不在DAO中的任意SQL),Google在您的RoomDatabase上提供了getOpenHelper()
我知道我也可以在DAO中编写查询方法,返回CSV格式的字符串,然后将其转换为File对象。
在我看来,创建CSV文件不是DAO的责任,就像填充小部件不是DAO的责任一样。
如何将Room数据库表导出为CSV格式的字符串?
创建某种Report类,该类可以查询DAO,生成CSV并将其写入所需位置。

或者,找到一些现有的代码,可以使用 Cursor 并从中生成 CSV。使用 getOpenHelper() 获取 SupportSQLiteDatabase,你可以使用所需的 SQL 进行 query() 以生成 Cursor

是否有任何首选的方法来备份整个数据库?

在我看来,close() RoomDatabase,然后复制文件(使用 getDatabasePath() 和 Java 文件 I/O)。


关于你最后的陈述:我该如何导入我获取的文件? - Patrick
2
@Patrick:反向操作:将文件从备份位置复制回到getDatabasePath()指定的位置。 - CommonsWare

3

2

使用kotlin-csv库,使用Kotlin导出Room DB表格到CSV文件非常简单。

只需获取DB表格对象列表:

@Dao
interface DirectorDao {
    @get:Query("SELECT * FROM director ORDER BY full_name ASC")
    val allDirectors: LiveData<List<Director>>
}

然后使用用户CSV写入器通过遍历所有列表项并逐个将列值添加到CSV行中来将其写入文件,如下所示:

csvWriter().open(csvFile) {
    // Header
    writeRow(listOf("[id]", "[name]", "[age]"))

    directorDao.allDirectors.value.forEachIndexed { index, director ->
        writeRow(listOf(index, director.fullName, director.age))
    }
}

我在这里解释了整个流程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接