android - 数据插入数据库,然后应用程序崩溃

标签 android mysql database sqlite android-studio

我正在学习如何将数据发送到外部数据库,并且代码可以工作,但至少可以说它有点问题。我正在使用 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.

最佳答案

而不是

JSONArray arr = new JSONArray(response);

尝试

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

关于android - 数据插入数据库,然后应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39669335/

相关文章:

php - 插入 codeigniter 时出错

database - 优化 Cassandra 查询性能

android - 是否可以统计我打开谷歌的次数?

android - 有什么方法可以让 flutter 本地通知在android中持续播放声音,除非通知被点击?

php - 获取存储过程 Laravel 的结果

mysql - 从 mySql 查询中排除负面结果

php - 数据库管理 php mysql

php - 阿拉伯字符编码问题: UTF-8 versus Windows-1256

java - Android 将异步下载的图像映射到 ListView

java - 为什么 Android 版 FaceDetectionListener 无法检测到眼睛坐标