android应用程序通过RESTfulWebService向服务器发送重复记录

android应用程序通过RESTfulWebService向服务器发送重复记录,android,sql-server,sqlite,service,timer,Android,Sql Server,Sqlite,Service,Timer,我创建了一个应用程序,服务每5分钟运行一次,从sqlite获取记录并将其发送到服务器并更新sqlite中的状态,问题出现在sql server数据库中,其中一行被多次插入 我不知道是什么原因导致了这个问题,在调试我的代码时,我注意到当向服务器发送一行调试器时,调试器进入了计时器的内置类,并再次发送相同的记录,我感觉计时器正在一次又一次地运行,并在向服务器发送多条记录后更新状态。请说明问题所在以及执行此任务的正确方法 这是代码服务类 public class AlarmServices exten

我创建了一个应用程序,服务每5分钟运行一次,从sqlite获取记录并将其发送到服务器并更新sqlite中的状态,问题出现在sql server数据库中,其中一行被多次插入

我不知道是什么原因导致了这个问题,在调试我的代码时,我注意到当向服务器发送一行调试器时,调试器进入了计时器的内置类,并再次发送相同的记录,我感觉计时器正在一次又一次地运行,并在向服务器发送多条记录后更新状态。请说明问题所在以及执行此任务的正确方法

这是代码服务类

public class AlarmServices extends Service {

private Timer myTimer;
private SQLiteDB dbHelper;
Cursor cursor;
String where = "1=1";
String Whatstatus;
String FFCode, TerrCode, FFMgr;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    myTimer = new Timer();
    myTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            scheduleAlarm();
            getDataFromDB();

    }

    }, 0, 5 * 60 * 1000); // 5 min 
    Log.e("syn process start", "yes");
}


private void getDataFromDB() {

    dbHelper = new SQLiteDB(AlarmServices.this);
    dbHelper.open();
    cursor = dbHelper.getInCompleteAttendance(where);

    int rows = cursor.getCount();
    if (rows > 0) {
        cursor.moveToFirst();

        for (int i = 0; i < rows; i++) {
            int Id;
            String recvdate, ffcode, terr_code, drcode, drname, addr, createddate, ffmgr, shift, lat, lon,droidrefno,locAddress, sync_status, curr_date, date_only;
            Id = cursor.getInt(0);
            recvdate = cursor.getString(1);
            ffcode = cursor.getString(2);
            terr_code = cursor.getString(3);
            drcode = cursor.getString(4);
            drname = cursor.getString(5);
            addr = cursor.getString(6);
            createddate = cursor.getString(7);
            ffmgr = cursor.getString(8);
            shift = cursor.getString(9);
            lat = cursor.getString(10);
            lon = cursor.getString(11);
            droidrefno = cursor.getString(12);
            locAddress = cursor.getString(13);
            sync_status = cursor.getString(14);
            curr_date = cursor.getString(15);
            date_only = cursor.getString(16);

            // Sync Server
            ChkInsertDailyAttendanceOperation insertAttd = new ChkInsertDailyAttendanceOperation(AlarmServices.this,
                    recvdate, ffcode, terr_code, drcode, drname, locAddress,
                    createddate, ffmgr,shift,Double.parseDouble(lat),Double.parseDouble(lon),
                    droidrefno,curr_date,date_only);

             insertAttd.execute();
             cursor.moveToNext();

        }

    } else {

    }

    dbHelper.close();
}

public void scheduleAlarm() {

    Long time = new GregorianCalendar().getTimeInMillis() + 1000;
    Intent intentAlarm = new Intent(this, MyExtBroadcastReceiver.class);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent
            .getBroadcast(this, 1, intentAlarm,PendingIntent.FLAG_UPDATE_CURRENT));

}

