向服务器发送数据。在循环中(存在于 Sqlite 数据库中。)

Posted

技术标签:

【中文标题】向服务器发送数据。在循环中(存在于 Sqlite 数据库中。)【英文标题】:Send Data to Server. in loop (Present in Sqlite Database.) 【发布时间】:2018-07-23 15:32:41 【问题描述】:

我将我的数据发送到我的云服务器......它工作正常。但我想发送 SQlite db 表中存在的所有数据。我在 Map 方法下使用 Do while 循环,但它只发送一行。不完整。

String url = "http://blhc.com:1980/Mob/SendDoc.aspx";

SendDoctors(Context paramContext)

    this.cont = paramContext;

@Override
protected String doInBackground(Void... voids) 

    //region Sending
    try
        ds = new DataSource(cont);
        ds.open();
        final Cursor cursor = ds.send();
        if(cursor.moveToFirst())
        do 
            //region Sending Data
            StringRequest stringRequest = new StringRequest(Request.Method.POST,url,
                    new Response.Listener<String>()
                        @Override
                        public void onResponse(String response) 
                            Toast.makeText(cont,"Uploaded.." ,Toast.LENGTH_SHORT).show();

                            Log.v("jarvis" ,"Resposce" + response);
                        
                    
                    , new Response.ErrorListener() 
                @Override
                public void onErrorResponse(VolleyError error) 
                    Toast.makeText(cont,"Error.." ,Toast.LENGTH_SHORT).show();
                    error.printStackTrace();
                
            )

                @Override
                protected Map<String, String> getParams() throws AuthFailureError 

                    Map<String, String> param = new HashMap<String, String>();
                    param.put("CELL_NO", cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_PHONE_NUM)));
                    param.put("M_DATE", M_DATE);
                    param.put("M_TIME", M_TIME);
                    param.put("EMP_ID", cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_EMP_ID)));
                    param.put("DOC_ID", cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_DOC_ID)));
                    param.put("SA", cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_SA)));
                    param.put("NOTE", "NOTE");
                    param.put("CO_ID", cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_CO_ID)));
                    param.put("LAT", cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_LOC_LAT)));
                    param.put("LNG", cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_LOC_LON)));
                    param.put("USER_ID", String.valueOf(LoginActivity.ID));
                    return param;
                
            ;
            MySingleton.getmInstance(cont).addToRequestQue(stringRequest);
            //endregion
        while (cursor.moveToNext());
    catch(Exception e)
    //endregion

    return null;

错误

E/Volley: [191] NetworkDispatcher.run: Unhandled exception android.database.CursorIndexOutOfBoundsException: Index 6 requested, with a size of 6
          android.database.CursorIndexOutOfBoundsException: Index 6 requested, with a size of 6
              at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
              at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
              at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
              at com.example.zed.androidapplication.SendDoctors$3.getParams(SendDoctors.java:84)
              at com.android.volley.Request.getBody(Request.java:468)
              at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:253)
              at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:227)
              at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:107)
              at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:97)
              at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:114)
W/System.err: com.android.volley.VolleyError: android.database.CursorIndexOutOfBoundsException: Index 6 requested, with a size of 6
W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:143)
W/System.err: Caused by: android.database.CursorIndexOutOfBoundsException: Index 6 requested, with a size of 6
W/System.err:     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
W/System.err:     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
W/System.err:     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
W/System.err:     at com.example.zed.androidapplication.SendDoctors$3.getParams(SendDoctors.java:84)
W/System.err:     at com.android.volley.Request.getBody(Request.java:468)
W/System.err:     at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:253)
W/System.err:     at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:227)
W/System.err:     at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:107)
W/System.err:     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:97)
W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:114)

应用循环。但它显示了一些错误...我超出了限制。

我必须在我的网络服务器上清除一件事 Api 采用变量而不是数组。现在我想我明白我的意思了吗?

注意:我正在使用 volley lib 向服务器发送数据。

提前致谢。真的很感谢你的帮助。

【问题讨论】:

