@Query("SELECT postId||','||content FROM postDataLocal")
fun getPostDataLocalCSV(): List<String>
@Query("SELECT groupPostIdMap||','||groupId||','||groupName FROM groupDataLocal")
fun getGroupDataLocalCSV(): List<String>
@Query("SELECT adminGroupIdMap||','||userId||','||adminName||','||avatar FROM adminDataLocal")
fun getAdminDataLocalCSV(): List<String>
以及以下函数,其中dao是之前示例化的AllDao示例:-
private fun createCSV() {
val sb = StringBuilder()
var afterFirst = false
sb.append("{POSTDATALOCAL}")
for (s in dao.getPostDataLocalCSV()) {
if(afterFirst) sb.append(",")
afterFirst = true
sb.append(s)
}
afterFirst = false
sb.append("{GROUPDATALOCAL}")
for (s in dao.getGroupDataLocalCSV()) {
if (afterFirst) sb.append(",")
afterFirst = true
sb.append(s)
}
afterFirst = false
sb.append("{ADMINDATALOCAL}")
for (s in dao.getAdminDataLocalCSV()) {
if ((afterFirst)) sb.append(",")
afterFirst = true
sb.append(s)
}
Log.d("CSV_DATA","CSV is :-\n\t$sb")
}
private fun getTableColumnNames(tableName: String, suppDB: SupportSQLiteDatabase): List<String> {
val rv = arrayListOf<String>()
val csr = suppDB.query("SELECT name FROM pragma_table_info('${tableName}')",null)
while (csr.moveToNext()) {
rv.add(csr.getString(0))
}
csr.close()
return rv.toList()
}
主要功能:
private fun AutoCreateCSV(): String {
val replaceCommaInData = "{COMMA}" /* commas in the data will be replaced by this */
val rv = StringBuilder()
val sql = StringBuilder()
var afterFirstTable = false
var afterFirstColumn = false
var afterFirstRow = false
val suppDb = db.getOpenHelper().writableDatabase
var currentTableName: String = ""
val csr = db.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE('sqlite_%') AND name NOT LIKE('room_%') AND name NOT LIKE('android_%')", null)
while (csr.moveToNext()) {
sql.clear()
sql.append("SELECT ")
currentTableName = csr.getString(0)
if (afterFirstTable) rv.append(",")
afterFirstTable = true
afterFirstColumn = false
rv.append("{$currentTableName},")
for (columnName in getTableColumnNames(currentTableName,suppDb)) {
if (afterFirstColumn) sql.append("||','||")
afterFirstColumn = true
sql.append("replace(`$columnName`,',','$replaceCommaInData')")
}
sql.append(" FROM `${currentTableName}`")
val csr2 = db.query(sql.toString(),null)
afterFirstRow = false
while (csr2.moveToNext()) {
if (afterFirstRow) rv.append(",")
afterFirstRow = true
rv.append(csr2.getString(0))
}
csr2.close()
}
csr.close()
return rv.toString()
}
2条答案
按热度按时间6ioyuze21#
不能只将数据库另存为CSV。但是,如果数据库已设置完全检查点,则它只是一个文件。如果未设置完全检查点,则它将是三个文件(除非已禁用预写式事件记录)。
数据库本身由多个部分组成,包括文件头(文件的前100个字节)和用于各个组件的数据块。这些数据块中的大部分依赖于模式(表),也有系统表
将所有数据保存为CSV将是复杂的(而且不必要,因为您可以只复制数据库文件)。
如果你想要的是应用数据的CSV格式,那么这将取决于表格。如果你是一个单一的表格,那么将数据提取为CSV格式将相对简单,但如果数据包含逗号,则可能会很复杂。
如果有多个表,则必须区分表的数据。
同样,如果只是保护数据,最简单的方法是复制文件。
然而,作为基于以下内容的示例:
具有3个表(系统表除外)的数据库
然后:
@Dao注解接口(即AllDao)中的以下内容:-
以及以下函数,其中
dao
是之前示例化的AllDao示例:-然后在一个活动中(其中dao已经示例化)执行以下操作:
然后,当数据库包含以下数据(通过应用程序检查提取)时:-
本地发布数据
组数据本地
管理数据本地
写入日志的结果(可以写入文件而不是日志)为:-
下面是一个自动化程度更高的版本,您不需要创建@Query注解函数,而是询问sqlite_master来提取表,并使用table_info杂注来确定列,从而构建相应的SQL。
因此,它应满足任何房间数据库。
它还允许用逗号指示符替换数据中的逗号,然后在处理CSV时可以替换逗号。
支持(次要/主要调用)功能为:
主要功能:
使用相同的数据,并且作为返回字符串的主函数,以下代码
Log.d("CSV_DATA2",AutoCreateCSV())
将产生:-并且如果数据包括逗号,例如Post001被改变为值
Post001, <<note the comma in the data>>
然后:
uelo1irk2#
从房间中获取所有数据作为列表并使用此库https://github.com/doyaaaaaken/kotlin-csv
效果很好,这是我的用法