Правильное использование Sqlite на Android (SQLiteOpenHelper, подключения, основной поток и т.д.)

Я ищу информацию о SQLite на Android и прочитал некоторые главы некоторых книг по программированию на Android, но я не знаю, как правильно использовать SQLite на Android правильно.

Я разрабатываю приложение, в котором есть действия, службы и BroadcastReceivers, и все они должны читать и записывать данные в базе данных. Поэтому у меня есть несколько вопросов:

  • Где лучше всего создать экземпляр SQLiteOpenHelper? Я читал об этом, и кажется, что лучший способ - иметь только SQLiteOpenHelper для всего приложения.
  • Когда и где мне нужно получить объект SQLiteDatabase, вызвав dbHelper.getReadableDatabase() (или getWritableDatabase)? Мне нужно сделать это по каждому запросу, закрыв его после каждого запроса?
  • Я прочитал, что я никогда не должен выполнять операции с базой данных в основном потоке, поэтому я создаю задачу Async для каждой операции с базой данных, которую я делаю в Activity, это лучший способ?

Ответы

Ответ 1

Большая часть вопроса довольно субъективна. Но позвольте мне взять удар по нему

Где лучше всего создать экземпляр SQLiteOpenHelper? я читал об этом, и кажется, что лучший способ - это только SQLiteOpenHelper для всего приложения.

Вы можете создать класс в своем проекте, который расширяет SQLiteOpenHelper. Это полезно, если вы будете получать доступ к одной и той же базе данных в нескольких Activities в своем приложении.

Когда и где, мне нужно получить объект SQLiteDatabase, вызвав dbHelper.getReadableDatabase() (или getWritableDatabase)? мне нужно сделать он по каждому запросу, закрывая его после каждого запроса?

Это будет сделано в классе, который расширяет SQLiteOpenHelper. Например: (это выдержка из статьи Vogella, приведенной в конце этого сообщения)

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

И в Управлении, которое будет использовать класс:

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

И соединение Cursor и Database, сделанное из Activity, должно быть закрыто, когда вы закончите с извлечением, модификацией, добавлением и т.д. с помощью Database.

Приведенный выше код будет иметь смысл, если вы прочтете веб-страницу, связанную позже.

Я читал, что я никогда не должен делать операции с базой данных в основном thread, поэтому я создаю задачу Async для каждой операции с базой данных, которую я делаю в Деятельности это лучший способ?

В идеале, да. Я лично рекомендую использовать Asynctask, особенно когда вы будете иметь дело с большими наборами записей.

Наконец, я бы посоветовал вам прочитать в этом уроке Ларс Фогелла: http://www.vogella.com/articles/AndroidSQLite/article.html. Он рассмотрит большинство ваших проблем и запросов. Удачи.: -)

Ответ 2

1. Где лучше всего создать экземпляр SQLiteOpenHelper?

SQLiteOpenHelper помогает вам подключаться к таблицам, которые вы указали с помощью него. Таким образом, вы можете определить все свои таблицы в одном классе SQLiteOpenHelper.

2. Когда и где мне нужно получить объект SQLiteDatabase, вызвав dbHelper.getReadableDatabase() (или getWritableDatabase)?

Всякий раз, когда вы хотите записывать данные в определенных таблицах, вам нужно вызвать getWritableDatabase, и для чтения из них вам понадобится getReadableDatabase

Вы можете создавать функции CRUD (Создать, Восстановить, Обновить, Удалить) для этих целей.

3. Никогда не делайте операций с базой данных в основном потоке!

Я не уверен в этом.

ну вот ссылка для вас, чтобы начать с SQLite- http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/