2013-04-04 24 views
14

Tôi đang tìm kiếm thông tin về SQLite trên Android và đọc một số chương của một số sách về Lập trình Android, nhưng tôi không biết để thực sự sử dụng SQLite trên Android một cách chính xác.Sử dụng đúng Sqlite trên Android (SQLiteOpenHelper, kết nối, chủ đề chính, v.v ...)

Tôi đang phát triển một ứng dụng có Hoạt động, Dịch vụ và BroadcastReceivers và tất cả chúng phải đọc và ghi dữ liệu trong cơ sở dữ liệu. Vì vậy, tôi có một số câu hỏi:

  • Nơi nào là nơi tốt nhất để tạo ví dụ SQLiteOpenHelper? Tôi đọc về điều này, và có vẻ như cách tốt nhất là chỉ có SQLiteOpenHelper cho tất cả ứng dụng.
  • Khi nào và ở đâu, tôi có cần phải nhận đối tượng SQLiteDatabase bằng cách gọi dbHelper.getReadableDatabase() (hoặc getWritableDatabase)? Tôi cần phải làm điều đó trên mỗi truy vấn, đóng nó sau mỗi truy vấn?
  • Tôi đọc rằng tôi không bao giờ nên thực hiện các thao tác cơ sở dữ liệu trong chuỗi chính, vì vậy tôi đang tạo một tác vụ Async cho mỗi hoạt động cơ sở dữ liệu tôi làm trong một Hoạt động, đây có phải là cách tốt nhất không?
+0

Cảm ơn bạn đã bỏ phiếu tiêu cực ¬¬ –

+2

nơi tốt nhất để tạo cá thể SQLiteOpenHelper nằm trong phương thức 'onCreate' của' ContentProvider' ... tốt nhất để sử dụng 'getWritableDatabase()' là trong 'delete' /' phương thức insert'/'update' của' ContentProvider' và 'getReadableDatabase()' trong 'truy vấn' ... bạn không cần đóng các cơ sở dữ liệu đó ... để tránh sử dụng thao tác cơ sở dữ liệu trên UI, bạn có thể dùng' Loaders' với CP ... tôi biết rằng viết CP là đau trong ** nhưng với CP cũng bằng văn bản bạn tránh nhiều vấn đề (chẳng hạn như truy cập cơ sở dữ liệu từ nhiều theread) – Selvin

+0

Cảm ơn Selvin. Tôi muốn sử dụng SQLite mà không cần sử dụng ContentProvider, vì tôi không cần chia sẻ bất kỳ dữ liệu nào với các ứng dụng khác. Tôi đã đọc rằng tôi không cần nhà cung cấp nội dung trong ứng dụng của mình: http://touchlabblog.tumblr.com/post/32793099735/training-sqlite#_=_. Không có cách nào để sử dụng SQLite một cách chính xác mà không cần sử dụng một ContentProvider? –

Trả lời

7

Hầu hết các câu hỏi là khá chủ quan. Nhưng hãy để tôi lấy nó tại số

Nơi tốt nhất để tạo cá thể SQLiteOpenHelper ở đâu? Tôi đã đọc về điều này và dường như cách tốt nhất là chỉ có SQLiteOpenHelper cho tất cả ứng dụng.

Bạn có thể tạo một Lớp trong dự án của bạn kéo dài SQLiteOpenHelper. Điều này hữu ích khi bạn truy cập cùng một cơ sở dữ liệu trong nhiều ứng dụng Activities trong ứng dụng của bạn.

Khi nào, và ở đâu, tôi cần phải có được đối tượng SQLiteDatabase bằng cách gọi dbHelper.getReadableDatabase() (hoặc getWritableDatabase)? Tôi cần phải thực hiện trên mỗi truy vấn, đóng nó sau mỗi truy vấn?

Điều này sẽ được thực hiện trong Lớp kéo dài SQLiteOpenHelper. Ví dụ: (đây là một đoạn trích từ một bài báo Vogella cung cấp ở phần cuối của bài này)

public void open() throws SQLException { 
    database = dbHelper.getWritableDatabase(); 
} 

Và trong một hoạt động mà sẽ sử dụng Class:

CommentsDataSource datasource = new CommentsDataSource(this); 
datasource.open(); 

Và một Cursor và các kết nối Database được thực hiện từ Activity phải được đóng khi bạn hoàn tất việc tìm nạp, sửa đổi, thêm, v.v. với Database.

Đoạn mã trên sẽ có ý nghĩa khi bạn đã đọc trang web được liên kết sau này.

Tôi readed mà tôi không bao giờ nên làm các hoạt động cơ sở dữ liệu trong chủ đề chính, vì vậy tôi tạo ra một nhiệm vụ Async cho mỗi hoạt động cơ sở dữ liệu tôi làm trong một hoạt động, đây là cách tốt nhất?

Lý tưởng nhất là có. Cá nhân tôi khuyên bạn nên sử dụng Asynctask đặc biệt là khi bạn xử lý các tập hợp lớn.

Cuối cùng, tôi khuyên bạn nên đọc hướng dẫn này của Lars Vogella: http://www.vogella.com/articles/AndroidSQLite/article.html. Nó sẽ giải quyết hầu hết các mối quan tâm và truy vấn của bạn. Chúc may mắn. :-)

+0

Cảm ơn IceMAN! Câu trả lời của bạn và bài viết của Vogella đã giúp tôi rất nhiều! –

+0

@SergioViudes: Bạn được chào đón. Anh ấy cũng có những hướng dẫn hay khác mà tôi thấy rất hữu ích. Tôi chắc chắn bạn cũng vậy. :-) –

0

1.Có nơi nào tốt nhất để tạo cá thể SQLiteOpenHelper?

SQLiteOpenHelper giúp bạn kết nối với các bảng bạn đã định nghĩa sử dụng it.So bạn có thể xác định tất cả các bảng của bạn trong một lớp SQLiteOpenHelper.

2.Khi nào và ở đâu, tôi có cần nhận đối tượng SQLiteDatabase bằng cách gọi dbHelper.getReadableDatabase() (hoặc getWritableDatabase) không?

Bất cứ khi nào bạn muốn ghi dữ liệu trong bảng được định nghĩa của bạn, bạn sẽ cần phải gọi getWritableDatabase và để đọc từ họ, bạn sẽ cần getReadableDatabase

Bạn có thể làm CRUD (Create, Retrieve, Update, Delete) cho các mục đích này.

3. Không bao giờ thực hiện các thao tác cơ sở dữ liệu trong chuỗi chính!

Tôi không chắc về điều này.

tốt ở đây là một liên kết để bạn có thể bắt đầu vào với SQLite- http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

+0

Cảm ơn câu trả lời của bạn. Về SQLiteOpenHelper, tôi biết nó là gì, trên thực tế, tôi đã làm và ứng dụng của tôi đang làm việc với cơ sở dữ liệu SQLite, nhưng tôi cần tạo nhiều hơn một SQLiteOpenHelper vì chỉ sử dụng một cơ sở dữ liệu truy cập từ các luồng khác nhau . Tôi đã đọc rằng tôi chỉ nên tạo 1 (http: //touchlabblog.tumblr.com/post/32793099735/training-sqlite # _ = _), vì vậy tôi không cần chính xác cách xử lý nó. Về getReadableDatabase/getWritableDatabase, tôi đang làm như hướng dẫn của bạn: mở kết nối -> truy vấn -> đóng kết nối. –

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