2016-09-23 3 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(); 
    } 
} 

Вход кот

   --------- 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(response); 

попробовать

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

Спасибо, что удалось остановить приложение от сбоев, однако в настоящее время в журнале кошки I может видеть W/System.err: org.json.JSONException: значение Подключено типа j ava.lang.String не может быть преобразован в JSONArray –

+0

Это означает, что ваш объект не является JSONArray или есть некоторые нежелательные символы. Вы можете попробовать этот новый JSONObject ("{" + new String (response) + "}") Или ... отправьте пример своего ответа. Что там на самом деле. – user007

+0

Благодарим вас за все ваши советы, теперь все работает так, как ожидалось! –

Смежные вопросы