我现在有一个应用程序,它使用多个实体将数据存储在Room数据库中。我需要的是获取表的内容,将数据转换为CSV格式,然后通过电子邮件发送该格式。我按下了最后一部分,因为它只涉及通过ACTION_SEND
的意图发送文件。这很容易。
据我所知,我可以获取实际数据库的路径并操作该文件。然而,Room的设计师们竭尽全力将SQLite放入黑盒子中,这似乎是一个坏主意。
我知道我也可以在其中一个DAO中编写查询方法,该方法返回CSV格式的字符串,然后可以将其转换为File对象。然而,这是很多工作,如果其他人为我这样做,我不会浪费我的时间。
所以,这是我的问题:如何将Room数据库表导出为CSV格式的字符串?如果有多种方法可以做到这一点,是否有首选方式?
奖金问题:有没有备份整个数据库的首选方法?
答案 0 :(得分:3)
据我所知,我可以获取实际数据库的路径并操作该文件。然而,谷歌已经花了很多时间来掩盖SQLite的细节,这似乎是一个坏主意。
Google提供getOpenHelper()
on your RoomDatabase
,如果您有理由希望更直接地使用数据库(例如,执行不在DAO中的任意SQL)。
我知道我也可以在其中一个DAO中编写查询方法,该方法返回CSV格式的字符串,然后可以将其转换为File对象
恕我直言,创建一个CSV文件不是DAO的责任,不仅仅是填充小部件是DAO的责任。
如何将Room数据库表导出为CSV格式的字符串?
创建某种Report
类,可以查询DAO,生成CSV并将其写入所需位置。
或者,找到一些可以使用Cursor
并从中生成CSV的现有代码。使用getOpenHelper()
获取SupportSQLiteDatabase
,您可以使用所需的SQL query()
生成Cursor
。
是否有备份整个数据库的首选方法?
恕我直言,close()
RoomDatabase
,然后复制文件(using getDatabasePath()
和Java文件I / O)。
答案 1 :(得分:2)
执行以下步骤非常简单:
来源:https://medium.com/@mattyskala/browse-sqlite-database-in-android-studio-4fbba6cca105
答案 2 :(得分:1)
使用kotlin-csv库将Room DB表导出到 Kotlin 中的CSV文件真的很容易。
仅获取数据库表对象的列表:
@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))
}
}
我解释了整个流程here。