SQLite

Приложение Android может иметь более чем одну базу данных и каждая БД может содержать более чем одну таблицу. Каждая таблица хранит данные в формате 2D (строки и колонки).

Для хранения важных данных можно использовать проект SQLSafer, который использует те же названия и состав классов, что и SQLite, но при этом шифрует все данные в БД. Особенности работы - database is locked - возникает при многопоточной записи в базу - блокировки в SQLite выполнены на уровне файла - читать базу может много потоков, а писать только один - если вы пишете из двух потоков одного соединения, то один поток будет ждать, пока закончит писать другой - если вы пишете из двух потоков разных соединений, то произойдёт ошибка - приложение вылетит с SQLiteDatabaseLockedException - приложение всегда должно иметь только один экземпляр SQLiteOpenHelper (именно открытого соединения) иначе SQLiteDatabaseLockedException - внутри класса SQLiteDatabase есть собственные блокировки - переменная mLock - поскольку на чтение и запись экземпляр SQLiteDatabase один, то чтение данных тоже блокируется - database is closed - может возникнуть при работе с базой из разных частей программы, например, Activity и Service - возникает, когда с базой работает и Activity и Service - при каждом обращении к базе проверять, - закрыта база или нет, и если закрыта, то переоткрывать её заново - принудительно добавить фиктивную ссылку на базу и держать её пока база используется - использовать ContentProvider для доступа к базе. Причём желательно использовать именно один провайдер - corrupted database - возникает, если файл базы данных испорчен либо пользователем, либо при неожиданном прерывании записи в базу - причина - испортился файл базы - проблемы с питанием - падение приложения - глюки устойства - новую базу устройство создаст само на onCreate - можно вызвать VACUUM - база будет пересоздана - низкая производительность при работе с базой данных

Оптимизация работы с БД

- не пишите запросы, которые возвращают больше 1000 строк или мегабайта данных - не используйте смещение в LIMIT - если нужно создать таблицу из существующей используйте INSERT AS SELECT - очищайте память после больших запросов вызовом SQLiteDatabase.releaseMemory() - используйте индексы - не используйте LIKE - в условиях ставьте лёгкие или индексированные запросы сначала - для интернациональных некорректно обрабатываются заглавные буквы в запросе - правильно использовать JOIN - избегать фрагментации

SQLite statement

Оператор SQL написан на языке SQL, который используется для получения, создания, добавления, обновления или удаления данных в БД.

Классы

SQLiteOpenHelper
SQLiteDatabase
SQLiteException
SQLiteStatement
Cursor