首先准备好整个本地数据映射对象,然后调用 volley 请求。 尝试循环doInBackground 在循环内向服务器请求不是一个好主意。如果您的 Cursor 有 1000 行或更多行会怎样?它将向服务器发送大量请求。尝试单个请求并以数组或列表的形式发送所有数据。 @AbuYousuf 我该怎么做? @AbuYousuf 兄弟请看一看。我的问题是我无法在数组中发送我的数据。由于接收端,我必须发送变量。 【参考方案1】:

在循环中向服务器请求不是一个好的选择。您的循环可以执行 1000 次或更长时间。尝试使用数组或发布数据列表的单个请求。

使用JsonArrayRequest 作为您的请求。它接受JSONArray 作为参数。来自 Volley 源代码:

/**
 * Creates a new request.
 * @param method the HTTP method to use
 * @param url URL to fetch the JSON from
 * @param jsonRequest A @link JSONArray to post with the request. Null is allowed and
 *   indicates no parameters will be posted along with request.
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public JsonArrayRequest(int method, String url, JSONArray jsonRequest,
                        Listener<JSONArray> listener, ErrorListener errorListener) 
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
            errorListener);

@param jsonRequest 与请求一起发布的 @link JSONArray。允许为 Null 并且

此构造函数采用JSONArray,您可以使用它来发布您的数据。使用您的数据创建JSONArray 并发送请求。

编辑:

像这样创建你的JSONArray

JSONObject json1= new JSONObject();
json1.put("key1","value1");
json1.put("key2","value2");

JSONObject json2= new JSONObject();
json2.put("key1","value1");
json2.put("key2","value2");

JSONArray jsonArray = new JSONArray();
jsonArray.put(json1);
jsonArray.put(json2);

发送请求

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, url, jsonArray, new Response.Listener<JSONArray>() 
            @Override
            public void onResponse(JSONArray response) 

            
        , new Response.ErrorListener() 
            @Override
            public void onErrorResponse(VolleyError error) 

            
        ) 
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError 
                Map<String, String> headers = new HashMap<>();
                return headers;
            
        ;

也可以查看answer

【讨论】:

它给了我错误。说真的,我没有得到你的答案。你能告诉我相应的代码吗? ? 如果你不把你的错误放在这里,那么有人会如何帮助你实际上是什么问题。无论如何,我已经更新了我的答案 我想我得到了你的答案..但是你能告诉我我在哪里写代码或制作 json 数组吗?我必须从 SQLITE 数据库中制作 json。【参考方案2】:

以下代码是您从 Sqlite 获取数据并每次调用 volley 和命中 API 的参考:

 private void UploadSavedData() 

    String selectQuery = "SELECT  * FROM " + Constants.TABLE_NAME_COUNT;
    db = databaseHelper.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) 
        Log.e("DATA_CHECK","DATA_CHECK");
        do 
            countEditQuantity(cursor.getString(2),cursor.getString(3)); //calling webservices here
            Log.e("DATASQLA",""+cursor.getString(1));



         while (cursor.moveToNext());

    else

    




 public void countEditQuantity(final String skuData, final String newQty) 
   String url = Constants.EDIT_TAKE_INVENTORY_URL"+dcId+"&sku="+""+skuData+"&new_qty="+""+newQt;
    Log.e("URL",""+url);

    StringRequest eventoReq = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() 
                @Override
                public void onResponse(String response) 
                    Log.e("RESPONSE", response.toString());

                    if (progressCount <= 1) 
                        if(databaseHelper.deleteTableCount())
                            mProgress.dismiss();
                            utils.showtoast("All Product Quantity Updated");
                            progressCount = 0;
                            getSyncTime();
                        
                     else 
                        progressCount--;
                    
                    try 
                        JSONArray j = new JSONArray(response);

                        // Parse a json
                        for (int i = 0; i < j.length(); i++) 
                            try 
                                JSONObject obj = j.getJSONObject(0);
                                String code = String.valueOf(obj.get("code"));
                                Log.e("CODE", "" + code);

                                if(code.equals("1"))

                                
                                if(code.equals("0"))

                                 utils.showtoast(""+obj.get("message"));

                                
                                if(code.equals("-2"))
                                utils.showtoast(""+obj.get("message"));


                                

                             catch (JSONException e) 
                                e.printStackTrace();
                            

                        

                     catch (JSONException e) 
                        e.printStackTrace();
                    


                
            , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 
            Log.e("Error: ", "" + error.getMessage());
            utils.showtoast("Please try again...");


        
    );
    eventoReq.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    // Añade la peticion a la cola
    AppController.getInstance(this).addToRequestQueue(eventoReq);


【讨论】:

我在这里做的是我从 Sqlite 数据库获取数据同时我通过方法传递值作为参数并调用 API,在 2-3 秒内它将所有数据更新为服务器。 您正在通过 url 发送数据。但是我在网络服务器上使用变量,它接收我从 Android 应用程序发布的数据。 您正在通过 url 发送数据。但是我在网络服务器上使用变量,它接收我从 Android 应用程序发布的数据。 你在使用 API,POST 请求吗?@MuhammadZeeshan【参考方案3】:

我解决了我的问题。谢谢大家。 我发布了我对上述代码的回答。它工作正常。

    //region Sending
    try
        ds = new DataSource(cont);
        ds.open();
        final Cursor cursor = ds.send();
        if(cursor.moveToFirst())
        do 

            //region Sending Variables
            final String CELL_NO = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_PHONE_NUM));
            final String M_DATE = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_DATE));
            final String M_TIME =cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_TIME));
            final String EMP_ID = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_EMP_ID));
            final String UserID = String.valueOf(LoginActivity.ID) ;
            final String DOC_ID = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_DOC_ID));
            final String SA= cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_SA));
            final String NOTE = " - ";
            final String CO_ID = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_CO_ID));
            final String LAT =cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_LOC_LAT));
            final String LNG=cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_DA_LOC_LON));
            //endregion

            //region Sending Data
            Log.v("jarvis","Line = 1");
            StringRequest stringRequest = new StringRequest(Request.Method.POST,url,
                    new Response.Listener<String>()
                        @Override
                        public void onResponse(String response) 
                            ds.updateStatus(DOC_ID,M_DATE,M_TIME,EMP_ID); //true
                            Toast.makeText(cont,"Uploaded And Saved.." ,Toast.LENGTH_SHORT).show();
                            Log.v("jarvis","Line = 2");
                        
                    
                    , new Response.ErrorListener() 
                @Override
                public void onErrorResponse(VolleyError error) 
                    Log.v("jarvis","Line = 3");
                    ds.updateFalse(DOC_ID,M_DATE,M_TIME,EMP_ID); //true
                    Toast.makeText(cont,"Error.." ,Toast.LENGTH_SHORT).show();
                    error.printStackTrace();
                
            )

                @Override
                protected Map<String, String> getParams() throws AuthFailureError 
                    Log.v("jarvis","Line = 4");

                    Map<String, String> param = new HashMap<String, String>();
                    param.put("CELL_NO", CELL_NO);
                    param.put("M_DATE", M_DATE);
                    param.put("M_TIME", M_TIME);
                    param.put("EMP_ID", EMP_ID);
                    param.put("DOC_ID", DOC_ID);
                    param.put("SA", SA);
                    param.put("NOTE", NOTE);
                    param.put("CO_ID", CO_ID );
                    param.put("LAT", LAT);
                    param.put("LNG",LNG);
                    param.put("USER_ID",UserID);
                    return param;
                
            ;
            Log.v("jarvis","Line = 5");
            MySingleton.getmInstance(cont).addToRequestQue(stringRequest);
            //endregion
            Log.v("jarvis","Line = 6");

        while (cursor.moveToNext());
    catch(Exception e)
    //endregion

【讨论】:

以上是关于向服务器发送数据。在循环中(存在于 Sqlite 数据库中。)的主要内容,如果未能解决你的问题,请参考以下文章

我需要将数据从 Sqlite 数据库发送到服务器

我如何通过角度向套接字服务器发送数据和获取数据

如何使用Flutter将数据SQLite(离线)发送到服务器MySQL?

如何将数据保存到sqlite当没有网络并在flutter中恢复网络连接后发送到服务器

Android 数据存储 - 文件与 SQLite

sqlite不存在记录则插入数据