2011-02-09 54 views
9

以下是錯誤:我在SQLite(Android)中收到數據庫對象未關閉異常,但我明確地關閉了我的數據庫...幫助?

02-08 16:35:00.899:ERROR /數據庫(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(); 
    } 
} 

正如你可以在我的//註釋,我打開和關閉數據庫,但我仍然得到錯誤指出行看到。這裏有些奇怪,但是錯誤的來源在SQLite的open()方法中。

ERROR /數據庫(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(); 
} 

這些都是直接從谷歌的記事本教程,他們在不同的情況下爲我工作了100%。有沒有人知道這裏發生了什麼?非常感謝。

+0

@psyhclo我會需要看到你的活動在那裏幫助你,如果你可以發佈它,我會盡力幫助 – JMRboosties 2011-02-09 06:06:24

+0

好吧,我已將活動添加到帖子末尾。你可以檢查相同的鏈接。 http://www.stackoverflow.com/questions/4921550/where-to-close-the-database謝謝。 – rogcg 2011-02-09 14:03:13

回答

12

問題不在於數據庫對象,而在於光標 - 您有一個打開的光標位於某處。

確保在關閉數據庫之前所有遊標都已關閉。 (順便說一下,如果你想要看起來,你可以創建一個ContentProvider,使用SQLiteOpenHelper,而不用擔心關閉它。)

0

在我調查類似問題時查看此內容。我注意到的一種可能性是,如果因爲任何原因在循環中拋出異常,那麼即使正確處理它,也會退出循環,而最後一次open()從不會有相應的關閉。 爲了解決這個問題,你想把close()語句放在finally {}塊中。此外,我沒有看到任何理由爲循環的每次迭代創建並打開一個新的遊標。把它移到循環的外面,這樣只有一個open(),相應的close()就是finally塊中的那個。 (或者你可以有另一個try-catch結構循環,使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 
} 

}

相關問題