This tutorial is presented by Wawan Chahyo Nugroho (NIM: 12131294) as part of the Mobile Programming final exam, supervised by Mr. Untung Subagyo, S.Kom.
SQLite is a self-contained, independent library with minimal dependencies. It can handle transactions using an SQL database engine without the need for a server or configuration.
SQLite runs on any operating system, including embedded systems. It’s fully encapsulated in a single source code library, so it doesn’t require special tools to build it.
SQLite supports all relational database features, so you don’t need to establish a connection as you would with JDBC, ODBC, etc. It’s an open-source database under the public domain, so you’re free to use it for any purpose, commercial or non-commercial. It’s widely used across applications globally.
Example Use Case
Let's create an application to store client information like ID card details: NIK, Name, DOB, Gender, Address, Religion, Status, Occupation, and Nationality. We’ll use the basic database management concepts of CRUD (Create, Read, Update, Delete).
How Android Manages Data in the Database
- Define Schema and Contract
- Create Database Using SQL Helper
- Insert Information into Database
- Read Information from Database
- Update Database
- Delete Information from Database
1. Define Schema and Contract
A key principle of SQL databases is the schema, which defines how to organize the database. This includes SQL statements to set up the database. You can create a companion class (also known as a contract class) that clearly documents the layout of your schema.
| Field | Data Type | Key |
|-----------|-------------|---------|
| ID | integer | Primary |
| firstname | text unique | |
| lastname | text | |
2. Create Database Using SQL Helper
Tip: Always use keyboard shortcuts like CTRL+SPACE or ALT+ENTER for easier debugging as you work with the code snippets below.
Steps to Create a New Project:
- Open Android Studio.
- Select "New Project" → Name it (e.g., "StudentApp") → Next.
- Choose Target Device → Check Phone and Tablet → API 14: Android 4.0 (IceCreamSandwich) → Next.
- Select Empty Activity as the main layout → Set Activity & Layout names → Finish.
- Open activity_main.xml in Design mode.
- Drag and drop Plain Text, TextView, and four Buttons into the layout → Set properties like ID, Text, and Size.
Alternatively, use Text mode to adjust the code as shown below:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.gatewan.mahasiswa.MainActivity">
<EditText
android:id="@+id/firstname_input"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Firstname"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.503"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<EditText
android:id="@+id/lastname_input"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Lastname"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.503"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.117" />
<Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:onClick="btn_click"
android:text="Delete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.878"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.243" />
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:onClick="btn_click"
android:text="Add"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.121"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.243" />
<Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:onClick="btn_click"
android:text="Update"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.121"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.382" />
<Button
android:id="@+id/btn_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:onClick="btn_click"
android:text="List"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.878"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.382" />
<TextView
android:id="@+id/textView"
android:layout_width="304dp"
android:layout_height="220dp"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:text="Large Text"
android:textAlignment="center"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0"
tools:layout_editor_absoluteY="283dp" />
</android.support.constraint.ConstraintLayout>
Step 7: Create the Database Controller Class
Create a Java class named DB_Controller in the same package as MainActivity:
DB_Controller.java
package com.gatewan.mahasiswa;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.TextView;
/**
* Created by WawanBeneran on 6/12/2017.
* NIM.12131294
*/
public class DB_Controller extends SQLiteOpenHelper {
public DB_Controller(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, "TEST.DB", factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("CREATE TABLE STUDENTS(ID INTEGER PRIMARY KEY AUTOINCREMENT, FIRSTNAME TEXT UNIQUE, LASTNAME TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS STUDENTS;");
onCreate(sqLiteDatabase);
}
public void insert_student(String firstname, String lastname){
ContentValues contentValues = new ContentValues();
contentValues.put("FIRSTNAME", firstname);
contentValues.put("LASTNAME", lastname);
this.getWritableDatabase().insertOrThrow("STUDENTS","",contentValues);
}
public void delete_student(String firstname){
this.getWritableDatabase().delete("STUDENTS","FIRSTNAME='"+firstname+"'",null);
}
public void update_student(String old_firstname, String new_firstname){
this.getWritableDatabase().execSQL("UPDATE STUDENTS SET FIRSTNAME='"+new_firstname+"' WHERE FIRSTNAME='"+old_firstname+"'");
}
public void list_all_students(TextView textView){
Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM STUDENTS", null);
textView.setText("");
while (cursor.moveToNext()){
textView.append(cursor.getString(1)+" "+cursor.getString(2)+"\n");
}
}
}
Step 8: Configure MainActivity.java
package com.gatewan.mahasiswa;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText firstname,lastname;
TextView textView;
DB_Controller controller;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstname = (EditText)findViewById(R.id.firstname_input);
lastname = (EditText)findViewById(R.id.lastname_input);
textView = (TextView)findViewById(R.id.textView);
controller = new DB_Controller(this,"",null,1);
}
public void btn_click(View view){
switch(view.getId()){
case R.id.btn_add:
try {
controller.insert_student(firstname.getText().toString(),lastname.getText().toString());
}catch (SQLiteException e){
Toast.makeText(MainActivity.this, "ALREADY EXIST", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_delete:
controller.delete_student(firstname.getText().toString());
break;
case R.id.btn_update:
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("ENTER NEW FIRSTNAME ");
final EditText new_firstname = new EditText(this);
dialog.setView(new_firstname);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialogInterface, int i){
controller.update_student(firstname.getText().toString(),new_firstname.getText().toString());
}
});
dialog.show();
break;
case R.id.btn_list:
controller.list_all_students(textView);
break;
}
}
}
Step 9: Run your project using AVD as demonstrated below.