我正在开发一个项目,用于收集用户数据并在离线SQLite数据库中存储,以后在互联网连接可用时开始同步。
从我的SQLlite数据库中,我将这些条目逐个同步,状态为“PENDING”
我制作了一些工作代码,但这些代码效率不高,我正面临着这些问题。
1 - 我的BroadcastReceiver仅在网络状态发生变化时激活,但在手机已连接到互联网时无效。我想在互联网可用时开始同步数据,而不仅仅是在查看互联网状态后
2 - 我正在使用一个简单的循环,该循环从状态为“PENDING”的行的第一个索引开始,一直运行直到达到待处理项的总数。我想要一种有效的方法来做到这一点。
我在 DatabaseHandler 类
中使用了这两个函数功能#1 pendingContactCounter()
,用于计算状态为“PENDING”的联系人数量。
例如,如果我们考虑上传的表格图像,该功能将返回2,因为两个联系人可以使用“PENDING”状态
函数#2 pendingContactID()
返回状态为“PENDING”的第一行的ID
从上图中,它将返回2,因为ID 2的状态为“PENDING”
对于互联网连接检测我做了这个BroadcastReceiver
public class InternetReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm = ((ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE));
if (cm == null)
return;
if (cm.getActiveNetworkInfo() != null
&& cm.getActiveNetworkInfo().isConnected()) {
// CONNECTED
Log.d("CONNECTION STATUS", "CONNECTED!");
Intent service_intent = new Intent(context, uploadService.class);
context.startService(service_intent);
}
} else {
// NOT CONNECTED
Log.d("CONNECTION STATUS", "NOT CONNECTED!");
}
}
将“PENDING”条目更新为“SENT”的服务
public class uploadService extends IntentService {
private int total_request;
private int pending_id;
public uploadService() {
super("uploadService");
}
@Override
protected void onHandleIntent(Intent intent) {
DatabaseHandler db = new DatabaseHandler(getApplicationContext());
total_request = db.pendingContactCounter();
pending_id = db.pendingContactID();
Log.d("TOTAL REQUEST: ", "" + total_request);
Log.d("PENDING ID: ", "" + pending_id);
for (int i = pending_id; i <= total_request + 1; i++) {
db.updateData(i, "SENT");
}
}
}
最后清单看起来像这样,
<receiver android:name=".connectionReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<service android:name="uploadService" >
</service>