如何将大型 JSON 数据从服务器存储到 SQLITE Android?
Posted
技术标签:
【中文标题】如何将大型 JSON 数据从服务器存储到 SQLITE Android?【英文标题】:how to store Large JSON Data from Server to SQLTE Android? 【发布时间】:2021-07-11 05:30:42 【问题描述】:我有这个应用程序,我从服务器下载不同的表并将它们存储在 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 中?任何帮助将不胜感激。
【问题讨论】:
不要在主线程上对数据库做任何工作 【参考方案1】:只需将所有数据库工作移出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()
)
【讨论】:
以上是关于如何将大型 JSON 数据从服务器存储到 SQLITE Android?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 下载和解析大型 JSON 响应导致 CFData(存储)泄漏
将大型 json 字符串从 Javascript 发布到 Django