2

I am trying to send my SQLite data with online MySQL server but to no avail. Naturally, I ran to Google and was lucky enough to find this. Apparently it's supposed to work and it does but I am not receiving the data on my server.

I know this question has been asked here and here, but I haven't been able to patch it up using the suggestions given.

Here is what I have tried. This is how I convert my SQLite data into JSON using GSON:

public String composeJSONfromSQLite() {
     ArrayList<HashMap<String, String>> offlineList;
     offlineList = new ArrayList<HashMap<String, String>>();
     String selectQuery = "SELECT  * FROM offlineTable ";
     SQLiteDatabase database = this.getWritableDatabase();
     Cursor cursor = database.rawQuery(selectQuery, null);
     if (cursor.moveToFirst()) {
     do {
     HashMap<String, String> map = new HashMap<String, String>();
     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);
}

And this is how I send it to my server:

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);
     }

    });
}

And when I log what the JASON looks like from Android I get this format:

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

But on my server I still get an empty array. What am I doing wrong?

This is how my request format should look like:

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

Here is how I receive the request:

public function massData() 
// offline sync
{

$input = Input::all();

 return $input;
4
  • 1
    but currently not sending array on server. do it like client.addHeader("data", loadCheckoutDB.composeJSONfromSQLite()); Commented Jan 28, 2016 at 17:07
  • Thanks for the early response. I tried that and i still get my response as [], an empty array. Commented Jan 28, 2016 at 17:13
  • Show how accessing offline in server side code Commented Jan 28, 2016 at 17:26
  • Stack Snippets aren't relevant to Java code. Please learn from the edits to your other posts. Commented Jul 30, 2016 at 20:43

2 Answers 2

1

Add your list to a map where key is offline and value that list:

public String composeJSONfromSQLite() {
     ArrayList<HashMap<String, String>> offlineList;
     offlineList = new ArrayList<HashMap<String, String>>();
     String selectQuery = "SELECT  * FROM offlineTable ";
     SQLiteDatabase database = this.getWritableDatabase();
     Cursor cursor = database.rawQuery(selectQuery, null);
     if (cursor.moveToFirst()) {
     do {
     HashMap<String, String> map = new HashMap<String, String>();
     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<String, ArrayList<HashMap<String, String>>> offlineMap = new HashMap<String, ArrayList<HashMap<String, String>>>();
     offlineMap.put("offline", offlineList);
     database.close();
     Gson gson = new GsonBuilder().create();
     //Use GSON to serialize Array List to JSON
     return gson.toJson(offlineMap);
}
Sign up to request clarification or add additional context in comments.

Comments

0

Here's how I have done it:

 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();
        }
    }

From logging numerous responses I discovered that I was not sending content-type using my previous method. After trying out this code, it worked.

3 Comments

Is there any possible way to implement this using volley?
@shaiToro Using a library removes all the unsafe boilerplate that one writes oneself. Check out okhttp or volley
@shaiToro I tried using volley but couldn't get the content type to application/json. No idea why.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.