有许多教程可用于将SQLite数据库导出到csv文件,但没有足够的东西可用于从会议室数据库导出。
使用sqlite导出引用Exporting SQLite Database to csv file in android手动解析行的每一列以留出空间。以下是我的代码:
@Dao
interface CategoryDao {
@Query("SELECT * FROM Category")
fun getAllCategory(): List<Category>
}
// Export csv logic
val categoryList = categoryDao.getAllCategory()
val csvWrite = CSVWriter(FileWriter(file))
for (item in categoryList) {
val arrStr = arrayOf<String>(item.categoryId, item.categoryName)
csvWrite.writeNext(arrStr)
}
是否还有其他方法可以导出csv。即使在房间里也不能实用地获取表的列名,因此无法为所有表动态创建通用逻辑。
答案 0 :(得分:1)
这可能是您正在搜索的答案。
链接:https://stackoverflow.com/a/49133574/9994604
还有一种手动方法。 导出数据库
链接:https://stackoverflow.com/a/6542214/9994604
在Sqlite浏览器中打开:https://sqlitebrowser.org(免费)
以CSV / JSON,SQL格式导出。
答案 1 :(得分:1)
尝试一下
从游标获取列数据
@Query("SELECT * FROM Category")
Cursor getAllCategory();
答案 2 :(得分:0)
我尝试了两种方法来遍历大型Room数据库:
1-获取Cursor
并对其进行迭代:
import android.database.Cursor
...
@Query("SELECT * FROM Category")
fun getAllCategory(): Cursor<Category>
...
val success = cursor.moveToFirst()
if (success) {
while (!cursor.isAfterLast) {
// Process items
cursor.moveToNext()
}
} else {
// Empty
}
cursor.close()
2-使用PagedList
一次获取pageSize项并进行处理。然后查询另一个页面并处理:
@Query("SELECT * FROM Category")
fun getAllCategory(): DataSource.Factory<Int, Category>
// Here i will return Flowable. You can return LiveData with 'LivePagedListBuilder'
fun getCategories(pageSize: Int): Flowable<PagedList<Category>> {
val config = PagedList.Config.Builder()
.setPageSize(pageSize)
.setPrefetchDistance(pageSize / 4)
.setEnablePlaceholders(true)
.setInitialLoadSizeHint(pageSize)
.build()
return RxPagedListBuilder(categoryDao.getAllCategory(), config)
.buildFlowable(BackpressureStrategy.BUFFER)
}
现在getCategories()
函数上方将在pagedList
或Flowable
内部返回LiveData
。由于我们已经设置了setEnablePlaceholders(true)
,因此pagedList.size
将显示整个大小,即使它不在内存中也是如此。因此,如果pageSize
为50,并且所有数据大小均为1000,则pagedList.size
将返回1000,但大多数将为null。要查询下一页并处理:
// Callback is triggered when next page is loaded
pagedList.addWeakCallback(pagedList.snapshot(), object : PagedList.Callback() {
override fun onChanged(position: Int, count: Int) {
for (index in position until (position + count)) {
if (index == (position + count - 1)) {
if (index < (pagedList.size - 1))
pagedList.loadAround(index + 1)
else{
// Last item is processed.
}
} else
processCurrentValue(index, pagedList[index]!!)
}
}
override fun onInserted(position: Int, count: Int) {
// You better not change database while iterating over it
}
override fun onRemoved(position: Int, count: Int) {
// You better not change database while iterating over it
}
})
// Start to iterate and query next page when item is null.
for (index in 0 until pagedList.size) {
if (pagedList[index] != null) {
processCurrentValue(index, pagedList[index]!!)
} else {
// Query next page
pagedList.loadAround(index)
break
}
}
结论:在PagedList
方法中,您可以一次获取数千行并进行处理,而在Cursor
方法中,则可以逐行进行迭代。当pageSize> 3000时,我发现PagedList
不稳定。有时它不会返回页面。所以我用了Cursor
。在Android 8手机上,两种方法都要遍历(处理)900k行大约需要5分钟。
答案 3 :(得分:0)
要将会议室数据库数据导出到mydb.sqlite
文件中并存储到外部存储中,请按照以下步骤操作。
fun exportDatabase(){
val sd = Environment.getExternalStorageDirectory()
// Get the Room database storage path using SupportSQLiteOpenHelper
AppDatabase.getDatabase(applicationContext)!!.openHelper.writableDatabase.path
if (sd.canWrite()) {
val currentDBPath = AppDatabase.getDatabase(applicationContext)!!.openHelper.writableDatabase.path
val backupDBPath = "mydb.sqlite" //you can modify the file type you need to export
val currentDB = File(currentDBPath)
val backupDB = File(sd, backupDBPath)
if (currentDB.exists()) {
try {
val src = FileInputStream(currentDB).channel
val dst = FileOutputStream(backupDB).channel
dst.transferFrom(src, 0, src.size())
src.close()
dst.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
}