sqlite - 但是,我正在获取数据库对象getting getting我得到的是一个数据库对象,但没有关闭异常 帮助?

  显示原文与译文双语对照的内容
0 0

以下是错误:

02-08 16: 35: 00.899: 错误/数据库( 468 ): android.database.sqlite.DatabaseObjectNotClosedException: 应用程序没有关闭在打开的游标或者数据库对象

不过,我是这样的。这里是这个问题发生的方法:


 public static void getUpdates(String username, Context context) {
 HttpClient httpClient = new DefaultHttpClient();
 HttpPost httpPost = new HttpPost("http://10.0.2.2/tag/appgetfriendinfo.php");

 try {
 List<NameValuePair> nVPs = new ArrayList<NameValuePair>();
 nVPs.add(new BasicNameValuePair("username", username));

 httpPost.setEntity(new UrlEncodedFormEntity(nVPs));
 HttpResponse response = httpClient.execute(httpPost);

 ResponseHandler<String> rHandler = new BasicResponseHandler();
 String result = rHandler.handleResponse(response);

 JSONArray jArray = new JSONArray(result);
 for(int i = 0; i <jArray.length(); i++) {
 JSONObject jObj = jArray.getJSONObject(i);
 String userCheck = jObj.getString("username");
 TagDBAdapter dbHelper = new TagDBAdapter(context);
 dbHelper.open();//OPENING THE DATABASE
 Contact contact = new Contact();

 String first = jObj.getString("firstname");
 String last = jObj.getString("lastname");
 String name = first +"" + last;

 contact.setUsername(jObj.getString("username"));
 contact.setFirstName(first);
 contact.setLastName(last);
 contact.setName(name);
 contact.setPhoneNumber(jObj.getString("phonenumber"));
 contact.setEmail(jObj.getString("email"));
 contact.setHomePhone(jObj.getString("homephone"));
 contact.setWorkPhone(jObj.getString("workphone"));

 if(dbHelper.checkForExisting(userCheck) == true) {
 dbHelper.createContact(contact);
 }
 else {
 dbHelper.updateContactAuto(userCheck, contact);
 }
 dbHelper.close();//CLOSING THE DATABASE
 }

 } catch(ClientProtocolException e) {
 Log.e("GETUPDATES","CPE", e);
 e.printStackTrace();
 } catch(IOException e) {
 Log.e("GETUPDATES","IOE", e);
 e.printStackTrace();
 } catch(JSONException e) {
 Log.e("GETUPDATES","JSONE", e);
 e.printStackTrace();
 }
}

就像我在//comments, 中所提到的行上看到的,我正在打开和关闭数据库,但我仍然得到错误。 下面是奇怪的地方,错误源在SQLite方法的open() 中。

错误/数据库( 468 ): 在 com.tagapp.android.TagDBAdapter.open(TagDBAdapter.java:62)

这是什么?


/**THESE ARE MY DBADAPTER'S OPEN AND CLOSE METHODS*/

 public TagDBAdapter open() throws SQLException {
 mDBHelper = new DatabaseHelper(m_context);
 mDb = mDBHelper.getWritableDatabase();
 return this;
}

public void close() {
 mDBHelper.close();
}

这些是来自google教程的notepad straight,他们在不同的实例中工作了 100% 。 谁知道这里发生了什么? 非常感谢

时间: 原作者:

0 0

问题是 NOT 数据库对象,它是光标- 你有一个打开的游标在某处。

请确保在关闭数据库之前关闭所有游标。 ( 如果你想 fancy,你可以创建一个内容提供商,使用SQLiteOpenHelper和 NOT 担心关闭它。)

原作者:
0 0

我正在调查类似的问题。 我注意到的一个可能是,如果你在循环中抛出异常,由于任何原因,即使你正确处理了它,最后一个 open() 也不会有相应的关闭。 要修复这个问题,你需要将 close() 语句放在最后一个 {} 块中。 而且,我没有看到任何理由为循环的每次迭代创建和打开一个新的游标。 在循环外移动,所以只有一个 open() 和对应的close(),最后一个块中的。 ( 另外,你还可以在中使用另一个try构造 ,这样 close() 就会一直运行。)

例如:


public static void getUpdates(String username, Context context) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://10.0.2.2/tag/appgetfriendinfo.php");
TagDBAdapter dbHelper;//DECLARE THIS HERE SO IT CAN BE ACCESSED OUTSIDE OF try BLOCK
try {
 List<NameValuePair> nVPs = new ArrayList<NameValuePair>();
 nVPs.add(new BasicNameValuePair("username", username));

 httpPost.setEntity(new UrlEncodedFormEntity(nVPs));
 HttpResponse response = httpClient.execute(httpPost);

 ResponseHandler<String> rHandler = new BasicResponseHandler();
 String result = rHandler.handleResponse(response);

 JSONArray jArray = new JSONArray(result);

//MOVED TO OUTSIDE OF LOOP
 dbHelper = new TagDBAdapter(context);
 dbHelper.open();//OPENING THE DATABASE
 for(int i = 0; i <jArray.length(); i++) {
 JSONObject jObj = jArray.getJSONObject(i);
 String userCheck = jObj.getString("username");
 Contact contact = new Contact();

 String first = jObj.getString("firstname");
 String last = jObj.getString("lastname");
 String name = first +"" + last;

 contact.setUsername(jObj.getString("username"));
 contact.setFirstName(first);
 contact.setLastName(last);
 contact.setName(name);
 contact.setPhoneNumber(jObj.getString("phonenumber"));
 contact.setEmail(jObj.getString("email"));
 contact.setHomePhone(jObj.getString("homephone"));
 contact.setWorkPhone(jObj.getString("workphone"));

 if(dbHelper.checkForExisting(userCheck) == true) {
 dbHelper.createContact(contact);
 }
 else {
 dbHelper.updateContactAuto(userCheck, contact);
 }
 }

} catch(ClientProtocolException e) {
 Log.e("GETUPDATES","CPE", e);
 e.printStackTrace();
} catch(IOException e) {
 Log.e("GETUPDATES","IOE", e);
 e.printStackTrace();
} catch(JSONException e) {
 Log.e("GETUPDATES","JSONE", e);
 e.printStackTrace();
} finally {
 dbHelper.close();//CLOSING THE DATABASE
}

%7D

...