Курс по Java/Android
Занятие 13
Александр Русин
e-mail: alexandr.rusin@gmail.com
Android Developer
SQLite. Что требуется?
●
Описание моделей и проектирование базы
данных на их основе
●
Описание классов для управления данными
в базе
●
Привязка данных к представлению
(пользовательскому интерфейсу)
Иерархия
java.lang.Object
android.database.sqlite.SQLiteClosable
android.database.sqlite.SQLiteDatabase
SQLiteDatabase. Методы.
void execSQL(String sql) // выполнение sql-запроса, который не является
выборкой (т.е. без select). Это CREATE TABLE, INSERT, DELETE и так
далее.
Cursor query(String table, String[] columns, String selection, String[]
selectionArgs, String groupBy, String having, String orderBy, String limit) //
важный метод. Используется для выборки.
Cursor rawQuery(String sql, String[] selectionArgs) // обычный sql-запрос.
Методы.
insert() // возвращает id вставленной строки
update() // возвращает количество обновленных
строк
replace() // замена (редко использовал)
delete() // возвращает количество удаленных строк
Методы.
IsOpen() // true, если база была не закрыта
IsReadOnly() // true, если база была открыта
только для чтения
Методы. Транзакция.
beginTransaction() // начало
endTransaction() // конец
inTransaction() // true, если открыта транзакция
setTransactionSuccessful() // только после вызова
этого метода транзакция будет закомичена.
Создание. Способ №1.
static SQLiteDatabase openDatabase(String path,
SQLiteDatabase.CursorFactory factory, int flags)
//Пример
SQLiteDatabase mDatabase =
SQLiteDatabase.openDatabase("/data/data/com.example.app/datab
ases/my.db", null, SQLiteDatabase.CREATE_IF_NECESSARY);
Способ №1. Парамтеры.
path // путь к файлу базы данных. Путь для любой базы данных имеет вид:
«/data/data/<package_name>/databases. <package_name> – имя пакета, которое вы
указывали при создании проекта.
factory // По умолчанию стоит null.
flags // флаги или константы, определенные внутри класса SQLiteDatabase. Их
всего четыре: CREATE_IF_NECESSARY (создавать базу, если это нужно),
OPEN_READONLY (открыть только для чтения), OPEN_READWRITE (читать и
писать), NO_LOCALIZED_COLLATORS (открыть без поддержки локализации)
Способ №2.
SQLiteDatabase openOrCreateDatabase(String name,
int mode, SQLiteDatabase.CursorFactory factory)
Способ №2. Парамтеры.
name // имя базы данных, уникальное в рамках приложения
mode // константа, для указания режима (MODE_PRIVATE
или 0 – по умолчанию, MODE_WORLD_READABLE для
чтения, MODE_WORLD_WRITEABLE для записи)
factory // пока не трогаем, ставим null
Способ №2. Методы.
boolean deleteDatabase(String name) // удаляет базу
по имени. True, если завершилось успешно.
File getDatabasePath(String name) // возвращает
абсолютный путь по имени базы
Способ №3. Иерархия.
java.lang.Object
android.database.sqlite.SQLiteOpenHelper
Способ №3. Методы.
void close() // закрыть все открытые соединения
SQLiteDatabase getReadableDatabase() //
возвращает базу для чтения
SQLiteDatabase getWritableDatabase() // база для
чтения и записи
onOpen(SQLiteDatabase db) // вызывается после
того, как база будет открыта
Способ №3. Методы.
onCreate(SQLiteDatabase db) // вызывается после
того, как база создана в первый раз. Здесь
создаются необходимые таблицы.
onUpgrade(SQLiteDatabase db) // вызывается,
когда базе нужен апгрейд. Здесь удаляются
таблицы, создаются новые, добавляются поля и
так далее.
Способ №3. Конструктор.
SQLiteOpenHelper(Context context, String name,
SQLiteDatabase.CursorFactory factory, int version)
Способ №3. Параметры.
context // контекст приложения. Именно через его метод
openOrCreateDatabase() и работает SQLiteOpenHelper
name // имя базы
factory // null
version // версия базы. Используется, когда схему базы
данных нужно обновить.
Способ №3.
class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "data";
private static final String DATABASE_CREATE = "create table test_table (_id integer primary key
autoincrement, some_test text not null);";
DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }
@Override
public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); }
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS notes");
onCreate(db);
}
}
Способ №3.
// Получение базы
DatabaseHelper mDbHelper = new DatabaseHelper(mCtx);
SQLiteDatabase mDb = mDbHelper.getWritableDatabase();
Проблемы
database is locked // возникает при многопоточной записи в базу.
database is closed // может возникнуть при работе с базой из разных
частей программы, например, Activity и Service.
corrupted database // возникает, если файл базы данных был испорчен
либо пользователем, либо при неожиданном прерывании записи в базу
(выключение телефона, ошибка OS, нехватка пространства, битые
сектора на SD карте и т.д.)
низкая производительность при работе с базой данных // может
возникнуть из-за внутренних блокировок, конкурирующих транзакциях,
высоком уровне журналирования, отсутствии пакетной обработки.
Домашнее задание
1. Реализовать свою базу телефонного
справочника.
2. Реализовать базу, которая будет
применяться в вашем проекте.
Литература
1. http://webhybrid.ru/prog/android/sqlite.php
2. http://idev.by/android/311/
3. http://blog.iobit.org.ua/articles/46/android-rabota-s-bazoi-
dannykh-chast-2
Спасибо за внимание!

