如何将大型 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?的主要内容,如果未能解决你的问题,请参考以下文章

将大型 JSON 文件存储到 Oracle 数据库中

iOS 下载和解析大型 JSON 响应导致 CFData(存储)泄漏

sqli labs怎么搭建数据库

将大型 json 字符串从 Javascript 发布到 Django

将大型 Twitter JSON 数据 (7GB+) 加载到 Python 中

如何定期将大型 JSON 数据集导入 Cloud Firestore?