2010-10-10 39 views
10

Cách tốt nhất để chia sẻ một SQLite DB giữa một số hoạt động là gì? Các bảng từ DB được hiển thị trong ListView và việc xóa/chèn các bản ghi sẽ được thực hiện. Tôi nghe nói về Dịch vụ, nhưng không tìm thấy ví dụ cho vấn đề của tôi. Bây giờ tôi có lớp SQLiteOpenHelper để mở DB. Tôi đóng db trong OnPause() và mở nó trong onResume(). Nhưng tôi không thể chèn dữ liệu vào db từ hoạt động phụ, smth đi sai.Cơ sở dữ liệu SQLite Android được chia sẻ giữa các hoạt động

Trả lời

20

Tạo lớp Ứng dụng cho ứng dụng của bạn. Điều này sẽ vẫn hoạt động trong bộ nhớ miễn là bất kỳ phần nào của Ứng dụng của bạn đang chạy. Bạn có thể tạo DB của mình từ phương thức onCreate và làm sạch nó trong phương thức onTerminate. (Lưu ý rằng không có sự bảo đảm rằng onTerminate sẽ được gọi, vì vậy bạn nên cẩn thận về những gì bạn phụ thuộc vào đây. Tuy nhiên, vì một cơ sở dữ liệu SQLite chỉ là một tập tin, và được xóa sạch, hoạt động đóng là lịch sự hơn một sự cần thiết.)

Bạn có thể truy cập ứng dụng từ bất kỳ Hoạt động nào qua "getApplication", do đó, DB sẽ luôn có sẵn cho bạn.

Để biết thêm thông tin, hãy xem http://developer.android.com/guide/appendix/faq/framework.html#3.

Cập nhật:

Khi được yêu cầu, đây là ví dụ về cách sử dụng getApplication. Nó thực sự cực kỳ đơn giản.

SQLiteDatabase mDB; 
    @Override protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mDB = ((MyApplication)getApplication()).mDB; 
    } 

Nếu mọi hoạt động bao gồm mã này, thì mọi hoạt động sẽ có trường MDB riêng tham chiếu cùng một đối tượng DB được chia sẻ cơ bản.

+0

Vì vậy, bất kỳ hoạt động sẽ có thể đọc dữ liệu/ghi mà không mâu thuẫn? Bạn có thể hiển thị một số ví dụ cho getApplication() metod không? –

+1

Tất cả các hoạt động, dịch vụ, v.v. sử dụng cùng chuỗi sự kiện, do đó không có rủi ro về các sự cố đồng bộ hóa. Bạn nên sử dụng "startManagingCursor" cho bất kỳ con trỏ nào mà bạn sử dụng cho bộ điều hợp trong các hoạt động của bạn để chúng sẽ bị vô hiệu hoá và được truy vấn lại khi bạn di chuyển từ một hoạt động này sang hoạt động khác. – beekeeper

+0

Thay thế SQLiteDatabase bằng SQLiteOpenHelper sẽ ổn chứ? –

3

Bạn có thể làm điều này thực hiện một lớp BaseActivity gì được mở rộng bởi tất cả các lớp học Hoạt động trong ứng dụng:

public class BaseActivity extends Activity { 

    protected static SQLiteOpenHelper database; 

    @Override 
    protected void onPause() { 

      // TODO close database 

      super.onPause(); 
    } 

    @Override 
    protected void onResume() { 

      super.onResume(); 

      // TODO open database 
    } 
} 




public class OneSubActitivy extends BaseActivity { 

    // methods using database from BaseActivity 
} 
+0

Sự khác biệt giữa triển khai hoạt động cơ sở và triển khai onResume và onPause cho từng hoạt động là gì? –

+0

Chỉ thực hiện một lần mã trong BaseActivity. Bạn phải viết mã chung cho tất cả các hoạt động trong lớp cơ sở ... – caligari

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