为SQLITE数据库实现递归函数

问题描述 投票:0回答:1

我正在将lat-longs从本地数据库同步到服务器,并在用户按下按钮时,如果lat-longs与服务器成功同步,则更改本地数据库表中行的状态。

问题

当按下按钮时,我点击API以将lat-long同步到服务器。

  1. 如果互联网速度很慢,我会丢失一些很长的时间(我想按照确切的顺序发送所有的lat-long。如果错过任何lat-long,我会再次尝试发送丢失的内容)。
  2. 如果所有lat-longs成功同步,则调用EndRide Api

这是按下按钮时的代码。

try {
    cursor = db.getUnsyncedLatLngs(engIdForDB);
    if (cursor.moveToFirst()) {
        do {
          //calling the method to save the unsynced name to MySQL
          saveLatLngs(cursor.getInt(cursor.getColumnIndex(NewDatabaseForInRideData.COLUMN_ID)), cursor.getDouble(cursor.getColumnIndex(NewDatabaseForInRideData.Latitude)), cursor.getDouble(cursor.getColumnIndex(NewDatabaseForInRideData.Longitude)), engIdForDB);
         } while (cursor.moveToNext());
     }
} catch (Exception e) {
    e.printStackTrace();
}

//Problem driverEndRideAsync is called even if some LatLng skiped to upload.
driverEndRideAsync(activity, abc, abc, 0, abc);

并将lat-long上传到服务器

private void saveLatLngs(final int id, final double lati, final double longi, String engId) {

    RestClient.getApiService().update_data(abc, abc, lati, longi, String.valueOf(123), String.valueOf(123), String.valueOf(123), new Callback<String>() {
        @Override
        public void success(String s, Response response) {
            try {
                JSONObject jObj;

                jObj = new JSONObject(s);
                int flag = jObj.getInt("flag");
                if (ApiResponseFlags.SOMETHING_WENT_WRONG.getOrdinal() == flag) {
                    db.updateNameStatus(id, NAME_NOT_SYNCED_WITH_SERVER, engId);

                } else {
                    db.updateNameStatus(id, NAME_SYNCED_WITH_SERVER, engId);

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

            android.util.Log.i("update_in_ride_data", " Success =" + response);
        }

        @Override
        public void failure(RetrofitError error) {
            android.util.Log.i("update_in_ride_data", " Error =" + error);
        }
    });
}
android database performance sqlite android-sqlite
1个回答
0
投票

您的实施中有几个问题。

  • 您正在通过在while循环内调用服务器的外部API来保存从数据库表中获取的lat-long。这是一个非常糟糕的实现,因为当您尝试使用API​​服务调用保存每个lat-long时,这会在后台创建大量AsyncTask
  • 更清晰的实现需要在后端服务器中进行开发,这应该将lat-long作为批处理(即一次保存一堆lat-long)。在此实现中,您可以通过调用API服务一次来保存您的lat-long,而不是为每个条目多次调用它。
  • driverEndRideAsync(activity, abc, abc, 0, abc);块中移动try函数调用,以便在使用API​​服务将lat-long数据发送到服务器时,如果从该块中获得异常,则不会执行该调用。
  • 如果你在服务器端保留这个确切的实现,那么我建议你有一个后台服务,它将检查在一段时间后是否有任何数据可以与数据库表中的服务器同步。在这种情况下,即使在将数据与服务器同步时出现异常,也会使数据同步,因为最终后台服务将检测未同步的数据并将它们与服务器应用程序同步。

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.