私は外部データベースにデータを送信する方法を学習していますが、コードは動作しますが、最小限に抑えるために少しバギーです。私はthisチュートリアルを使用しています。多くのコードが償却されて以来、私はそれを自分で更新しようとしてきました。データがデータベースに挿入されてからアプリケーションがクラッシュする
ユーザが同期ボタンを押すと、SQLiteデータベースに保持されているデータを外部データベースに送信する必要があります。これは起こりますが、アプリがクラッシュします。解決策は、ログの猫で私にはっきりしていないと私はどのように問題を修正するか分からない。私は、コードのこのセクションにクラッシュを分離することができました。このコードセクションは、償却されたコード行の1つでした(成功した場合、失敗した場合)。
私はAsyncHTTPResponseHandlerに関する研究を行いましたが、コードは問題ないと思っていました。以前に述べたように、DBに接続してテーブルに挿入してすぐにクラッシュします。私は、ログの猫と一緒に問題だと思うコードを入れました。
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();
}
}
代わり
JSONArray arr = new JSONArray(response);
のログ猫
--------- 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.
おかげで、してみてくださいW/System.errを見ることができます:org.json.JSONException:タイプjの接続値ava.lang.StringをJSONArrayに変換することはできません –
これは、オブジェクトが実際にJSONArrayでないか、不要な文字があることを意味します。あなたはこれを試すことができます 新しいJSONObject( "{" +新しい文字列(レスポンス)+ "}") またはあなたの応答の例を投稿してください。本当に何がありますか? – user007
あなたのアドバイスありがとう、すべてが現在期待どおりに動作しています! –