public static class MyExtBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Sync Process Running",
                  Toast.LENGTH_LONG).show();

        Log.e("sync process running","yes");
    }

}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}
}
公共类AlarmServices扩展服务{
私人定时器;
私有SQLiteDB-dbHelper;
光标;
字符串,其中=“1=1”;
字符串Whatstatus;
字符串FFCode、TerrCode、FFMgr;
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
super.onCreate();
myTimer=新计时器();
myTimer.schedule(新TimerTask(){
@凌驾
公开募捐{
调度报警();
getDataFromDB();
}
},0,5*60*1000);//5分钟
Log.e(“同步进程启动”,“是”);
}
私有void getDataFromDB(){
dbHelper=newsqlitedb(AlarmServices.this);
dbHelper.open();
cursor=dbHelper.getIncompleAttention(其中);
int rows=cursor.getCount();
如果(行数>0){
cursor.moveToFirst();
对于(int i=0;i
异步任务类的代码

public class ChkInsertDailyAttendanceOperation extends AsyncTask<String, Void, String> {

String serverResponse;
String Recv_Date, FF_code, Terr_code, Dr_code, Dr_name, Addr, Created_Date,Currdate,locAddr,
FF_mgr, Shift, Droid_Ref_No,DateOnly;
double Lat,Lng;
String Response ="{\"Value\":true,\"Successful\":true}"; //"{\"Successful\":true}";
Context cxt;
UserSQLiteDB dbHelper;

public ChkInsertDailyAttendanceOperation(Context context, String recv_Date,
        String ff_code, String terr_code, String dr_code, String dr_name,
        String locAddress,  String created_Date,String ff_mgr, String shift,double lat,double lng,String droid_Ref_No,String currdate,String dateonly  ) {
       // TODO Auto-generated constructor stub

    Recv_Date = recv_Date;
    FF_code = ff_code;
    Terr_code = terr_code;
    Dr_code = dr_code;
    Dr_name = dr_name;
    //Addr = addr;
    Created_Date = created_Date;
    FF_mgr = ff_mgr;
    Shift = shift;
    Lat = lat;
    Lng = lng;
    Droid_Ref_No =droid_Ref_No;
    locAddr = locAddress;
    Currdate =currdate;
    DateOnly =dateonly;
    cxt=context;
}

@Override
protected String doInBackground(String... urls) {
    RestAPI restAPI = new RestAPI();
    JSONObject jsonObj = new JSONObject();

    try {


        jsonObj = restAPI.UserDailyAttendance(Recv_Date, FF_code,
                Terr_code, Dr_code, Dr_name, locAddr, Created_Date, FF_mgr,
                Shift,Lat, Lng,Droid_Ref_No);
        serverResponse = jsonObj.toString();


    } catch (Exception e) {
        // TODO Auto-generated catch block
        serverResponse="InternetNotFound";
        Log.e("catch block", serverResponse);

    }

    Log.e("repsonse", serverResponse);
    return serverResponse;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    //pd.dismiss();
    dbHelper = new SQLiteDB(cxt);
    dbHelper.open();

        String SyncStatus;
        if (serverResponse.equals(Response)) {
            SyncStatus = "C";
        } else {
            SyncStatus = "I";
        }

        dbHelper.updateDAILYATTENDANCE(Recv_Date, FF_code,
                Terr_code, Dr_code, Dr_name, Addr, Created_Date, FF_mgr,
                Shift,String.valueOf(Lat), String.valueOf(Lng),Droid_Ref_No,locAddr,SyncStatus,Currdate,DateOnly);

        dbHelper.close(); 

}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    //pd.show();
}
公共类ChkInsertDailyAttendanceOperation扩展了异步任务{
字符串服务器响应;
字符串记录日期、FF_代码、Terr_代码、Dr_代码、Dr_名称、地址、创建日期、Currdate、locAddr、,
值班副经理,机器人参考号,仅日期;
双Lat,液化天然气;
字符串响应=“{\'Value\':true,\'Successful\':true}”/“{\'Successful\':true}”;
上下文cxt;
UserSQLiteDB-dbHelper;
公共chkinsertdailAttendanceOperation(上下文,字符串recv_Date,
字符串ff_代码、字符串terr_代码、字符串dr_代码、字符串dr_名称、,
字符串地址、字符串创建日期、字符串ff管理、字符串移位、双lat、双lng、字符串droid\u参考号、字符串currdate、字符串dateonly){
//TODO自动生成的构造函数存根
接收日期=接收日期;
FF_代码=FF_代码;
地球代码=地球代码;
Dr_代码=Dr_代码;
Dr_name=Dr_name;
//Addr=Addr;
创建日期=创建日期;
FF_经理=FF_经理;
移位=移位;
Lat=Lat;
液化天然气=液化天然气;
Droid_Ref_No=Droid_Ref_No;
locAddr=locAddress;
Currdate=Currdate;
DateOnly=DateOnly;
cxt=上下文;
}
@凌驾
受保护的字符串doInBackground(字符串…URL){
RestAPI RestAPI=新RestAPI();
JSONObject jsonObj=新的JSONObject();
试一试{
jsonObj=restAPI.UserDailyAttendance(接收日期、FF代码、,
地球代码、博士代码、博士姓名、地址、创建日期、FF经理、,
班次、Lat、Lng、机器人参考号);
serverResponse=jsonObj.toString();
}捕获(例外e){
//TODO自动生成的捕捉块
serverResponse=“InternetNotFound”;
Log.e(“catch block”,serverResponse);
}
Log.e(“repsonse”,serverResponse);
返回服务器响应;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//pd.解散();
dbHelper=newsqlitedb(cxt);
dbHelper.open();
字符串同步状态;
if(serverResponse.equals(Response)){
SyncStatus=“C”;
}否则{
SyncStatus=“I”;
}
dbHelper.UpdateDailyatEndance(Recv_