SQLite 1. Pengenalan SQLite SQLite itu merupakan sebuah Database yang bersifat ACID-compliant dan memiliki ukuran pustaka kode yang relatif kecil, ditulis dalam bahasa C. SQLite merupakan proyek yang bersifat public domain yang dikerjakan oleh D. Richard Hipp. SQLite memiliki fitur relasional database, hampir sama dengan SQL pada desktop hanya saja SQLite membutuhkan memori yang sedikit. Beberapa produk yang sudah menggunakan yaitu PHP, Firefox, Chrome, iPhone dan Android adalah contoh produk yang menggunakan SQlite. di Browser firefox, Sqlite dipakai untuk menyimpan konfigurasi, bookmark dan history website sedangkan di smartphone android, SQLite dipakai untuk menyimpan contact. SQLite adalah produk public domain. Artinya tidak punya lisensi, anda boleh mengambil binary atau source codenya secara free / GRATIS. Anda boleh membuat software dengan lisensi suka suka anda. Anda boleh mengopensourcekan atau mengkomersialkan itu bebas anda lakukan. Tipe data yang didukung di SQLite :
Numeric ( integer , float , double), Text ( Char , varchar , text ) DATETIME BLOB. SQLite mendukung semua platform. Anda bebas memilih OS, mau pakai Windows, Linux, Mac OSX bahkan Android atau iPhone pun bisa. Tool yang cukup populer adalah SQLite manager. SQLite manager adalah plugin Firefox, sedangkan tool berbasis web adalah SQLiteManager yang dibuat dengan PHP dan bisa menggunakan Navicat. Ada beberapa cara memahami atau mempelajari SQLite yaintu dengan beberapa tutorial di bawah ini: Dokumentasi SQLite, Dokumentasi resmi SQLite. Zetcode SQlite tutorial . Tutorial perintah dasar SQLite . Zetcode PHP SQLite tutorial. Tutorial cara membuat program web menggunakan PHP dan SQLite.
Pada kesempatan kali ini saya akan berbagi artikel tentang SQLite di Android. Sebagaimana bahwa SQLite adalah sistem yang opensource yang berkompatible dengan sistem Android juga.
SQLite di Android SQLite tersedia pada setiap perangkat Android. Menggunakan SQLite database di Android tidak memerlukan setup database atau administrasi. Anda menentukan SQL untuk bekerja dengan database dan database dikelola secara otomatis untuk Anda. Bekerja dengan database bisa lambat. Oleh karena itu dianjurkan untuk melakukan tugas tersebut di latar belakang, misalnya melalui AsyncTask . Jika aplikasi Anda menciptakan sebuah database database ini disimpan di direktoriDATA/data/APP_NAME/databases/FILENAME . DATA adalah jalan yangEnvironment.getDataDirectory() mengembalikan, APP_NAME adalah nama aplikasi Anda danFILENAME adalah nama yang Anda berikan database selama penciptaan.Environment.getDataDirectory() biasanya kembali kartu SD sebagai lokasi.
Penyedia konten dan berbagi data Sebuah SQLite database pribadi ke aplikasi yang menciptakan itu. Jika Anda ingin berbagi data dengan aplikasi lain Anda dapat menggunakan ContentProvider . Jika data tidak dibagi biasanya lebih mudah untuk bekerja secara langsung dengan database. ContentProviders bukan bagian dari tutorial ini.
2. Arsitektur Android
Paket Paket android.database berisi semua kelas umum untuk bekerja dengan database.android.database.sqlite berisi kelas SQLite tertentu.
SQLiteOpenHelper Untuk membuat dan meng-upgrade database dalam aplikasi Android Anda Anda biasanya subclassSQLiteOpenHelper . Di kelas ini, Anda perlu mengganti metode onCreate() untuk membuat database danonUpgrade() untuk meng-upgrade database dalam kasus perubahan dalam skema database. Kedua metode menerima SQLiteDatabase objek yang mewakili database. SQLiteOpenHelper menyediakan metode getReadableDatabase() dan getWriteableDatabase()untuk mendapatkan akses ke SQLiteDatabase objek yang memungkinkan akses database baik dalam membaca atau menulis modus. Untuk primary key dari tabel database Anda selalu harus menggunakan identifier _id karena beberapa fungsi Android bergantung pada standar ini. Sebuah praktek terbaik adalah untuk menciptakan per meja kelas terpisah yang menentukan statis onCreate()dan onUpdate() metode. Metode ini kemudian disebut dalam metode yang sesuai SQLiteOpenHelper .Penerapan cara ini Anda SQLiteOpenHelper tidak akan bisa besar bahkan jika Anda memiliki beberapa tabel.
SQLiteDatabase SQLiteDatabase adalah kelas dasar untuk bekerja dengan SQLite database di Android dan menyediakan metode untuk membuka, query, update dan menutup database. Lebih khusus SQLiteDatabase menyediakaninsert() , update() dan delete() metode. Para execS QL() metode memungkinkan untuk mengeksekusi SQL secara langsung. Objek ContentValues memungkinkan untuk mendefinisikan kunci / nilai untuk insert dan update. Kuncinya adalah kolom dan nilai adalah nilai untuk kolom ini. Query dapat dibuat melalui metode rawQuery() yang menerima SQL atau query() yang menyediakan sebuah antarmuka untuk menentukan data yang dinamis atau SQLiteQueryBuilder . Misalnya untuk menjalankan rawQuery() Anda dapat melakukan hal berikut:
Kursor kursor = getReadableDatabase () rawQuery ("* pilih dari todo mana = _id?", New String [] {id}).;
Metode query() memiliki parameter berikut.
String dbName - Nama tabel untuk mengkompilasi query terhadap
int[] columnNames - Sebuah daftar yang kolom untuk kembali. Melewati null akan mengembalikan semua kolom.
String whereClause - Filter untuk pemilihan data tanpa "MANA" klausa, null akan memilih semua
selectionArgs Anda mungkin termasuk s di whereClause, yang akan digantikan oleh nilainilai dari selectionArgs?.
String[] groupBy - A filter declaring how to group rows, null will cause the rows to not be grouped.
String[] having - Filter untuk goups, nol berarti tidak ada filter
String[] orderBy - row which will be used to order the data, null means no ordering
Jika semua data harus dipilih, Anda dapat melewati null sebagai klausa mana. Klausul mana ditentukan tanpawhere , misalnya _id=19 and summary=? . Jika beberapa nilai yang diperlukan melalui ? Anda melewatkan mereka dalam array valuesForWhereClause untuk query. Secara umum, jika ada sesuatu yang tidak diperlukan Anda dapat melewati null , misalnya untuk kelompok dengan klausa.
Misalnya untuk menjalankan query() Anda dapat melakukan hal berikut:
kembali database.query (DATABASE_TABLE, new String [] {KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY, KEY_DESCRIPTION}, null, null, null, null, null);
Kursor Sebuah permintaan selalu mengembalikan Cursor . Kursor mewakili hasil dari query dan pada dasarnya poin selalu satu baris dari database. Dengan cara ini Android dapat buffer hasil efisien karena tidak harus memuat semua data ke dalam memori. Untuk mendapatkan jumlah elemen menggunakan metode getCount() . Untuk beralih di antara baris data individu, Anda dapat menggunakan metode moveToFirst() dan moveToNext() . Melalui metodeisAfterLast() Anda dapat memeriksa apakah masih ada beberapa data. Kursor dapat langsung digunakan melalui SimpleCursorAdapter di ListViews .
3. Antarmuka baris perintah untuk SQLite Hal ini dimungkinkan untuk mengakses database SQLite pada emulator atau perangkat berakar melalui baris perintah. Untuk menggunakan ini adb shell untuk menghubungkan ke perangkat dan perintah "sqlite3" untuk menghubungkan ke database yang.
Contoh pembuatan aplikasi program contact pada Android menggunakan SQLite Pada contoh penggunaan sqlite ini saya akan membuat sebuah aplikasi android untuk menyimpan “Contact”, data yang saya simpan adalahNama dan Nomer Telepon. Untuk langkah pertama saya mempersiapkan sebuah class entity untuk Contact. Berikut ini classnya.. /* * (c) 2013
* @author Pratama Nur Wijaya * * Project
: SQLiteTutorials
* Filename
: Contact.java
* Creation Date : Feb 23, 2013 time : 9:17:15 PM * */
package com.example.sqlitetutorials;
public class Contact { private int
id;
private String name; private String telp;
public Contact() { // TODO Auto-generated constructor stub }
public Contact(String name, String telp) {
super(); this.name = name; this.telp = telp; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name;
}
public String getTelp() { return telp; }
public void setTelp(String telp) { this.telp = telp; }
}
class ini hanyalah berisi nama table yang akan ada didatabase kita nanti, beserta method getter dan setter. Selanjut adalah mepersiapkan class untuk menangani proses CRUD(Create, Read, Update, Delete). Disini saya membuat sebuah class yang saya berinama DBAdapter, berikut ini class yang saya maksud.
/* * (c) 2013 * @author Pratama Nur Wijaya * * Project
: SQLiteTutorials
* Filename
: ContactDBHelper.java
* Creation Date : Feb 23, 2013 time : 9:18:36 PM * */
package com.example.sqlitetutorials;
import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;
public class DBAdapter { private static final String
DB_NAME
= "contact_db";
private static final int
DB_VER
= 1;
public static final String
TABLE_NAME
= "contact";
public static final String
COL_ID
= "_id";
public static final String
COL_NAME
= "name";
public static final String
private static final String "ContactDBAdapter";
COL_TELP
= "telp";
TAG
private DatabaseHelper
dbHelper;
private SQLiteDatabase
db;
=
private static final String DB_CREATE = "create table contact (_id integer primary key, name text not null, telp text not null);";
private final Context
context;
private static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) { // TODO Auto-generated constructor stub super(context, DB_NAME, null, DB_VER); }
@Override public void onCreate(SQLiteDatabase db)
{ // TODO Auto-generated method stub db.execSQL(DB_CREATE); }
@Override
int newVersion)
public void onUpgrade(SQLiteDatabase db, int oldVersion,
{ // TODO Auto-generated method stub Log.d(TAG, "upgrade DB"); db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db);
}
}
public DBAdapter(Context context) { this.context = context; // TODO Auto-generated constructor stub }
public DBAdapter open() throws SQLException { dbHelper = new DatabaseHelper(context); db = dbHelper.getWritableDatabase(); return this; }
public void close() { dbHelper.close(); }
public void createContact(Contact contact) { ContentValues val = new ContentValues(); val.put(COL_NAME, contact.getName()); val.put(COL_TELP, contact.getTelp()); db.insert(TABLE_NAME, null, val); }
public boolean deleteContact(int id) {
return db.delete(TABLE_NAME, COL_ID + "=" + id, null) > 0; }
public Cursor getAllContact() { return db.query(TABLE_NAME, new String[] { COL_ID, COL_NAME, COL_TELP }, null, null, null, null, null); }
public Cursor getSingleContact(int id) { Cursor cursor = db.query(TABLE_NAME, new String[] { COL_ID, COL_NAME, COL_TELP }, COL_ID + "=" + id, null, null, null, null);
if (cursor != null) cursor.moveToFirst();
return cursor; }
public boolean updateContact(Contact contact) { ContentValues val = new ContentValues(); val.put(COL_NAME, contact.getName()); val.put(COL_TELP, contact.getTelp());
return db.update(TABLE_NAME, val, COL_ID + "=" + contact.getId(), null) > 0; }
}
pada class DBAdapter, terdapat method untuk update, insert, sampai delete.. untuk class mainactivitynya penampakannya seperti berikut :
package com.example.sqlitetutorials;
import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.support.v4.widget.SimpleCursorAdapter; import android.view.Menu;
import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.EditText; import android.widget.ListView;
public class MainActivity extends Activity implements OnItemClickListener { public static final String
KEY_ID
= "_id";
private static final int
INSERT_ID
= Menu.FIRST;
EditText
empty;
private ListView
listview;
private DBAdapter
db;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new DBAdapter(this);
db.open();
listview = (ListView) findViewById(R.id.list); listview.setEmptyView(findViewById(R.id.empty));
listview.setOnItemClickListener(this);
loadData(); }
private void loadData() { // TODO Auto-generated method stub Cursor cur = db.getAllContact();
String[] from = new String[] { DBAdapter.COL_NAME, DBAdapter.COL_TELP }; int[] to = new int[] { R.id.txtName, R.id.txtPhoneNumber };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_adapter, cur, from, to); listview.setAdapter(adapter); }
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. menu.add(0, INSERT_ID, 0, R.string.menu_add); return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case INSERT_ID:
AddContact.class));
startActivity(new Intent(MainActivity.this,
break;
} return super.onOptionsItemSelected(item); }
@Override public void onItemClick(AdapterView> arg0, View v, int pos, long id) { // TODO Auto-generated method stub Bundle bundle = new Bundle(); bundle.putLong(KEY_ID, id); Intent intent = new Intent(MainActivity.this, EditActivity.class); intent.putExtras(bundle); db.close(); startActivity(intent);
}
}
di file mainActivity saya menggunakan SimpleCursorAdapter untuk menampilkan data yang ada kedalam listview yang sudah saya tambahkan di file xml nya. Kemudian mainActivity ini juga memiliki menu option yang akan muncul ketika user mengklik tombol menu yang ada di handset, jika user menekan tombol menu, maka akan muncul menu Insert dan activity berpindah ke AddContact, untuk file main_activity.xml sebagai berikut :
untuk class AddContact sebagai berikut :
/* * (c) 2013 * @author Pratama Nur Wijaya * * Project
: SQLiteTutorials
* Filename
: AddContact.java
* Creation Date : Feb 23, 2013 time : 11:52:56 PM * */
package com.example.sqlitetutorials;
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText;
public class AddContact extends Activity implements OnClickListener { EditText
inputName, inputNumber;
Button
btnAdd;
DBAdapter
db;
@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); db = new DBAdapter(this); db.open();
setContentView(R.layout.add);
inputName = (EditText) findViewById(R.id.inputName); inputNumber = (EditText) findViewById(R.id.inputNumber); btnAdd = (Button) findViewById(R.id.btnAdd); btnAdd.setOnClickListener(this); }
@Override
public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btnAdd: Contact contact = new Contact();
contact.setName(inputName.getText().toString());
contact.setTelp(inputNumber.getText().toString());
db.createContact(contact); startActivity(new Intent(AddContact.this, MainActivity.class)); db.close(); finish(); break;
default: break; }
}
}
dan file xml nya
<EditText android:id="@+id/inputName" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/hint_name" > <requestFocus />
<EditText android:id="@+id/inputNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/hint_phone" android:inputType="numberPassword" /> <Button android:id="@+id/btnAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_add" />
untuk bagian edit atau delete contact saya membuat sebuah activity yakni EditActivity untuk menangani Edit contact dam delete contact
package com.example.sqlitetutorials;
import android.os.Bundle;
import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText;
public class EditActivity extends Activity implements OnClickListener { DBAdapter
db;
EditText
editName, editPhone;
Button
btnSave, btnDelete;
int
id;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit);
db = new DBAdapter(this); db.open();
Bundle b = getIntent().getExtras(); id = (int) b.getLong(MainActivity.KEY_ID);
editName = (EditText) findViewById(R.id.editName); editPhone = (EditText) findViewById(R.id.editPhone); btnSave = (Button) findViewById(R.id.editBtnSave); btnDelete = (Button) findViewById(R.id.editBtnDelete);
btnSave.setOnClickListener(this); btnDelete.setOnClickListener(this);
tampilData(); }
private void tampilData() { // TODO Auto-generated method stub Cursor cursor = db.getSingleContact(id);
editName.setText(cursor.getString(cursor.getColumnIndexOrThrow(DBAdapter.CO L_NAME)));
editPhone.setText(cursor.getString(cursor.getColumnIndexOrThrow(DBAdapter.C OL_TELP))); }
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.edit, menu); return true; }
@Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.editBtnSave:
Contact contact = new Contact(); contact.setId(id);
contact.setName(editName.getText().toString());
contact.setTelp(editPhone.getText().toString());
db.updateContact(contact);
MainActivity.class));
startActivity(new Intent(EditActivity.this,
finish(); break; case R.id.editBtnDelete:
db.deleteContact(id); startActivity(new Intent(EditActivity.this, MainActivity.class)); finish(); break; }
}
}
file xmlnya..
<EditText android:id="@+id/editName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editex" android:layout_below="@+id/editex"
android:layout_marginTop="14dp" android:ems="10" > <requestFocus /> <EditText android:id="@+id/editPhone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="27dp" android:ems="10" android:inputType="phone" /> <Button android:id="@+id/editBtnSave"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editPhone" android:layout_below="@+id/editPhone" android:layout_marginTop="35dp" android:text="Save" /> <Button android:id="@+id/editBtnDelete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editBtnSave" android:layout_alignBottom="@+id/editBtnSave" android:layout_alignRight="@+id/editPhone" android:text="Delete" />