В этом уроке продолжим модифицировать наше приложение Расписания уроков для андроид устройств, и изменим принцип загрузки данных во фрагменты.
В предыдущей версии информация поступала из строковых массивов, которые были созданы в файле String.xml, посредником между данными и приложением являлся Array Adapter, а сегодня сделаем загрузку из базы данных SQLite.
Она будет находиться в apk файле, вместе с самим приложением, так что никаких настроек или манипуляций не нужно будет делать. Установил, открыл - работает.
Содержание:
- Создание базы данных в Excel
- Использование DB Browser for SQLite
- Создание директории assets
- Класс DatabaseHelper.java для работы с базой данных
- Настройки таблицы
- Работа с фрагментами
- Cкачать архив для ознакомления - проект Расписание для уроков:
- Создание расписания уроков для андроид устройств. Часть 2. База данных SQLITE и фрагменты + БОНУС :
Кто не читал статью "Создание расписания уроков для андроид устройств. Array Adapter для фрагментов" переходите по ссылке, в ней вы сможете скачать файл проекта, который будем редактировать.
Создание базы данных в Excel
В прошлой статье я не оговорился, сказав, что базу данных будем делать в Excel. Давайте создадим таблицу с расписанием уроков, по классам, дням недели и перечнем занятий.
Для этого в новой книге дадим названия полей таблицы:
- class - номер класса(11-6)
- day - день недели(1-5)
- urok_id- порядок уроков
- urok - название предмета.
На втором листе книги напишем номер предмета и название, с помощью функции на первом листе в столбец urok введем формулу =СЛУЧМЕЖДУ(1;13) так как на втором листе 13 предметов, а в соседнюю ячейку =ВПР(D2,Лист2!A:B;2;0) для получения списка пердметов.
Использование DB Browser for SQLite
Затем скопируем как значения получившийся список на новый лист и сохраним его как CSV(разделитель - запятые).
Далее нам понадобится программа DB Browser for SQLite (я пользуюсь версией 3.5.1), в которой создадим новую базу данных(New Database), назавем ее 1.sqlite.
Нажмем File->Import->Table from CSV file.., укажем путь к сохраненной ранее книге, присвоим название таблице myrasp, поставим галочку Column name in first line, кодировка Other - CP1251, разделитель ";" и нажмем Ok.
Модифицируем таблицу myrasp, нажав ПКМ, добавим новое поле(Add field) "_id" с типом text или integer, отметим галочками PK(первичный ключ) и AI(автоинкремент). Поле "_id" можно поднять выше в списке полей таблицы.
Создание директории assets
Вернемся в Android Studio и создадим папку assets для хранения нашей базы данных SQLite, нажав в проекте ПКМ: New->Folder->Asset Folder. Если вы скопируете 1.sqlite то можно сразу в эту папку вставить файл, я же в Total Comander переименую в rasp.sqlite и скопирую в проект в папку assets. Когда мы перейдем в среду разработки Android Studio, то в папке будет видна наша база.
Изменения не коснутся файлов MainActivity.java и MainActivity11.java, будем использовать код из предыдущего проекта. В файле fragment_main11.java, отвечающем за отображение уроков понедельника уберем конструкцию switch(classId){} целиком, удалим переменную ListAdapter adapter.
Класс DatabaseHelper.java для работы с базой данных
Создадим новый класс DatabaseHelper.java, он понадобится для связи с базой данных, открытия, чтения данных.
Код DatabaseHelper.java
package ru.maxfad.myraspisanie;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
public class DatabaseHelper extends SQLiteOpenHelper {
public static String DB_NAME = "rasp.sqlite";
private static final int SCHEMA = 1; // версия базы данных
static final String TABLE = "myrasp";
private static String DB_PATH;
public static final String COLUMN_ID="id";
public static final String COLUMN_CLASS = "class";
public static final String COLUMN_DAY = "day";
public static final String COLUMN_UROKID = "urok_id";
public static final String COLUMN_UROK = "urok";
public SQLiteDatabase database;
private Context myContext;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, SCHEMA);
this.myContext=context;
DB_PATH = "/data/data/ru.maxfad.myraspisanie/databases/";
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void create_db(){
InputStream myInput = null;
OutputStream myOutput = null;
try {
File file = new File(DB_PATH + DB_NAME);
if (!file.exists()) {
this.getReadableDatabase();
myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
}
catch(IOException ex){
}
}
public void open() throws SQLException {
String path = DB_PATH + DB_NAME;
database = SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if (database != null) {
database.close();
}
super.close();
}
}
Данный код универсален для любых проектов, в настройках можно менять названия переменных DB_NAME, TABLE, COLUMN_.
Настройки таблицы
Напишем название базы данных и таблицы в переменные
DB_NAME = "rasp.sqlite" TABLE = "myrasp"
Присвоим поля таблицы myrasp переменным
COLUMN_ID="_id" COLUMN_CLASS="class" COLUMN_DAY="day" COLUMN_UROKID="urok_id" COLUMN_UROK="urok" DB_PATH="/data/data/ru.maxfad.myraspisanie/database/"
.
Хочу обратить ваше внимание на переменную DB_PATH, которую я для упрощения написал просто "/data/data/"+название пакета+"/database/". В моем случае название пакета - ru.maxfad.myraspisanie, у вас может и будет отличаться для других приложений.
Работа с фрагментами
Теперь откроем fragment_main11.java, в который добавим метод onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootview = inflater.inflate(R.layout.fragment_main11, container, false);
mList= (ListView) rootview.findViewById(android.R.id.list);
return rootview;
}
Поскольку нам нужно получить доступ к фрагменту из активности напишем функцию, в которой свяжемся со слоем фрагмента fragment_main11.xml, а в переменную mList получим ListView для отображения уроков
Во fragment_main11.xml удалим секцию разметки TextView и переименуем id ListView
android:id="@+id/android:list"
Добавим переменные для работы с базой данных
SimpleCursorAdapter userAdapter; DatabaseHelper sqlHelper; Cursor userCursor;
В метод onActivityCreate напишем новый экземпляр класса DatabaseHelper и создадим базу данных
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle bundle = getActivity().getIntent().getExtras();
classID = bundle.getString("classID");
sqlHelper = new DatabaseHelper(getActivity());
sqlHelper.create_db();
}Напишем метод onResume в котором и будет происходить выборка данных из таблицы myrasp, выполняться SQL запрос и формироваться список уроков
@Override
public void onResume() {
super.onResume();
try {
sqlHelper.open();
userCursor = sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE + " where class="+classID+" and day=1", null);
String[] headers = new String[]{DatabaseHelper.COLUMN_UROK};
userAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, userCursor, headers, new int[]{R.id.uroki},0);
mList.setAdapter(userAdapter);
}
catch (SQLException ex){}
}Как вы можете обратить внимание, в строке " and day=1" и заключается принцип загрузки данных по дням недели, в остальных фрагментах код будет отличаться только номером дня.
При запуске приложения в эмуляторе по нажатию на кнопку в фрагменты будет грузиться информация о расписании уроков, происходит деление по дням недели.
Архив с кодом проекта можно скачать по ссылке ниже, обязательно посмотрите видеоролик по материалам статьи, в нем есть БОНУС: на примере этого приложения я покажу, как работать в Android Studio с макетом с помощью BluePrint+Design.
А на сегодня все, делитесь этой статьей в соцсетях и подписывайтесь на канал YouTube.
Cкачать архив для ознакомления - проект Расписание для уроков:
Создание расписания уроков для андроид устройств Часть 2 База данных SQLITE и фрагменты
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Создание расписания уроков для андроид устройств Часть 2 База данных SQLITE и фрагменты
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на видео ВКонтакте, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Создание расписания уроков для андроид устройств Часть 2 База данных SQLITE и фрагменты
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в Рутубе, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!