Lec 13

  • 1.
    Курс по Java/Android Занятие13 Александр Русин e-mail: alexandr.rusin@gmail.com Android Developer
  • 2.
    SQLite. Что требуется? ● Описаниемоделей и проектирование базы данных на их основе ● Описание классов для управления данными в базе ● Привязка данных к представлению (пользовательскому интерфейсу)
  • 3.
  • 4.
    SQLiteDatabase. Методы. void execSQL(Stringsql) // выполнение sql-запроса, который не является выборкой (т.е. без select). Это CREATE TABLE, INSERT, DELETE и так далее. Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) // важный метод. Используется для выборки. Cursor rawQuery(String sql, String[] selectionArgs) // обычный sql-запрос.
  • 5.
    Методы. insert() // возвращаетid вставленной строки update() // возвращает количество обновленных строк replace() // замена (редко использовал) delete() // возвращает количество удаленных строк
  • 6.
    Методы. IsOpen() // true,если база была не закрыта IsReadOnly() // true, если база была открыта только для чтения
  • 7.
    Методы. Транзакция. beginTransaction() //начало endTransaction() // конец inTransaction() // true, если открыта транзакция setTransactionSuccessful() // только после вызова этого метода транзакция будет закомичена.
  • 8.
    Создание. Способ №1. staticSQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags) //Пример SQLiteDatabase mDatabase = SQLiteDatabase.openDatabase("/data/data/com.example.app/datab ases/my.db", null, SQLiteDatabase.CREATE_IF_NECESSARY);
  • 9.
    Способ №1. Парамтеры. path// путь к файлу базы данных. Путь для любой базы данных имеет вид: «/data/data/<package_name>/databases. <package_name> – имя пакета, которое вы указывали при создании проекта. factory // По умолчанию стоит null. flags // флаги или константы, определенные внутри класса SQLiteDatabase. Их всего четыре: CREATE_IF_NECESSARY (создавать базу, если это нужно), OPEN_READONLY (открыть только для чтения), OPEN_READWRITE (читать и писать), NO_LOCALIZED_COLLATORS (открыть без поддержки локализации)
  • 10.
    Способ №2. SQLiteDatabase openOrCreateDatabase(Stringname, int mode, SQLiteDatabase.CursorFactory factory)
  • 11.
    Способ №2. Парамтеры. name// имя базы данных, уникальное в рамках приложения mode // константа, для указания режима (MODE_PRIVATE или 0 – по умолчанию, MODE_WORLD_READABLE для чтения, MODE_WORLD_WRITEABLE для записи) factory // пока не трогаем, ставим null
  • 12.
    Способ №2. Методы. booleandeleteDatabase(String name) // удаляет базу по имени. True, если завершилось успешно. File getDatabasePath(String name) // возвращает абсолютный путь по имени базы
  • 13.
  • 14.
    Способ №3. Методы. voidclose() // закрыть все открытые соединения SQLiteDatabase getReadableDatabase() // возвращает базу для чтения SQLiteDatabase getWritableDatabase() // база для чтения и записи onOpen(SQLiteDatabase db) // вызывается после того, как база будет открыта
  • 15.
    Способ №3. Методы. onCreate(SQLiteDatabasedb) // вызывается после того, как база создана в первый раз. Здесь создаются необходимые таблицы. onUpgrade(SQLiteDatabase db) // вызывается, когда базе нужен апгрейд. Здесь удаляются таблицы, создаются новые, добавляются поля и так далее.
  • 16.
    Способ №3. Конструктор. SQLiteOpenHelper(Contextcontext, String name, SQLiteDatabase.CursorFactory factory, int version)
  • 17.
    Способ №3. Параметры. context// контекст приложения. Именно через его метод openOrCreateDatabase() и работает SQLiteOpenHelper name // имя базы factory // null version // версия базы. Используется, когда схему базы данных нужно обновить.
  • 18.
    Способ №3. class DatabaseHelperextends SQLiteOpenHelper { private static final String DATABASE_NAME = "data"; private static final String DATABASE_CREATE = "create table test_table (_id integer primary key autoincrement, some_test text not null);"; DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS notes"); onCreate(db); } }
  • 19.
    Способ №3. // Получениебазы DatabaseHelper mDbHelper = new DatabaseHelper(mCtx); SQLiteDatabase mDb = mDbHelper.getWritableDatabase();
  • 20.
    Проблемы database is locked// возникает при многопоточной записи в базу. database is closed // может возникнуть при работе с базой из разных частей программы, например, Activity и Service. corrupted database // возникает, если файл базы данных был испорчен либо пользователем, либо при неожиданном прерывании записи в базу (выключение телефона, ошибка OS, нехватка пространства, битые сектора на SD карте и т.д.) низкая производительность при работе с базой данных // может возникнуть из-за внутренних блокировок, конкурирующих транзакциях, высоком уровне журналирования, отсутствии пакетной обработки.
  • 21.
    Домашнее задание 1. Реализоватьсвою базу телефонного справочника. 2. Реализовать базу, которая будет применяться в вашем проекте.
  • 22.
    Литература 1. http://webhybrid.ru/prog/android/sqlite.php 2. http://idev.by/android/311/ 3.http://blog.iobit.org.ua/articles/46/android-rabota-s-bazoi- dannykh-chast-2
  • 23.