如果未自动保存,则将数据与服务器同步

时间:2017-01-04 11:18:13

标签: java android database web-services

我开发了一个应用程序,可以将手机拨打的所有电话保存到数据库中。这工作正常,因为一旦呼叫结束,我将获取所有呼叫详细信息并运行Web服务进行保存并保存呼叫。

但是,一旦没有网络连接或弱访问互联网,就会出现问题。呼叫未保存。 我找到了一条出路,我可以每天保存所有未保存的电话,这样我就能获得100%的电话通话记录。  我尝试在成功登录到hashmap后保存从服务器收到的表id,然后运行一个循环,服务将运行,直到找不到没有表id的日志,并且服务将在后台运行,Alarm Manager将运行在后台每24小时一次。这就是我做到的。

 public class Senddata extends AsyncTask<String, Void, Void> {
    String oppurjson;
    String oppurerror = null;
    ProgressDialog pd = new ProgressDialog(Create_log.this);
    String oppurdata = "";

    protected void onPreExecute() {
        // NOTE: You can call UI Element here.

        //Start Progress Dialog (Message)

        pd.setMessage("Please wait..");
        pd.show();
        pd.setCancelable(false);
        pd.setCanceledOnTouchOutside(false);

        try {
            if (sharedpreferences.contains(user)) {
                idofuser = sharedpreferences.getString(user, "");
                // System.out.println("Id of user is"+idofuser);
            }
            // Set Request parameter
            oppurdata += "&" + URLEncoder.encode("user_id", "UTF-8") + "=" + idofuser;
            oppurdata += "&" + URLEncoder.encode("call_start", "UTF-8") + "=" + calldatechange1;
            oppurdata += "&" + URLEncoder.encode("duration", "UTF-8") + "=" + callDuration1;
            oppurdata += "&" + URLEncoder.encode("direction", "UTF-8") + "=" + dir;
            oppurdata += "&" + URLEncoder.encode("mob", "UTF-8") + "=" + ggg;

            System.out.println("data going to be saved is-----" + oppurdata);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    protected Void doInBackground(String... urls) {
        /************ Make Post Call To Web Server ***********/
        BufferedReader reader = null;

        // Send data
        try {
            // Defined URL  where to send data
            URL url = new URL(urls[0]);

            // Send POST data request

            URLConnection conn = url.openConnection();

            conn.setConnectTimeout(15000);

            conn.setReadTimeout(15000);
            conn.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(oppurdata);
            wr.flush();

            // Get the server response

            reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line = null;


            // Read Server Response
            while ((line = reader.readLine()) != null) {
                // Append server response in string
                sb.append(line + " ");
            }

            // Append Server Response To Content String
            oppurjson = sb.toString();
        } catch (Exception ex) {
            oppurerror = ex.getMessage();
        } finally {
            try {
                reader.close();
            } catch (Exception ex) {
            }
        }

        /*****************************************************/
        return null;
    }

    protected void onPostExecute(Void unused) {
        // NOTE: You can call UI Element here.

        // Close progress dialog
 //            pd.dismiss();

        if (oppurerror != null) {
            Toast.makeText(getApplicationContext(), "Unable to create the call log.Try Again later", Toast.LENGTH_LONG).show();

        } else {    // Show Response Json On Screen (activity)
            Toast.makeText(getApplicationContext(), "Log created successfully", Toast.LENGTH_LONG).show();

            String OutputData = "";

            try {
                //JSONObject  jsonRootObject = new JSONObject(oppurjson);
                JSONObject jsonRootObject = new JSONObject(oppurjson);
                JSONObject json2 = jsonRootObject.getJSONObject("jsonobj");

                callstable = json2.optString("calls_table_id").toString();
                status = json2.optString("status").toString();

                HashMap<String,String> hm=new HashMap<>();
                hm.put("key",callstable);
                System.out.println("the calls table is"+callstable +"and the status is"+status);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        Create_log.this.finish();
       moveTaskToBack(false);
    }
}

我已将数据添加到hashmap,但它在那里返回错误,并且每次都不会添加数据。请建议我这是实现我想要实现的目标的最佳方式。如果是的话,我做错了什么?

1 个答案:

答案 0 :(得分:0)

假设您在设备上存储时调用实体具有某种结构,我建议您为数据库中的每个调用实体添加一个syncStatus字段。 syncStatus可以是值“pendingSync”或“同步”。所有呼叫都应存储为“pendingSync”。然后实现一个syncadapter,它只是将带有pendingSync syncStatus的所有实体上传到您的Web服务,并且在成功上传每个实体后,将其本地状态更新为“synced”。但是当然你可以在这里阅读更多内容https://developer.android.com/training/sync-adapters/creating-sync-adapter.html那里也应该有一个教程。

前奏:请注意,如果您为应用程序实现了一个实际数据库,但我建议您查看Android上的其他持久性选项。我确实看到了你拥有的sharedpreferences变量,但这可能不是你正在做的最好的编码实践。我已经使用SQLite数据库来实现类似的目标。也许请阅读所有替代方案,哪些案例适合每个https://developer.android.com/guide/topics/data/data-storage.html

如果您是Android新手,最好的办法是为您正在学习的每个新功能创建一个新应用,并尽可能多地探索该功能,而不会被您想要实现的操作蒙蔽。