Пример: Скачать среду можно с сайта для разработчиков Android (http://developer.android.com/sdk/index.html). Там скачать можно только Android Studio |
Работа с базами данных в Android
17.4 Реализация логики
Для создания и обновления базы данных, Android предоставляет класс SQLiteOpenHelper. Для работы с этим классом в приложении необходимо создать класс-наследник, в котором обязательно реализовать методы: onCreate() и onUpgarde().
Создадим новый класс, назовем его, например, MyOpenHelper:
public class MyOpenHelper extends SQLiteOpenHelper{...}
Реализуем метод onCreate():
public void onCreate(SQLiteDatabase DB) { String query="create table " + TABLE_NAME + " (_id integer primary key autoincrement, " + field_name_1 + " TEXT, " + field_name_2 + " TEXT)"; DB.execSQL(query); }
Параметром метода onCreate() является объект класса SQLiteDatabase, позволяющего работать с базой данных напрямую.
В строке query формируется запрос на создание таблицы, где
TABLE_NAME | - константа, содержащая имя таблицы, |
FIELD_NAME_1 | - константа, содержащая имя первого столбца, |
FIELD_NAME_2 | - константа, содержащая имя второго столбца. |
Все эти константы объявлены в классе MyOpenHelper:
public String TABLE_NAME="first_table"; public String FIELD_NAME_1="first_field"; public String FIELD_NAME_2="second_field";
Метод execSQL() класса SQLiteDatabase запускает запрос на выполнение.
Еще необходимо реализовать метод onUpgrade(), в нашем случае он ничего существенного не делает, но необходимо прописать реализацию этого метода даже, если это будет пустая реализация:
public void onUpgrade(SQLiteDatabase DB, int oldVersion, int newVersion) { Log.d("myLogs","| Upgrade |"+DB.toString()); }
Система потребует создать конструктор класса MyOpenHelper, т. к. для его предка конструктор без параметров не определен, поэтому добавим в код класса следующие строчки:
MyOpenHelper(Context ct, String nm, SQLiteDatabase.CursorFactory cf, int vs){ super(ct, nm, cf, vs); }
Полученный конструктор не делает ничего особенного, просто вызывает конструктор предка, т. е. класса SQLiteOpenHelper.
Мы описали создание вспомогательного класса, необходимого нам для создания и открытия базы данных, полный код этого класса представлен в листинге 17.1.
Пришло время описать реализацию заявленных функций приложения. Далее будем работать с классом активности, описание которого находится в файле SQLiteActivity.java.
Выполним необходимую подготовку, зададим переменные, как поля класса активности:
EditText field1, field2, result; MyOpenHelper myHelper = null; SQLiteDatabase DB;
Вторая строка определяет объект класса MyOpenHelper, а третья - объект класса SQLiteDatabase, далее в программе все взаимодействия с базой данных после ее создания будут выполняться через этот объект.
Далее в методе onCreate() активности создадим экземпляр класса MyOpenHelper, для создания, открытия и возможно управления базой данных, имя которой myDB:
myHelper=new MyOpenHelper(this, "myDB", null, 1);
Для работы приложения необходимо задать действия, которые будут выполняться при нажатии на кнопки, для этого настроим свойство On Click кнопок:
- для кнопки Ввод данных свойству On Click присвоим значение insertIntoDatabase, при нажатии на кнопку будет вызываться метод с этим именем, реализованный в классе активности;
- для кнопки Вывод данных свойству On Click присвоим значение readDatabase, при нажатии на кнопку будет вызываться метод с этим именем, реализованный в классе активности;
- для кнопки Delete свойству On Click присвоим значение deleteDatabase, при нажатии на кнопку будет вызываться метод с этим именем, реализованный в классе активности.
Рассмотрим реализацию метода insertIntoDatabase().
В этом методе после проверки того, что в поля введены значения, получаем экземпляр базы данных с разрешением на запись:
DB = myHelper.getWritableDatabase();
Далее формируем запись, добавляемую в таблицу:
ContentValues CV = new ContentValues() CV.put(myHelper.FIELD_NAME_1,field1.getText().toString()); CV.put(myHelper.FIELD_NAME_2,field2.getText().toString());
После этого добавляем запись в таблицу и закрываем экземпляр базы данных:
DB.insert(myHelper.TABLE_NAME,null,CV); DB.close();
Полный код рассмотренного метода можно найти в листинге 17.2.
Рассмотрим реализацию метода readDatabase().
В этом методе сначала получаем экземпляр базы данных с разрешением на чтение:
DB = myHelper.getReadableDatabase();
Далее формируем и выполняем запрос к базе данных на получение всех значений из базы, результат запроса помещается в объект класса Cursor:
String columns[]={"_id",myHelper.FIELD_NAME_1, myHelper.FIELD_NAME_2}; Cursor cursor=DB.query(myHelper.TABLE_NAME, columns, null, null, null, null, "_id");
После этого выведем содержимое класса Cursor в поле на форме, предназначенное для вывода информации:
if(cursor!=null){ cursor.moveToFirst(); if (cursor.moveToFirst()) { do { result.setText(result.getText().toString()+"\n" +cursor.getString(0)+") "+cursor.getString(1)+", "+cursor.getString(2)); } while (cursor.moveToNext()); } }
В этом кусочке кода основное внимание можно обратить на работу с классом курсор, очень похоже на работу со списками. Начиная с начала списка получаем значения элементов и передвигаемся на следующий элемент, пока не достигнем конца.
После всех манипуляций с базой данных необходимо ее закрыть:
DB.close();
Полный код рассмотренного метода можно найти в листинге 17.2.
Рассмотрим реализацию метода deleteDatabase.
В этом методе сначала получаем экземпляр базы данных с разрешением на запись:
DB = myHelper.getWritableDatabase();
Удалим таблицу, с помощью метода delete() класса SQLiteDatabase:
DB.delete(myHelper.TABLE_NAME, null, null);
После всего закроем базу:
DB.close();
Полный код рассмотренного метода можно найти в листинге 17.2.