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

В предыдущей версии информация поступала из строковых массивов, которые были созданы в файле 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, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!

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


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



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


Cookies make it easier for us to provide you with our services. With the usage of our services you permit us to use cookies.
Ok