向服务器发送数据。在循环中(存在于 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 数据库中。)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Flutter将数据SQLite(离线)发送到服务器MySQL?