我正在构建的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代码本身的问题?我不太清楚如何理解日志中出现的错误。
答案 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。