【发布时间】:2015-10-22 10:25:42
【问题描述】:
我正在构建的部分 android 应用程序要求我将用户列表保存在 sqlite 数据库中。然后,用户可以输入一个活动,该活动在列表视图中显示当前存储在 sqlite 数据库中的用户列表。
然后,我尝试使用异步任务、JSON 和 PHP 服务,通过使用 FOR LOOP 循环遍历数据库表 'users' 来实现一个函数,以将此用户列表同步到远程数据库.
问题在于同步仅适用于列表中的第一项。将其传递到远程数据库后,活动将崩溃。 日志显示:
E/JSON Parser﹕解析数据时出错 org.json.JSONException: java.lang.String 类型的值数据无法转换为 JSONObject
E/AndroidRuntime: FATAL EXCEPTION: 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()” 在 example.prguru.com.pi_prototype_30.ShowAdmins$syncUser.doInBackground(ShowAdmins.java:137) 在 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());
}
同步类:
@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 解析器类:
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代码本身的问题?我不太清楚如何理解日志中出现的错误。
【问题讨论】:
-
Caused by: java.lang.NullPointerException-- 你知道 NullPointerException 是什么吗? -
是的,我知道——这意味着它没有指向任何东西。但是为什么 jobj 会为空呢?我在 onCreate 方法中将它初始化为一个新的 JSONObject,并在这段代码中给它一个值 jobj = jsonParser.makeObjHttpRequest(REG_URL, "POST", nameValuePairs);
-
那个方法可以返回null吗?
-
这就是我在另一个类似应用程序中设置它的方式,它工作正常 - 返回 null 不会影响它。所以我不确定为什么它不能在这个应用程序中返回 null。
-
在另一个应用程序中工作并不能证明它正在运行您的应用程序。如果
.makeObjHttpRequest()可以返回null,那么jobj可以为null,并且对toString()的调用将导致NullPointerException。
标签: php android sql json sqlite