如何将大型JSON数据从服务器存储到SQLTE Android?
我有这个应用程序,我从服务器下载不同的表,并将它们存储在SQLITE中。来自服务器的数据是查询列表,其形式类似于“插入XYZ(A,B,C)值(X,Y,Z)”。以下是am中用于下载和存储表的功能:如何将大型JSON数据从服务器存储到SQLTE Android?,android,json,android-sqlite,okhttp,Android,Json,Android Sqlite,Okhttp,我有这个应用程序,我从服务器下载不同的表,并将它们存储在SQLITE中。来自服务器的数据是查询列表,其形式类似于“插入XYZ(A,B,C)值(X,Y,Z)”。以下是am中用于下载和存储表的功能: fun synchronizeWithServer(phone: String, tableName: String , dialogue : LoadingDialog) { val activity = context as Activity val url =
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()
}
}
}
}
}
})
}
fun synchronizeWithServer(电话:String,表名:String,对话:LoadingDialog){
val activity=作为活动的上下文
val url=
"http://OrderingSystem.svc/SyncDev?phid=$phone&table=$tableName“
val client=OkHttpClient()
val request=okhttp3.request.Builder().url(url.build())
client.newCall(请求).enqueue(对象:回调{
覆盖失效(调用:调用,e:IOException){
Toast.makeText(上下文,例如toString(),Toast.LENGTH\u SHORT.show())
}
覆盖fun onResponse(调用:调用,响应:响应){
if(response.issucessful){
val listServer=ArrayList()
val jsonData=response.body?.string()
val jasonArray=JSONArray(jsonData)
for(在jasonArray.length()之前,k为0){
添加(jasonArray[k].toString())
}
activity.runOnUiThread{
何时(表名){
“客户”->{
val db=DbHelper(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
}
“项目”->{
val db=实用数据库(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
}
“费率”->{
val db=实用数据库(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
}
“分类账”->{
val db=分类账(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
对话.停止加载()
}
}
}
}
}
})
}
来自服务器的一些表非常庞大,就像分类账表一样,当我试图将其保存到SQLITE时,我的应用程序被阻塞了,然后在某个时候它崩溃了。如何将这些大数据存储到SQLITE中?任何帮助都将不胜感激。只需将所有数据库工作移出
runOnUiThread
,并仅在主线程上运行UI工作(dialogue.stopLoading()
):
fun synchronizeWithServer(电话:String,表名:String,对话:LoadingDialog){
val activity=作为活动的上下文
val url=
"http://OrderingSystem.svc/SyncDev?phid=$phone&table=$tableName“
val client=OkHttpClient()
val request=okhttp3.request.Builder().url(url.build())
client.newCall(请求).enqueue(对象:回调{
覆盖失效(调用:调用,e:IOException){
Toast.makeText(上下文,例如toString(),Toast.LENGTH\u SHORT.show())
}
覆盖fun onResponse(调用:调用,响应:响应){
if(response.issucessful){
val listServer=ArrayList()
val jsonData=response.body?.string()
val jasonArray=JSONArray(jsonData)
for(在jasonArray.length()之前,k为0){
添加(jasonArray[k].toString())
}
何时(表名){
“客户”->{
val db=DbHelper(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
}
“项目”->{
val db=实用数据库(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
}
“费率”->{
val db=实用数据库(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
}
“分类账”->{
val db=分类账(上下文)
对于(listServer中的项目){
db.addServerData(项目)
}
db.close()
listServer.clear()
activity.runOnUiThread{
对话.停止加载()
}
}
}
}
}
})
}
不要在主线程上对数据库进行任何操作
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()
}
}
}
}
}
})
}