SQLite Tutorial mit Beispiel in Android Studio
SQLite ist eine Datenbank auf Basis von Strukturabfragen, Open Source, leichtgewichtig, ohne Netzwerkzugriff und als eigenständige Datenbank. Es unterstützt eingebettete relationale Datenbankfunktionen.
Wenn eine Anwendung große Datenmengen speichern muss, dann ist die Verwendung von Sqlite besser als andere Repository-Systeme wie SharedPreferences oder das Speichern von Daten in Dateien.
Android hat eine eingebaute SQLite-Datenbankimplementierung. Sie ist lokal über das Gerät (mobiles & Tablet) verfügbar und enthält Daten im Textformat. Sie trägt leichtgewichtige Daten und ist für viele Sprachen geeignet. Es ist also keine Administration oder Setup-Prozedur der Datenbank erforderlich.
Wichtiger Hinweis – Die erstellte Datenbank wird in einem Verzeichnis gespeichert: data/data/APP_Name/databases/DATABASE_NAME.
Datenbank in Android erstellen und aktualisieren
Für das Erstellen, Aktualisieren und andere Operationen müssen Sie eine Unterklasse oder die Klasse SQLiteOpenHelper erstellen. SQLiteOpenHelper ist eine Hilfsklasse zur Verwaltung der Datenbankerstellung und Versionsverwaltung. Sie stellt zwei Methoden onCreate(SQLiteDatabase db), onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) zur Verfügung.
Der SQLiteOpenHelper ist für das Öffnen der Datenbank zuständig, wenn sie existiert, für das Erstellen der Datenbank, wenn sie nicht existiert, und für das Upgraden, wenn erforderlich. Der SQLiteOpenHelper benötigt nur den DATABASE_NAME, um die Datenbank zu erstellen. Nachdem Sie den SQLiteOpenHelper erweitert haben, müssen Sie seine Methoden onCreate, onUpgrade und den Konstruktor implementieren.
Die Methode onCreate(SQLiteDatabase sqLiteDatabase) wird nur einmal während des gesamten Lebenszyklus der Anwendung aufgerufen. Sie wird immer dann aufgerufen, wenn es einen ersten Aufruf der Funktion getReadableDatabase() oder getWritableDatabase() gibt, die in der Super-SQLiteOpenHelper-Klasse verfügbar ist. Die Klasse SQLiteOpenHelper ruft also die Methode onCreate() auf, nachdem eine Datenbank erstellt und ein SQLiteDatabase-Objekt instanziiert wurde. Der Datenbankname wird im Konstruktoraufruf übergeben.
onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) wird nur aufgerufen, wenn es eine Aktualisierung in der bestehenden Version gibt. Um eine Version zu aktualisieren, müssen wir also den Wert der im Konstruktor der Superklasse übergebenen Variable version inkrementieren.
In der Methode onUpgrade können wir Abfragen schreiben, um die gewünschte Aktion durchzuführen. In den meisten Beispielen werden Sie sehen, dass bestehende Tabellen gelöscht werden und wiederum die onCreate()-Methode aufgerufen wird, um Tabellen neu zu erstellen. Aber das ist nicht zwingend erforderlich und hängt von Ihren Anforderungen ab.
Wir müssen die Datenbankversion ändern, wenn wir eine neue Zeile in der Datenbanktabelle hinzugefügt haben. Wenn wir die Anforderung haben, dass wir die bestehenden Daten in der Tabelle nicht verlieren wollen, dann können wir die Abfrage alter table in der Methode onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) schreiben.
Für weitere Details lesen Sie: Einfügen, Lesen, Löschen & Update-Operation in SQLite
SQLite-Beispiel in Android Studio
Vor dem Lesen des Beispiels ein besseres Verständnis von Sqlite erlangen – Um ein besseres Verständnis der SQlite-Datenbank zu erhalten, wird empfohlen, zuerst den folgenden Artikel zu lesen:
- Einführung in SQLite und Installation
- Liste aller Operatoren in SQLite
- Datentyp und Befehle in SQLite
- Liste aller Klauseln in SQLite zum Definieren bestimmter Bedingungen
- Einfügen, Lesen, Löschen & Update-Operation in SQLite
In diesem Beispiel wollen wir einfach das Einfügen, Aktualisieren, Löschen und weitere Operationen von SQLite über eine Tabelle in Android Studi veranschaulichen. Dazu haben wir eine Aktivität erstellt, die eine Textansicht, einen Button und einen Editiertext enthält. Eine weitere Klasse, die SQLiteOpenHelper erweitert, in der die Create- und Insert-Operationen durchgeführt werden. Das Beispiel enthält eine ordentliche Validierung, wie z.B. die Eingabe von Daten, bevor eine Operation ausgeführt wird.
Nachfolgend können Sie den Code herunterladen, die endgültige Ausgabe und die Schritt-für-Schritt-Erklärung sehen:
Code herunterladen
Schritt 1: Erstellen Sie ein neues Projekt und nennen Sie es SQLiteOperations.
Schritt 2: Öffnen Sie res -> layout -> activity_main.xml (oder) main.xml und fügen Sie folgenden Code ein:
In diesem Schritt erstellen wir ein Layout in unserer XML-Datei und fügen Textbox, Buttons, edittext hinzu. Auf der Schaltfläche wird onclick definiert und mit der entsprechenden Funktion verknüpft.
<?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>
Schritt 3: Öffnen Sie nun app -> java -> package -> MainActivity.java und fügen Sie den folgenden Code ein.
In diesem Schritt haben wir die Funktionen verwendet, die über den Schaltflächenklick verknüpft werden. Diese Funktionen sind in einer anderen Klasse definiert und werden hier verwendet. Jede Funktion gibt einen Wert zurück, der die Anzahl der aktualisierten Zeilen angibt, und damit wird definiert, ob die Operation erfolgreich ist oder nicht. Außerdem muss der Benutzer gültige Daten definieren, um die Operation ausführen zu können. Leere Felder werden nicht berücksichtigt und geben einen Fehler zurück.
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(""); } } }}
Schritt 4: In diesem Schritt wird eine Java-Klasse myDbAdapter.java erstellt.
In dieser definieren wir die Funktionen, die verwendet werden, um die Operationen Insert, Update und Delete in SQLite durchzuführen. Weiterhin wird in dieser Klasse eine weitere Klasse erstellt, die den SQLiteOpenHelper erweitern wird. Jede Funktion trägt äquivalente Methoden, die Operationen ausführen.
Wichtiger Hinweis – Gemäß der Namenskonvention wird vorgeschlagen, den Primärschlüssel beginnend mit einem Unterstrich zu definieren Beispiel: _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); } } }}
Schritt 5: In diesem Schritt erstellen Sie eine weitere Java-Klasse Message.class
In dieser fügen Sie einfach Toast für die Anzeige der Nachricht hinzu. Dies ist optional, es wird nur hinzugefügt, um im Beispiel immer wieder Toast zu definieren.
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(); }}
Ausgabe
Nun starten Sie die App und sehen Sie sich die Funktionalität an, die über die Buttons hinzugefügt wurde.
Add & Bild aus SQLite-Datenbank abrufen:
Um zu verstehen, wie man Bilder aus dem externen Speicher des Telefons zur Anwendung hinzufügt oder abruft, verwenden Sie die SQLite-Datenbank. Bitte lesen Sie unsere Schritt-für-Schritt-Anleitung zum Hinzufügen & Abrufen von Bildern aus der SQLite-Datenbank.