2011-01-09 27 views
9

Các tài liệu tại http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29 trạng thái:Các ứng dụng Android nên gọi hàm getWritableDatabase trong SQLite ở đâu?

Cơ sở dữ liệu nâng cấp có thể mất một thời gian dài, bạn không nên gọi phương thức này [getWritableDatabase] từ thread chính ứng dụng, bao gồm từ ContentProvider.onCreate().

Điều này đặt ra câu hỏi: để thực hành tốt nhất, nên getWritableDatabase được gọi từ đâu?

Cảm giác của tôi là, có lẽ, nó nên được gọi một lần khi khởi chạy ứng dụng với một cuộc gọi lại để đánh dấu cơ sở dữ liệu là sẵn sàng. Điều này có đúng không?

Trả lời

4

Đối với cơ sở dữ liệu nhỏ và nhanh nhẹn, tôi cho rằng đây không phải là vấn đề lớn.

Nếu không, tôi sẽ sử dụng số AsyncTask luôn tuyệt vời, được gọi từ onCreate.

2

Nó có thể được gọi từ bất kỳ đâu, nhưng không được gọi từ chuỗi giao diện người dùng vì bạn không biết quá trình sẽ mất bao lâu (đặc biệt là với các hệ thống tệp khác nhau đang sử dụng). Ngay cả khi bạn biết cơ sở dữ liệu nên nhỏ, bạn không biết về hệ thống tệp (nó có thể thực hiện nhiều hơn một công việc cùng một lúc không? Có hàng nghìn công việc khác đang chờ đợi trong hàng không?). Bạn có thể sử dụng số AsyncTask hoặc Thread để gọi getWriteableDatabase.

0

Dường 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();

Các vấn đề liên quan