Skip to content

Most visited

Recently visited

navigation

Menyimpan Data di Database SQL

Menyimpan data ke database cocok untuk data terstruktur atau berulang, misalnya informasi kontak. Kelas ini beranggapan bahwa Anda telah menguasai database SQL secara umum dan membantu Anda memulai database SQLite di Android. API yang nanti Anda perlukan untuk menggunakan database di Android tersedia dalam paket android.database.sqlite.

Mendefinisikan Skema dan Kontrak

Salah satu prinsip utama database SQL adalah skema: deklarasi formal mengenai cara menata database. Skema ini tercermin dalam pernyataan SQL yang Anda gunakan untuk membuat database. Anda akan merasakan gunanya saat membuat kelas pendamping, yang disebut dengan kelas kontrak, yang menetapkan secara eksplisit layout skema Anda dengan cara sistematis dan terdokumentasikan sendiri.

Kelas kontrak adalah kontainer untuk konstanta yang mendefinisikan nama untuk URI, tabel, dan kolom. Kelas kontrak memungkinkan Anda menggunakan konstanta yang sama di semua kelas lainnya dalam paket yang sama. Hal ini memungkinkan Anda mengubah nama kolom di satu tempat dan menyebarkannya ke seluruh kode Anda.

Cara yang baik untuk menata kelas kontrak adalah menempatkan definisi yang bersifat global ke seluruh database Anda di tingkat akar kelas itu. Kemudian buat sebuah kelas sisipan untuk setiap tabel yang menghitung kolom-kolomnya.

Catatan: Dengan mengimplementasikan antarmuka BaseColumns, kelas sisipan bisa mewarisi bidang kunci utama bernama _ID yang diharapkan untuk dimiliki oleh beberapa kelas Android seperti adaptor kursor. Hal ini tidak disyaratkan, namun bisa membantu database Anda untuk bekerja harmonis dengan kerangka kerja Android.

Misalnya, cuplikan ini mendefinisikan nama tabel dan nama kolom untuk tabel tunggal:

public final class FeedReaderContract {
    // To prevent someone from accidentally instantiating the contract class,
    // make the constructor private.
    private FeedReaderContract() {}

    /* Inner class that defines the table contents */
    public static class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_SUBTITLE = "subtitle";
    }
}

Membuat Database Menggunakan SQL Helper

Setelah mendefinisikan penampilan database, Anda harus mengimplementasikan metode yang membuat dan memelihara database dan tabel. Inilah beberapa pernyataan umum yang membuat dan menghapus tabel:

private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
    "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
    FeedEntry._ID + " INTEGER PRIMARY KEY," +
    FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
    FeedEntry.COLUMN_NAME_SUBTITLE + TEXT_TYPE + " )";

private static final String SQL_DELETE_ENTRIES =
    "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

Persis seperti file yang Anda simpan pada penyimpanan internal perangkat, Android menyimpan database Anda di ruang disk privat yang terkait dengan aplikasi. Data Anda akan aman, karena secara default area ini tidak bisa diakses aplikasi lain.

Serangkaian API berguna tersedia di kelas SQLiteOpenHelper. Bila Anda menggunakan kelas ini untuk memperoleh referensi ke database, sistem akan melakukan operasi pembuatan dan pembaruan database yang berpotensi berjalan lama hanya bila diperlukan dan tidak selama memulai aplikasi. Yang perlu Anda lakukan hanyalah memanggil getWritableDatabase() atau getReadableDatabase().

Catatan: Karena itu berjalan lama, pastikan Anda memanggil getWritableDatabase() atau getReadableDatabase() di thread latar belakang, misalnya dengan AsyncTask atau IntentService.

Untuk menggunakan SQLiteOpenHelper, buat subkelas yang mengganti onCreate(), onUpgrade() dan metode callback onOpen() . Anda juga mungkin perlu mengimplementasikan onDowngrade(), namun itu tidak diharuskan.

Misalnya, inilah implementasi SQLiteOpenHelper yang menggunakan beberapa perintah yang ditampilkan di atas:

public class FeedReaderDbHelper extends SQLiteOpenHelper {
    // If you change the database schema, you must increment the database version.
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "FeedReader.db";

    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // This database is only a cache for online data, so its upgrade policy is
        // to simply to discard the data and start over
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

Untuk mengakses database, buat instance subkelas SQLiteOpenHelper:

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());

