МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота №5
з дисципліни "Мережні операційні системи"
на тему: “ Управління даними в Android за допомогою СУБД SQLite ”
Мета: Оволодіти навичками роботи з СУБД SQLite в ОС Android.
Виконання роботи
SQLite - це база даних з відкритими вихідними кодами, що включається за замовчуванням до складу Андроїд. SQLite підтримує стандартні можливості реляційних баз даних - синтаксис, транзакції і prepared statements. Крім SQLite вимагає дуже невеликої кількості пам'яті для роботи (приблизно 250 кб). Використання SQLite в Андроїд не вимагає установки БД або адміністрування. Ви вказуєте SQL-запит для роботи з БД і необхідні операції адміністрування виконуються автоматично. Робота з базами даних в Андроїд може бути повільної через операцій введення / виводу, тому всі необхідні операції рекомендується виконувати за допомогою класу AsyncTask (тобто в фоні). SQLite підтримує типи даних TEXT (схожий з String в Java), INTEGER (схожий з long в Java) і REAL (схожий з double в Java). Всі інші типи даних повинні бути сконвертовані в один з цих перед збереженням в базу даних. SQLite сам по собі не перевіряє, чи відповідають записані дані типом даних відповідного стовпця, ви можете записати ціле число в стовпець з типом Integer. Якщо ваш додаток створює базу даних, вона зберігається в папці «DATA / data / APP_NAME / databases / FILENAME». DATA - це шлях, що повертається методом Environment.getDataDirectory (), APP_NAME - ім'я вашого застосування і FILENAME - це ім'я, яке ви даєте базі даних при створенні. Environment.getDataDirectory () зазвичай повертає SD-карту в якості місця. База даних SQLite доступна тільки додатком, яке створює її. Якщо ви хочете дати доступ до даних іншим програмам, ви можете використовувати ContentProvider.
Для управления базой данных SQLite существует класс SQLiteDatabase. В классе SQLiteDatabase определены методы query(), insert(), delete() и update() для чтения, добавления, удаления, изменения данных. Кроме того, метод execSQL() позволяет выполнять любой допустимый код на языке SQL применимо к таблицам базы данных, если вы хотите провести эти (или любые другие) операции вручную.
Каждый раз, когда вы редактируете очередное значение из базы данных, нужно вызывать метод refreshQuery() для всех курсоров, которые имеют отношение к редактируемой таблице.
Для составления запроса используются два метода: rawQuery() и query(), а также класс SQLiteQueryBuilder.
Лістинг тестової програми:
MainActivity.java
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
final String LOG_TAG = "MainActivity";
private static final int CM_DELETE_ID = 1;
ListView listView;
Database database;
SimpleCursorAdapter scAdapter;
FloatingActionButton addSubjectFAB, addMobileFAB;
Dialog subjectDialog;
EditText subjectName, teacherName, subjectHours, subjectSuccess;
Button addSubjectDialogButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addSubjectFAB = (FloatingActionButton) findViewById(R.id.subjectDB);
addSubjectFAB.setIcon(R.mipmap.ic_school);
subjectDialog = new Dialog(MainActivity.this);
subjectDialog.setTitle(R.string.subjectDB);
subjectDialog.setContentView(R.layout.subject_dialog);
subjectName = (EditText) subjectDialog.findViewById(R.id.subject_name);
teacherName = (EditText) subjectDialog.findViewById(R.id.subject_teacher);
subjectHours = (EditText) subjectDialog.findViewById(R.id.subject_hours);
subjectSuccess = (EditText) subjectDialog.findViewById(R.id.subject_success);
addSubjectDialogButton = (Button) subjectDialog.findViewById(R.id.addSubjectDialogButton);
addMobileFAB = (FloatingActionButton) findViewById(R.id.mobileOperatingSystemsDB);
addMobileFAB.setIcon(R.mipmap.ic_cellphone_android);
// відкриваємо підключення до БД
database = new Database(this);
database.open();
// формуємо стовпці співставлення
String[] from = new String[]{Database.SUBJECT_NAME, Database.SUBJECT_TEACHER, Database.SUBJECT_HOURS, Database.SUBJECT_SUCCESS};
int[] to = new int[]{R.id.item_subject_name, R.id.item_subject_teacher, R.id.item_subject_hours, R.id.item_subject_success};
// створюємо адаптер і налаштовуємо список
scAdapter = new SimpleCursorAdapter(this, R.layout.subject_item, null, from, to, 0);
listView = (ListView) findViewById(R.id.subjects_database_lv);
listView.setAdapter(scAdapter);
// додаємо контекстне меню до списку
registerForContextMenu(listView);
// створюємо loader для читання данних
getSupportLoaderManager().initLoader(0, null, this);
addSubjectFAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
subjectDialog.show();
}
});
addSubjectDialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
subjectDialog.dismiss();
// отримуємо дані з полей вводу
String name = subjectName.getText().toString();
String teacher = teacherName.getText().toString();
String hours = subjectHours.getText().toString();
String success = subjectSuccess.getText().toString();
// додаємо запис
database.addRec(name, teacher, hours, success + "%");
// отримуємо новий курсор з даними
getSupportLoaderManager().getLoader(0).forceLoad();
Toast.makeText(getApplicationContext(), "Додано у БД", Toast.LENGTH_SHORT).show();
// очищаємо поля в діалозі
subjectName.setText(null);
teacherName.setText(null);
subjectHours.setText(null);
subjectSuccess.setText(null);
}
});
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CM_DELETE_ID, 0, R.string.delete);
}
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == CM_DELETE_ID) {
// отримуємо з пункту контекстного меню дані по пункту списку
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
// отримуємо id запису і видаляємо відповідний запис у БД
database.delRec(acmi.id);
// отримуємо новий курсор з даними
getSupportLoaderManager().getLoader(0).forceLoad();
return true;
}
return super.onContextItemSelected(item);
}
protected void onDestroy() {
super.onDestroy();
// закриваємо підключення до БД перед виходом
database.close();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(this, database);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
static class MyCursorLoader extends CursorLoader {
Database db;
public MyCursorLoader(Context context, Database db) {
super(context);
this.db = db;
}
@Override
public Cursor loadInBackground() {
Cursor cursor = db.getAllData();
return cursor;
}
}
}
Database.java
public class Database {
final String LOG_TAG = "Database";
// Ім'я БД
private static final String DATABASE_NAME = "mydb";
// Версія БД
private static final int DATABASE_VERSION = 1;
// Таблиці БД
private static final String SUBJECTS_TABLE = "subjects";
private static final String MOBILE_OS_TABLE = "mobos";
// Стовпці таблиці навчальних предметів
public static final String SUBJECT_ID = "_id";
public static final String SUBJECT_NAME = "name";
public static final String SUBJECT_TEACHER = "teacher";
public static final String SUBJECT_HOURS = "hours";
public static final String SUBJECT_SUCCESS = "success";
// Стовпці таблиці мобільних ОС
public static final String MOBILE_OS_ID = "_id";
public static final String MOBILE_OS_NAME = "os";
public static final String MOBILE_OS_VERSION = "version";
public static final String MOBILE_OS_COMPANY = "company";
public static final String MOBILE_OS_MARKET = "market";
// Стоврення таблиці навчальних предметів
private static final String CREATE_SUBJECTS_TABLE =
"CREATE TABLE " + SUBJECTS_TABLE + "(" + SUBJECT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ SUBJECT_NAME + " TEXT," + SUBJECT_TEACHER + " TEXT," + SUBJECT_HOURS + " TEXT,"
+ SUBJECT_SUCCESS + " TEXT" + ")";
private static final String CREATE_MOBILE_OS_TABLE =
"CREATE TABLE " + MOBILE_OS_TABLE + "(" + MOBILE_OS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ MOBILE_OS_NAME + " TEXT," + MOBILE_OS_VERSION + " TEXT," + MOBILE_OS_COMPANY + " TEXT,"
+ MOBILE_OS_MARKET + " TEXT" + ")";
private final Context mCtx;
private DBHelper mDBHelper;
private SQLiteDatabase mDB;
public Database(Context ctx) {
mCtx = ctx;
}
// відкрити підключення
public void open() {
mDBHelper = new DBHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
mDB = mDBHelper.getWritableDatabase();
}
// закрити підключення
public void close() {
if (mDBHelper != null) mDBHelper.close();
}
// отримати всі дані з таблиці навчальних предметів
public Cursor getAllData() {
return mDB.query(SUBJECTS_TABLE, null, null, null, null, null, null);
}
// отримати всі дані з таблиці мобільних ОС
public Cursor getAllDataMobile() {
return mDB.query(MOBILE_OS_TABLE, null, null, null, null, null, null);
}
// додати запис у таблицю навчальних предметів
public void addRec(String name, String teacher, String hours, String success) {
ContentValues cv = new ContentValues();
cv.put(SUBJECT_NAME, name);
cv.put(SUBJECT_TEACHER, teacher);
cv.put(SUBJECT_HOURS, hours);
cv.put(SUBJECT_SUCCESS, success);
mDB.insert(SUBJECTS_TABLE, null, cv);
}
// видалити запис з таблиці навчальних предметів
public void delRec(long id) {
mDB.delete(SUBJECTS_TABLE, SUBJECT_ID + " = " + id, null);
}
// клас по створенню і управлінню БД
private class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
// створюємо БД
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_SUBJECTS_TABLE);
ContentValues cv = new ContentValues();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/subjects_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/subjectDB"
android:textStyle="bold" />
<ListView
android:id="@+id/subjects_database_lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/mobile_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/mobileDB"
android:textStyle="bold" />
<ListView
android:id="@+id/mobile_database_lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
</LinearLayout>
<com.getbase.floatingactionbutton.FloatingActionsMenu
android:id="@+id/multiple_actions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"
fab:fab_addButtonColorNormal="#303F9F"
fab:fab_addButtonColorPressed="#3F51B5"
fab:fab_addButtonPlusIconColor="#ffffff">
<com.getbase.floatingactionbutton.FloatingActionButton
android:id="@+id/subjectDB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fab:fab_colorNormal="#303F9F"
fab:fab_colorPressed="#3F51B5"
fab:fab_size="normal">
</com.getbase.floatingactionbutton.FloatingActionButton>
<com.getbase.floatingactionbutton.FloatingActionButton
android:id="@+id/mobileOperatingSystemsDB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fab:fab_colorNormal="#303F9F"
fab:fab_colorPressed="#3F51B5"
fab:fab_size="normal">
</com.getbase.floatingactionbutton.FloatingActionButton>
</com.getbase.floatingactionbutton.FloatingActionsMenu>
</FrameLayout>
subject_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/item_subject_name_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:gravity="center_vertical"
android:text="Предмет: " />
<TextView
android:id="@+id/item_subject_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/item_subject_teacher_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:gravity="center_vertical"
android:text="Викладач: " />
<TextView
android:id="@+id/item_subject_teacher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/item_subject_hours_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:gravity="center_vertical"
android:text="Години: " />
<TextView
android:id="@+id/item_subject_hours"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_vertical" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/item_subject_success_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:gravity="center_vertical"
android:text="Успішність: " />
<TextView
android:id="@+id/item_subject_success"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
subject_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/subject_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/subject_name"
android:inputType="textCapSentences"
android:textStyle="bold" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/subject_teacher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/teacher"
android:inputType="textCapSentences"
android:textStyle="bold" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/subject_hours"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/subject_time"
android:inputType="textCapSentences"
android:textStyle="bold" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/subject_success"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/success"
android:inputType="textCapSentences"
android:textStyle="bold" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/addSubjectDialogButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add" />
</LinearLayout>
//
Висновок: На цій лабораторній роботі я оволодів навичками роботи з СУБД SQLite в ОС Android.