В этом уроке продолжим модифицировать наше приложение Расписания уроков для андроид устройств, и изменим принцип загрузки данных во фрагменты.

В предыдущей версии информация поступала из строковых массивов, которые были созданы в файле String.xml, посредником между данными и приложением являлся Array Adapter, а сегодня сделаем загрузку из базы данных SQLite.

Она будет находиться в apk файле, вместе с самим приложением, так что никаких настроек или манипуляций не нужно будет делать. Установил, открыл - работает.

Кто не читал статью "Создание расписания уроков для андроид устройств. 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, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!

 С уважением, авторы сайта Компьютерапия


Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!


Связанные статьи


We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.

Ok