使用循环

时间:2015-07-30 21:26:03

标签: php android sql json sqlite

我正在构建的Android应用程序的一部分要求我在sqlite数据库中保存用户列表。然后,用户可以输入活动,该活动显示当前存储在列表视图中的sqlite数据库中的用户列表。

然后我尝试使用Async Tasks,JSON和PHP服务实现一个将此用户列表同步到远程数据库的函数,方法是使用FOR LOOP循环遍历数据库表'users'

问题是同步仅适用于列表中的第一项。在将此操作传递到远程数据库之后,活动崩溃。 日志显示:

E / JSON Parser:解析数据时出错org.json.JSONException:java.lang.String类型的值数据无法转换为JSONObject

E / AndroidRuntime:致命异常:AsyncTask#3     处理:example.prguru.com.pi_prototype_30,PID:5139     java.lang.RuntimeException:执行doInBackground()时发生错误             在android.os.AsyncTask $ 3.done(AsyncTask.java:304) ...

引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String org.json.JSONObject.toString()'             at example.prguru.com.pi_prototype_30.ShowAdmins $ syncUser.doInBackground(ShowAdmins.java:137)             at example.prguru.com.pi_prototype_30.ShowAdmins $ syncUser.doInBackground(ShowAdmins.java:87)

java代码中的第137行是:

 Log.d("Sync Attempt", jobj.toString());

PHP代码:

require_once 'config.php';

if(!empty($_POST)){
$row = $_POST['table_id'];
$type = $_POST['type'];
$id_num = $_POST['id_number'];
$name = $_POST['name'];
$email  = $_POST['email'];
$course = $_POST['course'];
$password = $_REQUEST['password'];

$ins = mysql_query("INSERT INTO pi_prototype_inventory_30.users (table_id, type, id_number, name, email, course, password) 
VALUES('$row','$type','$id_num','$name', '$email', '$course', '$password')");

if(!$ins)
{
    echo (mysql_error());
}
else
{
    echo ("data inserted");
}
}
else {
echo (mysql_error());
}

SYNC CLASS:

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub
        // Check for success tag
        int success;

        DBHandler dbAdapter = DBHandler.getDBHandlerInstance(getApplicationContext());
        try {
            dbAdapter.createDataBase();
        } catch (IOException e) {
            Log.i("*** select ", e.getMessage());
        }

        dbAdapter.openDataBase();
        String query = "SELECT * FROM users";
        ArrayList<ArrayList<String>> stringList = dbAdapter.selectRecordsFromDBList(query, null);
        dbAdapter.close();

        try {

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(7);
            for (int i = 0; i < stringList.size(); i++) {
                ArrayList<String> list = stringList.get(i);
                nameValuePairs.add(new BasicNameValuePair("table_id", list.get(0)));
                nameValuePairs.add(new BasicNameValuePair("type", list.get(1)));
                nameValuePairs.add(new BasicNameValuePair("id_number", list.get(2)));
                nameValuePairs.add(new BasicNameValuePair("name", list.get(3)));
                nameValuePairs.add(new BasicNameValuePair("email", list.get(4)));
                nameValuePairs.add(new BasicNameValuePair("course", list.get(5)));
                nameValuePairs.add(new BasicNameValuePair("password", list.get(6)));

                Log.d("Request!", "Starting!");

                jobj = jsonParser.makeObjHttpRequest(REG_URL, "POST", nameValuePairs);

                Log.d("Sync Attempt", jobj.toString());

            }//forLoop
                success = jobj.getInt(TAG_SUCCESS);
                if (success == 1){
                    Log.d("SYNCED!", jobj.toString());
                    return jobj.getString(TAG_MESSAGE);
                }
                else {
                    Log.d("Sync failure!", jobj.getString(TAG_MESSAGE));
                    return jobj.getString(TAG_MESSAGE);
                }



        } catch (JSONException e){
            e.printStackTrace();
        }
        return null;
    }//doInBackground

JSON PARSER CLASS:

public JSONObject makeObjHttpRequest(String url, String method,
                                  List<NameValuePair> params) {

    // Making HTTP request
    try {

        // check for request method
        if(method.equals("POST")){
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }else if(method.equals("GET")){
            // request method is GET
            DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        Log.i("tagconvertstr", "["+json+"]");
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}

我是否需要在PHP代码中实现某种循环,以便从列表中接受多个条目?我不知道如何进行编码,因为我永远无法确定在任何时候都需要同步多少条目。或者是java代码本身的问题?我不太清楚如何理解日志中出现的错误。

1 个答案:

答案 0 :(得分:0)

您的解析器正在返回一个null对象。 Logcat非常清楚这一点。首先是这条消息:

E/JSON Parser﹕ Error parsing data org.json.JSONException: Value data of type java.lang.String cannot be converted to JSONObject

这与解析器中的一个catch块完全匹配:

try {
    Log.i("tagconvertstr", "["+json+"]");
    jObj = new JSONObject(json);
} catch (JSONException e) {
    Log.e("JSON Parser", "Error parsing data " + e.toString()); // <- HERE
}

如果此块中抛出异常,则不会分配jObj。如果您希望解析器永远不会返回null,那么您需要在catch块中分配jObj。否则,您的其他代码需要在尝试使用它之前检查返回的值是否为null。