На прошлом уроке мы рассмотрели самый простой способ хранения данных -SharedPreferences. Но этот способ не подходит для хранения большого объема структурированных данных. На этом уроке рассмотрим работу с базой данных SQLite в android. SQLite является бесплатной библиотекой, которая реализует автономные базы данных, не нуждающиеся в серверах и не требовательные к ресурсам, компактные и надежные. Работа с БД SQLite выполняется посредством команд языка SQL, синтаксис и список ключевых слов языка SQL можно посмотреть на сайте sqlite.org. SQLite читает и пишет данные в обычные файлы на диске. Полная база данных SQL с несколькими таблицами, индексами, триггерами и представлениями, компактно хранится в одном файле. Все android устройства поддерживают работу с SQLite.
Исходный код под видео:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <EditText android:id="@+id/etName" android:hint="Name" android:layout_width="match_parent" android:layout_height="wrap_content"> </EditText> <EditText android:id="@+id/etEmail" android:hint="Email" android:layout_width="match_parent" android:layout_height="wrap_content"> </EditText> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Add"> </Button> <Button android:id="@+id/btnRead" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Read"> </Button> <Button android:id="@+id/btnClear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Clear"> </Button> </LinearLayout> </LinearLayout>
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper{ public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "contactDb"; public static final String TABLE_CONTACTS = "contacts"; public static final String KEY_ID = "_id"; public static final String KEY_NAME = "name"; public static final String KEY_MAIL = "mail"; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table " + TABLE_CONTACTS + "(" + KEY_ID + " integer primary key," + KEY_NAME + " text," + KEY_MAIL + " text" + ")"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists " + TABLE_CONTACTS); onCreate(db); } }
import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ Button btnAdd, btnRead, btnClear; EditText etName, etEmail; DBHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnAdd = (Button) findViewById(R.id.btnAdd); btnAdd.setOnClickListener(this); btnRead = (Button) findViewById(R.id.btnRead); btnRead.setOnClickListener(this); btnClear = (Button) findViewById(R.id.btnClear); btnClear.setOnClickListener(this); etName = (EditText) findViewById(R.id.etName); etEmail = (EditText) findViewById(R.id.etEmail); dbHelper = new DBHelper(this); } @Override public void onClick(View v) { String name = etName.getText().toString(); String email = etEmail.getText().toString(); SQLiteDatabase database = dbHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); switch (v.getId()) { case R.id.btnAdd: contentValues.put(DBHelper.KEY_NAME, name); contentValues.put(DBHelper.KEY_MAIL, email); database.insert(DBHelper.TABLE_CONTACTS, null, contentValues); break; case R.id.btnRead: Cursor cursor = database.query(DBHelper.TABLE_CONTACTS, null, null, null, null, null, null); if (cursor.moveToFirst()) { int idIndex = cursor.getColumnIndex(DBHelper.KEY_ID); int nameIndex = cursor.getColumnIndex(DBHelper.KEY_NAME); int emailIndex = cursor.getColumnIndex(DBHelper.KEY_MAIL); do { Log.d("mLog", "ID = " + cursor.getInt(idIndex) + ", name = " + cursor.getString(nameIndex) + ", email = " + cursor.getString(emailIndex)); } while (cursor.moveToNext()); } else Log.d("mLog","0 rows"); cursor.close(); break; case R.id.btnClear: database.delete(DBHelper.TABLE_CONTACTS, null, null); break; } dbHelper.close(); } }
Больше уроков:
Уроки Android Studio: тут
Инструменты android разработчика: тут
Дизайн android приложений: тут
Уроки создания игр для android: тут
Основы программирования на JAVA: тут
Урок 33. SharedPreferences – сохранение данных в приложениях | Уроки Android Studio
Урок 35. Добавление и удаление строк в базе данных SQLite в Android
Если у кого-то пример не работает и ругается на класс DBHelper, то в файле DBHelper.java добавьте самой первой строкой:
package com.example.p0341simplesqlite;
где «p0341simplesqlite» это имя модуля
Эта строка должна совпадать с аналогичной первой строкой в файле mainActivity.java
Доброго времени суток.
Сломал голову, но так и не могу понять, почему при нажатии кнопки READ у меня всегда получается лог «rows 0»
Код проверил 100500 раз,
потом скопировал с этой страницы,
всё равно «rows 0″(((
Подскажите кто-нибудь что за беда?
У меня была схожая проблема. Оказалось, что в скрипте создания таблицы пропустил пробел между названием столбца и типом. Исправил и увеличил DBHelper.DATABASES_VERSION, поскольку пересоздание таблицы выполняется в методе DBHelper.onUpgrade