【问题标题】:How does one export a Room table to a CSV format?如何将 Room 表导出为 CSV 格式?
【发布时间】:2018-08-14 11:05:48
【问题描述】:

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

我知道我可以获得实际数据库的路径并操作该文件。然而,Room 的设计者不遗余力地将 SQLite 放入一个黑盒子,这似乎是个坏主意。

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

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

额外问题:是否有任何首选方法来备份整个数据库?

【问题讨论】:

标签: android csv android-room


【解决方案1】:

我知道我可以获得实际数据库的路径并操作该文件。但是,Google 竭尽全力掩盖 SQLite 细节,这似乎是个坏主意。

如果您有理由想要更直接地使用数据库(例如,执行不在您的 DAO 中的任意 SQL),Google 会提供 getOpenHelper() on your RoomDatabase

我知道我还可以在其中一个 DAO 中编写一个查询方法,该方法返回一个 CSV 格式的字符串,然后可以将其转换为 File 对象

恕我直言,创建 CSV 文件不是 DAO 的责任,就像填充小部件不是 DAO 的责任一样。

如何将 Room 数据库表导出为 CSV 格式的字符串?

创建某种Report 类,它可以查询 DAO、生成 CSV 并将其写入您想要的位置。

或者,找到一些现有的代码,可以采用 Cursor 并从中生成 CSV。使用getOpenHelper()获取SupportSQLiteDatabase,您可以在query()上使用您想要的SQL生成Cursor

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

恕我直言,close()RoomDatabase,然后复制文件(using getDatabasePath() 和 Java 文件 I/O)。

【讨论】:

  • 至于你的最后一句话:我将如何导入我获得的文件?
  • @Patrick:逆向过程:将文件从备份所在的位置复制回getDatabasePath() 指示的位置。
【解决方案2】:

Kotlin 中使用 kotlin-csv 库将 Room DB 表导出为 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

【讨论】:

    【解决方案3】:

    按照以下步骤操作真的很容易:

    1. 在 Android Studio 上,转到 查看 - 工具 - 设备文件资源管理器
    2. 导航到 /data/data//databases/ 并导出文件。
    3. 下载http://sqlitebrowser.org
    4. 在 SQLite 浏览器上打开 de DB,点击 Browse Data,选择表。
    5. 转到文件 - 导出 - 将表导出为 CSV 文件...

    来源:https://medium.com/@mattyskala/browse-sqlite-database-in-android-studio-4fbba6cca105

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2011-03-06
      • 2019-05-29
      • 1970-01-01
      • 2020-04-20
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多