如何将SQLite数据从Android发送到MySQL服务器?

我试图用在线MySQL服务器发送我的SQLite数据,但无济于事。 当然,我跑到谷歌,很幸运能找到这个 。 显然它应该工作,但它确实,但我没有收到我的服务器上的数据。

我知道这里和这里已经提出过这个问题了 ,但是我无法使用给出的建议进行补丁。

这是我尝试过的。 这是我使用GSON将SQLite数据转换为JSON的方法:

public String composeJSONfromSQLite() { ArrayList<HashMap> offlineList; offlineList = new ArrayList<HashMap>(); String selectQuery = "SELECT * FROM offlineTable "; SQLiteDatabase database = this.getWritableDatabase(); Cursor cursor = database.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { HashMap map = new HashMap(); map.put("zip", cursor.getString(1)); map.put("phone", cursor.getString(2)); map.put("uid", cursor.getString(3)); offlineList.add(map); } while (cursor.moveToNext()); } database.close(); Gson gson = new GsonBuilder().create(); //Use GSON to serialize Array List to JSON return gson.toJson(offlineList); } 

这就是我将它发送到我的服务器的方式:

 public void syncSQLiteMySQLDB() { AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.put("offline",loadCheckoutDB.composeJSONfromSQLite()); Log.d("offline data log", loadCheckoutDB.composeJSONfromSQLite()); client.addHeader("session_id", getapikey()); client.addHeader("Content-Type", "application/json"); client.post("http://example.com/offline/api", params, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { String s = new String(responseBody); Log.d("response to sync", s); try { JSONObject obj = new JSONObject(s); if (obj.getBoolean("success")) { String success = obj.getString("message"); //Toast.makeText(getApplicationContext(), success, Toast.LENGTH_LONG).show(); } else { String failure = obj.getString("message"); //Toast.makeText(getApplicationContext(), failure, Toast.LENGTH_LONG).show(); } } catch (JSONException e) { } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // Toast.makeText(getApplicationContext(), "Failed to sync with server", Toast.LENGTH_LONG).show(); Log.d("sqlite sync error", String.valueOf(error)); progbar.setVisibility(View.INVISIBLE); } }); } 

当我从Android记录JASON的样子时,我得到以下格式:

 [{ "zip": "325, "phone": "78291849", "uid": "14538177211" }] 

但是在我的服务器上,我仍然得到一个空数组。 我究竟做错了什么?

这是我的请求格式应如下所示:

 { "offline":[ { "zip": "325, "phone": "78291849", "uid": "14538177211" } ] } 

以下是我收到请求的方式:

 public function massData() // offline sync { $input = Input::all(); return $input; 

将列表添加到键offline的映射中,并为该列表值:

 public String composeJSONfromSQLite() { ArrayList> offlineList; offlineList = new ArrayList>(); String selectQuery = "SELECT * FROM offlineTable "; SQLiteDatabase database = this.getWritableDatabase(); Cursor cursor = database.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { HashMap map = new HashMap(); map.put("zip", cursor.getString(1)); map.put("phone", cursor.getString(2)); map.put("uid", cursor.getString(3)); offlineList.add(map); } while (cursor.moveToNext()); } HashMap>> offlineMap = new HashMap>>(); offlineMap.put("offline", offlineList); database.close(); Gson gson = new GsonBuilder().create(); //Use GSON to serialize Array List to JSON return gson.toJson(offlineMap); } 

这是我如何做到的:

  public void syncSQLiteMySQLDB() { //i get my json string from sqlite, see the code i posted above about this final String json = loadCheckoutDB.composeJSONfromSQLite(); new Thread() { public void run() { makeRequest("http://myexample/offline/api", json); } }.start(); } public void makeRequest(String uri, String json) { try { HttpClient client = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(uri); httpPost.setEntity(new StringEntity(json)); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("session_id", getapikey()); httpPost.setHeader("Content-type", "application/json"); HttpResponse response = client.execute(httpPost); if (response != null) { String responseBody = EntityUtils.toString(response.getEntity()); Log.d("response to sync", responseBody); Object jsonObj = new JSONTokener(responseBody).nextValue(); if (jsonObj instanceof JSONObject) { JSONObject jsonObject = (JSONObject) jsonObj; //further actions on jsonObjects } else if (jsonObj instanceof JSONArray) { //further actions on jsonArray JSONArray jsonArray = (JSONArray) jsonObj; } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } 

通过记录大量响应,我发现我没有使用以前的方法发送内容类型。 在尝试此代码后,它工作。