首页 > 解决方案 > 如何使用 volley 在 Kotlin 中同步 mysql 和 sqlite 数据库

问题描述

我正在尝试构建一个应用程序(Kotlin)来存储可以离线和在线工作的公交车票数据。
流程:-
a) 输入数据 -> 使用 volley 通过 JSON HTTP 请求将其发送到远程 MySQL db
b) 如果 mysql 输入成功,则将 upload_status 设置为 1(数据已上传) -> 将数据存储到 sqlite status = 1
c)如果它不发送到mysql(由于互联网连接问题)将upload_status设置为0(数据不上传到远程mysql)->将数据存储到status = 0的sqlite
之后我想运行一个协程或某种作业调度程序将行从状态为 0 的 sqlite 推送到具有特定时间框架的 mysql。

目前,如果网络连接正常,我可以将数据发送到 mysql 和 sqlite。但是如果连接不工作,那么 volley(Async task) 开始尝试将数据发送到 mysql,同时执行 sqlite 语句,然后从 volley 获得任何响应。由于凌空响应较晚,无法将状态值设置为正确的值(即 0)并插入到 sqlite

下面是我来自 MainActivity.kt 的代码

            Response.Listener<String> { response ->
                try{

                    Log.i("tagconvertstr", "["+response+"]");
                    val obj = JSONObject(response)  
                    u_status = 1;
                    Log.i("Uploaded", "done1"+u_status.toString());

                  Toast.makeText(applicationContext,obj.getString("message"),Toast.LENGTH_LONG).show()
                }catch (e: JSONException){
                    e.printStackTrace()
                }
            },
            object : Response.ErrorListener{
                override fun onErrorResponse(volleyError: VolleyError){
                    u_status = 0;
                    Log.i("ERROR TAG", "err1"+u_status.toString());
                    Toast.makeText(applicationContext, volleyError.message, Toast.LENGTH_LONG).show()
                }
            }){

            @Throws(AuthFailureError::class)
            override fun getParams(): Map<String, String>{
                val params = HashMap<String, String>()
                params.put("origin", origin)
                params.put("destination", destination)
                params.put("AdultQt", AdultQt)
                params.put("ChildQt", ChildQt)
                return params
            }
        }

        VolleySingleton.instance?.addToRequestQueue(stringRequest)
        Log.i("TAG", "final1"+u_status.toString());

 val databaseHandler: DatabaseHandler= DatabaseHandler(this)

        if(origin.trim()!="" && destination.trim()!=""){
            val status = databaseHandler.addTicket(TicketModelClass(origin, destination, Integer.parseInt(AdultQt),Integer.parseInt(ChildQt),(u_status)))
            if(status > -1){
                Toast.makeText(applicationContext,"record save",Toast.LENGTH_LONG).show()
                editTextOrigin.text.clear()
                editTextDestination.text.clear()

            }
        }else{
            Toast.makeText(applicationContext,"origin and destination cannot be blank", Toast.LENGTH_LONG).show()
        }

VolleySingleton.kt

import android.app.Application
import android.nfc.Tag
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.Volley

class VolleySingleton : Application(){

    override fun onCreate() {
        super.onCreate()
        instance = this
    }


    val requestQueue: RequestQueue? = null
        get(){
            if(field == null){
                return Volley.newRequestQueue(applicationContext)
            }
            return field
        }
    fun <T> addToRequestQueue(request: Request<T>){
        request.tag = TAG
        requestQueue?.add(request)
    }

    companion object{
        private val TAG = VolleySingleton::class.java.simpleName
        @get:Synchronized var instance: VolleySingleton? = null
            private set
    }

}

有没有可能让主线程休眠,直到凌空请求被执行,这样我就可以得到它是否上传到 Mysql 的状态。或者我应该将 Mysql 和 sqlite 插入都放在 volley(异步任务)中,这样它们就可以一个接一个地执行?有没有更好的方法来做上面提到的?由于 kotlin 没有太多示例,因此一些示例会很棒。谢谢!

标签: androidmysqlsqlitekotlinandroid-volley

解决方案


推荐阅读