2013-04-04 74 views
14

我在Android上搜索有關SQLite的信息,並閱讀了一些關於Android編程的書籍的一些章節,但我不知道如何真正在Android上使用SQLite。在Android上正確使用Sqlite(SQLiteOpenHelper,連接,主線程等...)

我正在開發一個具有Activities,Services和BroadcastReceivers的應用程序,並且它們都必須讀取和寫入數據庫中的數據。所以我有一些問題:

  • 哪裏是創建SQLiteOpenHelper實例的最佳位置?我讀過這個,看來最好的方法是隻有SQLiteOpenHelper所有的應用程序。
  • 何時以及何地需要通過調用dbHelper.getReadableDatabase()(或​​)得到SQLiteDatabase對象?我需要在每個查詢上完成它,每次查詢後關閉它?
  • 我讀過,我不應該在主線程中執行數據庫操作,所以我爲每個數據庫操作創建一個異步任務,我在一個Activity中執行,這是最好的方法嗎?
+0

感謝您的反對票¬¬ – 2013-04-04 10:48:46

+2

創建SQLiteOpenHelper實例的最佳位置在'ContentProvider'的'onCreate'方法中......使用'getWritableDatabase()'的最佳位置在'delete' /''在'query'中插入'ContentProvider'和'getReadableDatabase()'的''''update'方法......你不需要關閉這些數據庫......爲了避免在UI上使用數據庫操作,你可以使用'Loaders'與CP ...我知道,寫CP是痛苦的**,但與寫得很好的CP你避免了很多問題(如從多個theread訪問數據庫) – Selvin 2013-04-04 10:50:30

+0

謝謝Selvin。我想在不使用ContentProvider的情況下使用SQLite,因爲我不需要與其他應用程序共享任何數據。我認爲我不需要我的應用程序中的內容提供者:http://touchlabblog.tumblr.com/post/32793099735/training-sqlite#_=_。如果不使用ContentProvider,沒有辦法正確使用SQLite嗎? – 2013-04-04 10:55:32

回答

7

開始對大部分的問題是相當主觀的。但讓我試試吧

哪裏是創建SQLiteOpenHelper實例的最佳位置?我對 贊成這一點,似乎最好的辦法是隻有 SQLiteOpenHelper所有的應用程序。

你可以在你的項目擴展SQLiteOpenHelper創建一個類。當您在應用程序中訪問多個Activities中的相同數據庫時,這會很有幫助。

,時間和地點,我需要通過調用 dbHelper.getReadableDatabase(得到SQLiteDatabase對象)(或getWritableDatabase)?我需要對每個查詢執行 ,每次查詢後關閉它?

這將在類,它擴展SQLiteOpenHelper來完成。例如:(這是從在該交的端部設置的Vogella物品的摘錄)

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

並且在一個活動將使用類別:

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

而一個CursorDatabase連接當您完成Database的讀取,修改,添加等操作時,應該關閉Activity

當您閱讀稍後鏈接的網頁時,上面的代碼將有意義。

我readed,我應該不會做數據庫操作的主要 線程,所以我創建的每個數據庫操作我在做活動的 異步任務,這是最好的辦法嗎?

理想情況下,是的。我個人建議使用Asynctask,特別是當你要處理大型記錄集時。

最後,我建議你閱讀Lars Vogella的本教程:http://www.vogella.com/articles/AndroidSQLite/article.html。它將解決您的大部分疑慮和疑問。祝你好運。 :-)

+0

謝謝IceMAN!你的回答和Vogella的文章幫助了我很多! – 2013-04-04 11:20:06

+0

@SergioViudes:不客氣。他還有其他很好的教程,我覺得非常有幫助。我相信你也會。 :-) – 2013-04-04 11:22:26

0

1.創建SQLiteOpenHelper實例的最佳位置是哪裏?

SQLiteOpenHelper可以幫助您連接使用它定義的表。因此,您可以在一個SQLiteOpenHelper類中定義所有表。

2.什麼時候需要通過調用dbHelper.getReadableDatabase()(或getWritableDatabase)來獲取SQLiteDatabase對象?

每當你想要寫在定義表中的數據,您將需要調用getWritableDatabase,並從他們閱讀你將需要getReadableDatabase

您可以CRUD(創建,檢索,更新,刪除)用於這些目的的功能。

3. 不要在主線程中做數據庫操作!

我不確定這件事。

以及這裏有一個鏈接,你與SQLite- http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

+0

感謝您的回答。關於SQLiteOpenHelper,我知道它是什麼,事實上,我做到了,我的應用程序正在使用我的SQLite數據庫,但是我需要創建多個SQLiteOpenHelper,因爲只使用一個從不同的線程訪問數據庫,導致我的應用程序失敗。我認爲我應該只創建1個(http://touchlabblog.tumblr。com/post/32793099735/training-sqlite#_ = _),所以我不需要如何處理它。 關於getReadableDatabase/getWritableDatabase,我喜歡你的教程:打開連接 - >查詢 - >關閉連接。 – 2013-04-04 11:02:13

相關問題