Я изучаю, как отправлять данные во внешнюю базу данных, а код работает, но он немного глючит, если не сказать больше. Я использую this учебник, и многие из них с тех пор обесценились, поэтому я сам пытался его обновить.Данные вставляются в базу данных, а затем сбой приложений
Что произойдет, когда пользователь нажимает кнопку синхронизации, данные, хранящиеся в базе данных SQLite, должны быть отправлены во внешнюю базу данных. Это происходит, но затем приложение падает. Решение не понятно мне в лог-кошке, и я не уверен, как исправить проблему. Мне удалось изолировать крах этого раздела кода, который был одним из строк кода, который был обесценен (при успехе, при сбое).
Я провел исследование по AsyncHTTPResponseHandler и подумал, что код был в порядке, и, как я сказал ранее, он подключается к БД и вставляет в таблицу, а затем сразу же падает. Я поставил код, который, по моему мнению, является проблемой, вместе с лог-кошкой.
public void syncSQLiteMySQLDB() {
//Create AsycHttpClient object
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
ArrayList<HashMap<String, String>> userList = controller.getAllUsers();
if (userList.size() != 0) {
if (controller.dbSyncCount() != 0) {
prgDialog.show();
params.put("usersJSON", controller.composeJSONfromSQLite());
client.post("http://jakebreen.co.uk/android/sqlitemysqlsync/inseruser.php", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
System.out.println(response);
prgDialog.hide();
try {
JSONArray arr = new JSONArray(response);
System.out.println(arr.length());
for (int i = 0; i < arr.length(); i++) {
JSONObject obj = (JSONObject) arr.get(i);
System.out.println(obj.get("id"));
System.out.println(obj.get("status"));
controller.updateSyncStatus(obj.get("id").toString(), obj.get("status").toString());
}
Toast.makeText(getApplicationContext(), "DB Sync completed!", Toast.LENGTH_LONG).show();
} catch (JSONException e) {
// TODO Auto-generated catch block
Toast.makeText(getApplicationContext(), "Error Occured [Server's JSON response might be invalid]!", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
// TODO Auto-generated method stub
prgDialog.hide();
if (statusCode == 404) {
Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show();
} else if (statusCode == 500) {
Toast.makeText(getApplicationContext(), "Something went wrong at server end", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet]", Toast.LENGTH_LONG).show();
}
}
});
} else {
Toast.makeText(getApplicationContext(), "SQLite and Remote MySQL DBs are in Sync!", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getApplicationContext(), "No data in SQLite DB, please do enter User name to perform Sync action", Toast.LENGTH_LONG).show();
}
}
Вход кот
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.year2.sqlitemysqlsync, PID: 2281
java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Byte cannot be cast to org.json.JSONArray
at com.loopj.android.http.AsyncHttpResponseHandler.onUserException(AsyncHttpResponseHandler.java:304)
at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:395)
at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassCastException: java.lang.Byte cannot be cast to org.json.JSONArray
at com.year2.sqlitemysqlsync.MainActivity$1.onSuccess(MainActivity.java:102)
at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:351)
at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Application terminated.
Спасибо, что удалось остановить приложение от сбоев, однако в настоящее время в журнале кошки I может видеть W/System.err: org.json.JSONException: значение Подключено типа j ava.lang.String не может быть преобразован в JSONArray –
Это означает, что ваш объект не является JSONArray или есть некоторые нежелательные символы. Вы можете попробовать этот новый JSONObject ("{" + new String (response) + "}") Или ... отправьте пример своего ответа. Что там на самом деле. – user007
Благодарим вас за все ваши советы, теперь все работает так, как ожидалось! –