2011-11-01 2 views
14

Trước hết, sửa tôi nếu tôi sai, nhưng nếu bạn đóng một kết nối cơ sở dữ liệu, bạn không thể sử dụng Con trỏ bạn nhận được từ nó, đúng không?Android - Có thể sử dụng con trỏ SQLite sau khi đóng cơ sở dữ liệu không?

db.open(); 
Cursor c = db.query(true, "MyTable", columns, null, null, null, null, null, null); 
db.close(); 

// The Cursor is empty now because the db was closed... 
c.moveToNext(); 
Log.v(TAG, c.toString(0)); 

Vì vậy, có cách nào để sử dụng Con trỏ sau khi đóng cơ sở dữ liệu không? Giống như là có cách nào để vượt qua nó ở nơi khác và sử dụng nó giống như một đối tượng? Hay bạn luôn phải để kết nối cơ sở dữ liệu mở cho đến khi bạn hoàn thành con trỏ?

Trả lời

3

Trước hết, chính xác cho tôi nếu tôi là sai, nhưng nếu bạn đóng một kết nối cơ sở dữ liệu , bạn không thể sử dụng con trỏ bạn nhận được từ nó, đúng không?

Đúng.

Vì vậy, có cách nào để sử dụng Con trỏ sau khi đóng cơ sở dữ liệu không?

Tôi không nghĩ vậy. Tôi luôn đóng cơ sở dữ liệu khi hoàn tất với Con trỏ, ngay cả khi tôi chuyển con trỏ tới đối tượng Cursor khác.

Giống như có cách nào để truyền nó ở nơi khác và sử dụng nó giống như một đối tượng ?

Tạo phương pháp sẽ return cursorobject; và sử dụng phương pháp ở bất cứ đâu bạn cần. (Cũng tạo phương pháp sẽ đóng db sau khi bạn đã hoàn tất)

Hoặc bạn luôn phải để kết nối cơ sở dữ liệu mở cho đến khi bạn được thực hiện với con trỏ?

Nếu không con trỏ sẽ bị hỏng.

0

Tôi đã sử dụng cursor.moveToLast() và cho phép tôi sử dụng con trỏ để lặp lại sau khi đóng cơ sở dữ liệu. Tôi không có ý tưởng nếu điều này là cố ý.

Tuy nhiên, có vẻ như mục đích sử dụng khung công cụ trợ giúp mở, là mở db khi khởi động hoạt động và đóng nó khi Activity bị hủy.

Trong một AsyncTask từ bên trong onCreate() ...

new StartupTask().execute(); 

Các AsyncTask Thread.sleep() dưới đây là chỉ để cho đủ thời gian để hiển thị hộp thoại để bạn có thể nhìn thấy nó làm việc. Rõ ràng là lấy ra khi bạn chơi xong. ;)

private class StartupTask extends AsyncTask 
{ 

    private ProgressDialog progressDialog; 

    @Override 
    protected Object doInBackground(final Object... objects) 
    { 
     openHelperRef.getWritableDatabase(); 
     try 
     { 
      Thread.sleep(5000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       progressDialog = ProgressDialog.show(
        MyActivity.this, "Title", 
        "Opening/Upgrading the database, please wait", true); 
      } 
     }); 
    } 

    @Override 
    protected void onPostExecute(Object object) 
    { 
     super.onPostExecute(object); 
     progressDialog.dismiss(); 
    } 

} 

trong onDestroy() ... openHelper.close();

Nếu không, bạn sẽ không thể sử dụng Android SimpleCursorAdapter hoặc bất kỳ thứ gì như thế. Tất nhiên các tài liệu andriod rất thiếu trong lĩnh vực này.Nhưng, hãy nhớ, getWriteableDatabase() luôn trả về cùng một tham chiếu được lưu trong bộ nhớ cache, mỗi lần, trừ khi bạn đóng nó lại. Vì vậy, nếu bạn đi đóng mà tham khảo willy-nilly, chủ đề nền và những gì không, đang sử dụng cùng một cơ sở dữ liệu, S W chết.