Я пытаюсь отправить данные SQLite с онлайн-сервером MySQL, но безрезультатно. Естественно, я побежал в Google и посчастливилось найти this. По-видимому, он должен работать, и он работает, но я не получаю данные на своем сервере.
Я знаю, что этот вопрос задан здесь и здесь, но я не смог исправить его, используя приведенные предложения.
Вот что я пробовал. Вот как я конвертирую данные SQLite в JSON с помощью 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);
}
И вот как я отправляю его на свой сервер:
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);
}
});
}
И когда я регистрирую, как выглядит JASON с Android, я получаю этот формат:
[{
"zip": "325,
"phone": "78291849",
"uid": "14538177211"
}]
Но на моем сервере я все равно получаю пустой массив. Что я делаю неправильно?
Вот как должен выглядеть мой формат запроса:
{
"offline":[
{
"zip": "325,
"phone": "78291849",
"uid": "14538177211"
}
]
}
Вот как я получаю запрос:
public function massData()
// offline sync
{
$input = Input::all();
return $input;
Вот как я это сделал:
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();
}
}
Из регистрации многочисленных ответов я обнаружил, что я не отправлял контент-тип, используя мой предыдущий метод. После проверки этого кода он работал.
Добавьте свой список на карту, где ключ offline
, и укажите этот список:
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);
}
array
на сервер. сделать это какclient.addHeader("data", loadCheckoutDB.composeJSONfromSQLite());