2016-09-23 25 views
0

私は外部データベースにデータを送信する方法を学習していますが、コードは動作しますが、最小限に抑えるために少しバギーです。私は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. 

答えて

2

は、私は、ログの猫になりましたがクラッシュからアプリを停止するために管理しています

JSONArray arr = new JSONArray(new String(response)); 
+0

おかげで、してみてくださいW/System.errを見ることができます:org.json.JSONException:タイプjの接続値ava.lang.StringをJSONArrayに変換することはできません –

+0

これは、オブジェクトが実際にJSONArrayでないか、不要な文字があることを意味します。あなたはこれを試すことができます 新しいJSONObject( "{" +新しい文字列(レスポンス)+ "}") またはあなたの応答の例を投稿してください。本当に何がありますか? – user007

+0

あなたのアドバイスありがとう、すべてが現在期待どおりに動作しています! –

関連する問題