Северный (Арктический) федеральный университет им. М.В. Ломоносова
Опубликован: 10.04.2014 | Доступ: свободный | Студентов: 6839 / 1236 | Длительность: 14:18:00
Специальности: Программист
Самостоятельная работа 10:

Работа с базами данных в Android

< Лекция 7 || Самостоятельная работа 10: 123 || Лекция 8 >

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.

< Лекция 7 || Самостоятельная работа 10: 123 || Лекция 8 >
Марат Нуриджанян
Марат Нуриджанян

Пример: Скачать среду можно с сайта для разработчиков Android (http://developer.android.com/sdk/index.html).

Там скачать можно только Android Studio

Владимир Каункин
Владимир Каункин

В самостоятельной работе 2 в примере решения задания некорректно загадывается число (в двух местах), выбирая случайное целое число из диапазона [0, 99] вместо [1, 100], как того требует условие. Кроме того, загадывание числа всё таки лучше вынести в отдельный метод, как мне кажется.