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

时间:2018-03-06 14:39:25

标签: android csv android-room

我现在有一个应用程序,它使用多个实体将数据存储在Room数据库中。我需要的是获取表的内容,将数据转换为CSV格式,然后通过电子邮件发送该格式。我按下了最后一部分,因为它只涉及通过ACTION_SEND的意图发送文件。这很容易。

据我所知,我可以获取实际数据库的路径并操作该文件。然而,Room的设计师们竭尽全力将SQLite放入黑盒子中,这似乎是一个坏主意。

我知道我也可以在其中一个DAO中编写查询方法,该方法返回CSV格式的字符串,然后可以将其转换为File对象。然而,这是很多工作,如果其他人为我这样做,我不会浪费我的时间。

所以,这是我的问题:如何将Room数据库表导出为CSV格式的字符串?如果有多种方法可以做到这一点,是否有首选方式?

奖金问题:有没有备份整个数据库的首选方法?

3 个答案:

答案 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)

执行以下步骤非常简单:

  1. 在Android Studio上,转到视图-工具-设备文件资源管理器
  2. 导航到 / data / data / / databases / 并导出文件。
  3. 下载http://sqlitebrowser.org
  4. 在SQLite浏览器上打开数据库,单击“浏览数据”,选择表。
  5. 转到文件-导出-将表格导出为CSV文件...

来源: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