Memasukkan Informasi ke Database

Sisipkan data ke dalam database dengan meneruskan objek ContentValues ke metode insert():

// Gets the data repository in write mode
SQLiteDatabase db = mDbHelper.getWritableDatabase();

// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle);

// Insert the new row, returning the primary key value of the new row
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values);

Argumen pertama untuk insert() adalah sekadar nama tabel.

Argumen kedua memberitahu kerangka kerja apa yang perlu dilakukan dalam kejadian ContentValues kosong (yaitu Anda tidak memasukkan put nilai apa pun). Jika Anda menetapkan nama kolom, kerangka kerja menyisipkan satu baris dan menetapkan nilai kolom nol. Jika Anda menetapkan null, seperti dalam sampel kode ini, kerangka kerja tidak menyisipkan baris saat tidak ada nilai.

Membaca Informasi dari Database

Untuk membaca dari database, gunakan metode query() , dengan meneruskan kriteria pemilihan dan kolom yang diinginkan. Metode ini menggabungkan elemen insert() dan update(), kecuali daftar kolom mendefinisikan data yang ingin Anda ambil, bukannya data yang akan disisipkan. Hasil kueri dikembalikan kepada Anda dalam objek Cursor.

SQLiteDatabase db = mDbHelper.getReadableDatabase();

// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
    FeedEntry._ID,
    FeedEntry.COLUMN_NAME_TITLE,
    FeedEntry.COLUMN_NAME_SUBTITLE
    };

// Filter results WHERE "title" = 'My Title'
String selection = FeedEntry.COLUMN_NAME_TITLE + " = ?";
String[] selectionArgs = { "My Title" };

// How you want the results sorted in the resulting Cursor
String sortOrder =
    FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";

Cursor c = db.query(
    FeedEntry.TABLE_NAME,                     // The table to query
    projection,                               // The columns to return
    selection,                                // The columns for the WHERE clause
    selectionArgs,                            // The values for the WHERE clause
    null,                                     // don't group the rows
    null,                                     // don't filter by row groups
    sortOrder                                 // The sort order
    );

Untuk melihat baris dalam kursor, gunakan salah satu metode move Cursor, yang harus selalu Anda panggil sebelum mulai membaca nilai. Umumnya, Anda harus mulai dengan memanggil moveToFirst(), yang menempatkan “posisi baca” pada entri pertama dalam hasil. Untuk setiap baris, Anda bisa membaca nilai kolom dengan memanggil salah satu metode get Cursor, misalnya getString() atau getLong(). Untuk setiap metode get, Anda harus meneruskan posisi indeks kolom yang diinginkan, yang bisa Anda dapatkan dengan memanggil getColumnIndex() atau getColumnIndexOrThrow(). Misalnya:

cursor.moveToFirst();
long itemId = cursor.getLong(
    cursor.getColumnIndexOrThrow(FeedEntry._ID)
);

Menghapus Informasi dari Database

Untuk menghapus baris dari tabel, Anda perlu memberikan kriteria pemilihan yang mengidentifikasi baris tersebut. API database menyediakan mekanisme untuk membuat kriteria pemilihan yang melindungi terhadap injeksi SQL. Mekanisme ini membagi spesifikasi pemilihan ke dalam satu klausa pemilihan dan beberapa argumen pemilihan. Klausa ini mendefinisikan kolom-kolom yang harus dilihat, juga memungkinkan Anda untuk menggabungkan pengujian kolom. Argumen adalah nilai-nilai yang harus diuji terhadap nilai yang terikat ke dalam klausa. Karena hasilnya tidak ditangani sama dengan pernyataan SQL biasa, hasil akan kebal terhadap injeksi SQL.

// Define 'where' part of query.
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { "MyTitle" };
// Issue SQL statement.
db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);

Memperbarui Database

Bila Anda perlu memodifikasi subset nilai database, gunakan metode update().

Pembaruan tabel akan menggabungkan sintaks nilai materi insert()dengan sintaks where delete().

SQLiteDatabase db = mDbHelper.getReadableDatabase();

// New value for one column
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);

// Which row to update, based on the title
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
String[] selectionArgs = { "MyTitle" };

int count = db.update(
    FeedReaderDbHelper.FeedEntry.TABLE_NAME,
    values,
    selection,
    selectionArgs);
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.