2016-09-23 159 views
0

我正在学习如何将数据发送到外部数据库并且代码有效,但至少可以说是有点小错误。我正在使用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(); 
    } 
} 

登录猫而不是

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:Value连接类型j ava.lang.String不能转换为JSONArray –

+0

这意味着你的对象不是真的是JSONArray或者有一些不需要的字符。你可以试试这个新的JSONObject(“{”+ new String(response)+“}”) 或者...发表你的回应的例子。真的有什么。 – user007

+0

谢谢你的建议,现在一切都按预期工作! –

相关问题