android - 如何将大型 JSON 数据从服务器存储到 SQLTE Android?
问题描述
我有这个应用程序,我从服务器下载不同的表并将它们存储在 SQLITE 中。来自服务器的数据是查询列表,格式为“INSERT INTO XYZ(A,B,C) VALUES (X,Y,Z)”。以下是 am 中用于下载和存储表格的函数:
fun synchronizeWithServer(phone: String, tableName: String , dialogue : LoadingDialog) {
val activity = context as Activity
val url =
"http://OrderingSystem.svc/SyncDev?phid=$phone&table=$tableName"
val client = OkHttpClient()
val request = okhttp3.Request.Builder().url(url).build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show()
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
val listServer = ArrayList<String>()
val jsonData = response.body?.string()
val jasonArray = JSONArray(jsonData)
for (k in 0 until jasonArray.length()) {
listServer.add(jasonArray[k].toString())
}
activity.runOnUiThread {
when (tableName) {
"customer" -> {
val db = DbHelper(context)
for (item in listServer) {
db.addServerData(item)
}
db.close()
listServer.clear()
}
"items" -> {
val db = UtilityDB(context)
for (item in listServer) {
db.addServerData(item)
}
db.close()
listServer.clear()
}
"rates" -> {
val db = UtilityDB(context)
for (item in listServer) {
db.addServerData(item)
}
db.close()
listServer.clear()
}
"ledger" -> {
val db = Ledgers(context)
for (item in listServer ) {
db.addServerData(item)
}
db.close()
listServer.clear()
dialogue.stopLoading()
}
}
}
}
}
})
}
来自服务器的一些表非常大,就像分类帐表一样,当我尝试将其保存到 SQLITE 中时,我的应用程序被卡住了,然后一段时间后它崩溃了。如何将大数据存储到 SQLITE 中?任何帮助,将不胜感激。
解决方案
只需将所有数据库工作移出runOnUiThread
并仅在主线程 ( dialogue.stopLoading()
) 上运行 UI 工作:
fun synchronizeWithServer(phone: String, tableName: String , dialogue : LoadingDialog) {
val activity = context as Activity
val url =
"http://OrderingSystem.svc/SyncDev?phid=$phone&table=$tableName"
val client = OkHttpClient()
val request = okhttp3.Request.Builder().url(url).build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show()
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
val listServer = ArrayList<String>()
val jsonData = response.body?.string()
val jasonArray = JSONArray(jsonData)
for (k in 0 until jasonArray.length()) {
listServer.add(jasonArray[k].toString())
}
when (tableName) {
"customer" -> {
val db = DbHelper(context)
for (item in listServer) {
db.addServerData(item)
}
db.close()
listServer.clear()
}
"items" -> {
val db = UtilityDB(context)
for (item in listServer) {
db.addServerData(item)
}
db.close()
listServer.clear()
}
"rates" -> {
val db = UtilityDB(context)
for (item in listServer) {
db.addServerData(item)
}
db.close()
listServer.clear()
}
"ledger" -> {
val db = Ledgers(context)
for (item in listServer) {
db.addServerData(item)
}
db.close()
listServer.clear()
activity.runOnUiThread {
dialogue.stopLoading()
}
}
}
}
}
})
}
推荐阅读
- python - Scrapy - 在第一次请求后禁用 Selenium
- memory - UEFI 引导的内核:静态物理内存布局
- sql - 将 Postgres 查询结果合并到一张表中
- python - Conda 命令带有无效的语法错误
- windows - 如何使用 Windows 批处理脚本将 .txt 文件和文件夹压缩到单个 zip 文件中?
- c++ - 在非依赖名称场景中对模板基类进行名称查找
- php - 限制对文件的访问 - PDF.JS
- java - 在 IE 上测试时无法单击元素
- tableau-api - Tableau 按类别排名
- selenium - Selenium 在运行时在 ITestListener 上失败