SQLite Tutorial With Example In Android Studio
SQLite jest bazą danych opartą na zapytaniach strukturalnych, open source, lekką, bez dostępu do sieci i samodzielną bazą danych. Obsługuje wbudowane funkcje relacyjnej bazy danych.
Gdy aplikacja potrzebuje przechowywać duże ilości danych, użycie sqlite jest bardziej preferowane niż inne systemy repozytoriów jak SharedPreferences czy zapisywanie danych w plikach.
Android ma wbudowaną implementację bazy danych SQLite. Jest ona dostępna lokalnie na urządzeniu (mobilnym & tablet) i zawiera dane w formacie tekstowym. Nosi lekki ciężar danych i nadaje się do wielu języków. Tak więc, nie wymaga żadnej administracji lub procedury konfiguracji bazy danych.
Important Note – Utworzona baza danych jest zapisywana w katalogu: data/data/APP_Name/databases/DATABASE_NAME.
Tworzenie i aktualizacja bazy danych w Androidzie
Do tworzenia, aktualizacji i innych operacji musisz utworzyć podklasę lub klasę SQLiteOpenHelper. SQLiteOpenHelper jest klasą pomocniczą do zarządzania tworzeniem i wersjami baz danych. Udostępnia ona dwie metody onCreate(SQLiteDatabase db), onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion).
Klasa SQLiteOpenHelper jest odpowiedzialna za otwieranie bazy danych jeśli istnieje, tworzenie bazy danych jeśli nie istnieje oraz aktualizację jeśli jest wymagana. SQLiteOpenHelper wymaga jedynie DATABASE_NAME aby utworzyć bazę danych. Po rozszerzeniu SQLiteOpenHelper będziesz musiał zaimplementować jego metody onCreate, onUpgrade oraz konstruktor.
MetodaonCreate(SQLiteDatabase sqLiteDatabase) jest wywoływana tylko raz podczas całego cyklu życia aplikacji. Zostanie ona wywołana zawsze, gdy po raz pierwszy zostanie wywołana funkcja getReadableDatabase() lub getWritableDatabase() dostępna w klasie super SQLiteOpenHelper. Tak więc klasa SQLiteOpenHelper wywołuje metodę onCreate() po utworzeniu bazy danych i zainicjowaniu obiektu SQLiteDatabase. Nazwa bazy danych jest przekazywana w wywołaniu konstruktora.
onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) jest wywoływana tylko wtedy, gdy następuje aktualizacja istniejącej wersji. Aby zaktualizować wersję musimy więc inkrementować wartość zmiennej version przekazanej w konstruktorze nadklasy.
W metodzie onUpgrade możemy pisać zapytania wykonujące dowolną wymaganą akcję. W większości przykładów zobaczysz, że istniejące tabele są usuwane i ponownie wywoływana jest metoda onCreate() w celu ponownego utworzenia tabel. Ale nie jest to obowiązkowe i wszystko zależy od twoich wymagań.
Musimy zmienić wersję bazy danych jeśli dodaliśmy nowy wiersz w tabeli bazy danych. Jeśli mamy wymaganie, że nie chcemy stracić istniejących danych w tabeli to możemy napisać zapytanie alter table w metodzie onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion).
Po więcej szczegółów przeczytaj: Insert, Read, Delete & Update Operation In SQLite
SQLite Example In Android Studio
Get Better Understanding of Sqlite Before You Read Example – Aby lepiej zrozumieć bazę danych SQlite, zalecane jest przeczytanie najpierw poniższego artykułu:
- Wprowadzenie do SQLite i instalacja
- Lista wszystkich operatorów w SQLite
- Typ danych i polecenia w SQLite
- Lista wszystkich klauzul w SQLite do definiowania specyficznych warunków
- Insert, Read, Delete & Update Operation In SQLite
W tym przykładzie chcemy po prostu zilustrować operacje wstawiania, aktualizowania, usuwania i inne operacje SQLite na tabeli w Android Studi. Stworzyliśmy aktywność z widokiem tekstowym, przyciskiem i tekstem do edycji. Kolejna klasa, która rozszerza SQLiteOpenHelper, gdzie będą wykonywane operacje tworzenia i wstawiania. Przykład zawiera odpowiednią walidację, jak np. konieczność wprowadzenia danych przed wykonaniem jakiejkolwiek operacji.
Poniżej możesz pobrać kod, zobaczyć końcowe wyjście oraz wyjaśnienie krok po kroku:
Download Code
Krok 1: Utwórz nowy projekt i nazwij go SQLiteOperations.
Krok 2: Otwórz res -> layout -> activity_main.xml (lub) main.xml i dodaj następujący kod:
W tym kroku tworzymy layout w naszym pliku XML dodając pole tekstowe, przyciski, edittext. Na przycisku onclick jest zdefiniowana funkcja, która łączy go z powiązaną funkcją.
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" 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="com.example.sqliteoperations.MainActivity" android:background="@android:color/holo_blue_dark"> <TextView android:text="@string/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="12dp" android:id="@+id/textView" android:textSize="18sp" android:textStyle="bold|italic" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:gravity="center" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editName" android:textStyle="bold|italic" android:layout_below="@+id/textView" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:hint="Enter Name" android:gravity="center_vertical|center" /> <TextView android:text="@string/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="13dp" android:id="@+id/textView2" android:textStyle="bold|italic" android:textSize="18sp" android:layout_below="@+id/editName" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:gravity="center" android:hint="Enter Password" /> <Button android:text="@string/view_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:textSize="18sp" android:onClick="viewdata" android:textStyle="bold|italic" android:layout_alignBaseline="@+id/button" android:layout_alignBottom="@+id/button" android:layout_alignRight="@+id/button4" android:layout_alignEnd="@+id/button4" /> <Button android:text="@string/add_user" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button" android:textStyle="bold|italic" android:textSize="18sp" android:onClick="addUser" android:layout_marginLeft="28dp" android:layout_marginStart="28dp" android:layout_below="@+id/editPass" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="23dp" /> <Button android:text="@string/update" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3" android:onClick="update" android:textStyle="normal|bold" android:layout_below="@+id/editText3" android:layout_alignLeft="@+id/button4" android:layout_alignStart="@+id/button4" android:layout_marginTop="13dp" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editText6" android:layout_alignTop="@+id/button4" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:freezesText="false" android:hint="Enter Name to Delete Data" android:layout_toLeftOf="@+id/button2" android:layout_toStartOf="@+id/button2" /> <Button android:text="@string/delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="21dp" android:layout_marginEnd="21dp" android:id="@+id/button4" android:onClick="delete" android:textStyle="normal|bold" tools:ignore="RelativeOverlap" android:layout_marginBottom="41dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:layout_marginTop="47dp" android:id="@+id/editText3" android:textStyle="bold|italic" android:textSize="14sp" android:layout_below="@+id/button" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="7dp" android:layout_marginStart="7dp" android:hint="Current Name" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:ems="10" android:layout_marginTop="11dp" android:id="@+id/editPass" android:hint="Enter Password" android:gravity="center_vertical|center" android:textSize="18sp" android:layout_below="@+id/textView2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textAllCaps="false" android:textStyle="normal|bold" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editText5" android:textStyle="bold|italic" android:textSize="14sp" android:hint="New Name" android:layout_alignTop="@+id/button3" android:layout_alignLeft="@+id/editText3" android:layout_alignStart="@+id/editText3" android:layout_marginTop="32dp" /></RelativeLayout>
Krok 3: Teraz otwórz aplikację -> java -> package -> MainActivity.java i dodaj poniższy kod.
W tym kroku użyliśmy funkcji, które są powiązane z kliknięciem przycisku. Funkcje te są zdefiniowane w innych klasach i są używane tutaj. Każda funkcja zwraca wartość, która określa liczbę zaktualizowanych wierszy, używając tego określamy czy operacja się powiodła czy nie. Ponadto użytkownik musi zdefiniować poprawne dane, aby wykonać operację, puste pola nie będą obsługiwane i zwrócą błąd.
package com.example.sqliteoperations;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;public class MainActivity extends AppCompatActivity { EditText Name, Pass , updateold, updatenew, delete; myDbAdapter helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Name= (EditText) findViewById(R.id.editName); Pass= (EditText) findViewById(R.id.editPass); updateold= (EditText) findViewById(R.id.editText3); updatenew= (EditText) findViewById(R.id.editText5); delete = (EditText) findViewById(R.id.editText6); helper = new myDbAdapter(this); } public void addUser(View view) { String t1 = Name.getText().toString(); String t2 = Pass.getText().toString(); if(t1.isEmpty() || t2.isEmpty()) { Message.message(getApplicationContext(),"Enter Both Name and Password"); } else { long id = helper.insertData(t1,t2); if(id<=0) { Message.message(getApplicationContext(),"Insertion Unsuccessful"); Name.setText(""); Pass.setText(""); } else { Message.message(getApplicationContext(),"Insertion Successful"); Name.setText(""); Pass.setText(""); } } } public void viewdata(View view) { String data = helper.getData(); Message.message(this,data); } public void update( View view) { String u1 = updateold.getText().toString(); String u2 = updatenew.getText().toString(); if(u1.isEmpty() || u2.isEmpty()) { Message.message(getApplicationContext(),"Enter Data"); } else { int a= helper.updateName( u1, u2); if(a<=0) { Message.message(getApplicationContext(),"Unsuccessful"); updateold.setText(""); updatenew.setText(""); } else { Message.message(getApplicationContext(),"Updated"); updateold.setText(""); updatenew.setText(""); } } } public void delete( View view) { String uname = delete.getText().toString(); if(uname.isEmpty()) { Message.message(getApplicationContext(),"Enter Data"); } else{ int a= helper.delete(uname); if(a<=0) { Message.message(getApplicationContext(),"Unsuccessful"); delete.setText(""); } else { Message.message(this, "DELETED"); delete.setText(""); } } }}
Krok 4: W tym kroku tworzymy klasę java myDbAdapter. java.
W tej klasie definiujemy funkcje, które są używane do wykonywania operacji wstawiania, aktualizacji i usuwania w SQLite. W dalszej części tej klasy tworzymy kolejną klasę, która będzie rozszerzać SQLiteOpenHelper. Każda z funkcji posiada równoważne metody, które wykonują operacje.
Ważna uwaga – Zgodnie z konwencją nazewnictwa sugeruje się definiowanie klucza głównego zaczynającego się od podkreślenia, np: _id.
package com.example.sqliteoperations;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class myDbAdapter { myDbHelper myhelper; public myDbAdapter(Context context) { myhelper = new myDbHelper(context); } public long insertData(String name, String pass) { SQLiteDatabase dbb = myhelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(myDbHelper.NAME, name); contentValues.put(myDbHelper.MyPASSWORD, pass); long id = dbb.insert(myDbHelper.TABLE_NAME, null , contentValues); return id; } public String getData() { SQLiteDatabase db = myhelper.getWritableDatabase(); String columns = {myDbHelper.UID,myDbHelper.NAME,myDbHelper.MyPASSWORD}; Cursor cursor =db.query(myDbHelper.TABLE_NAME,columns,null,null,null,null,null); StringBuffer buffer= new StringBuffer(); while (cursor.moveToNext()) { int cid =cursor.getInt(cursor.getColumnIndex(myDbHelper.UID)); String name =cursor.getString(cursor.getColumnIndex(myDbHelper.NAME)); String password =cursor.getString(cursor.getColumnIndex(myDbHelper.MyPASSWORD)); buffer.append(cid+ " " + name + " " + password +" \n"); } return buffer.toString(); } public int delete(String uname) { SQLiteDatabase db = myhelper.getWritableDatabase(); String whereArgs ={uname}; int count =db.delete(myDbHelper.TABLE_NAME ,myDbHelper.NAME+" = ?",whereArgs); return count; } public int updateName(String oldName , String newName) { SQLiteDatabase db = myhelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(myDbHelper.NAME,newName); String whereArgs= {oldName}; int count =db.update(myDbHelper.TABLE_NAME,contentValues, myDbHelper.NAME+" = ?",whereArgs ); return count; } static class myDbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "myDatabase"; // Database Name private static final String TABLE_NAME = "myTable"; // Table Name private static final int DATABASE_Version = 1;. // Database Version private static final String UID="_id"; // Column I (Primary Key) private static final String NAME = "Name"; //Column II private static final String MyPASSWORD= "Password"; // Column III private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+ " ("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(255) ,"+ MyPASSWORD+" VARCHAR(225));"; private static final String DROP_TABLE ="DROP TABLE IF EXISTS "+TABLE_NAME; private Context context; public myDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_Version); this.context=context; } public void onCreate(SQLiteDatabase db) { try { db.execSQL(CREATE_TABLE); } catch (Exception e) { Message.message(context,""+e); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { try { Message.message(context,"OnUpgrade"); db.execSQL(DROP_TABLE); onCreate(db); }catch (Exception e) { Message.message(context,""+e); } } }}
Krok 5: W tym kroku należy utworzyć kolejną klasę java Message.class
W tym wystarczy dodać tost do wyświetlania wiadomości. To jest opcjonalne, to jest po prostu dodane do ponownie i ponownie definiując toast w przykładzie.
package com.example.sqliteoperations;import android.content.Context;import android.widget.Toast;public class Message { public static void message(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); }}
Output
Teraz uruchom aplikację i zobacz funkcjonalność dodaną nad przyciskami.
Dodanie & Retrieve Image From SQLite Database:
Aby zrozumieć, jak dodać lub pobrać obraz z zewnętrznego magazynu telefonu do aplikacji za pomocą bazy danych SQLite. Proszę przeczytać nasz krok po kroku dodać & retrieve obraz z SQLite tutorial.