Tutorial Android : Contoh CRUD Sederhana Dengan Database SQLite di Android

Akhirnya saya bisa pulang juga ke Denpasar, lumayan bisa saya gunakan untuk refreshing sejenak dari kegiatan di pulau seberang. Kebetulan juga, saya diminta untuk membantu seorang teman cewek dari STIKOM Bali (yang baru saja kenal) mengerjakan tugas akhirnya. Hitung-hitung nambah teman+koneksi dan saya juga gak menolak kalo si doi bisa berjodoh dengan saya đŸ˜€ (ngarep). Saat membantu si doi, saya juga sempat bertanya-tanya tentang tema tugas akhir dan skripsi yang diajukan oleh mahasiswa di kampusnya, ternyata hampir sebagian besar yang mengangkat tema tentang android. Wah, berbeda jauh dengan kampus saya, yang mengangkat tema tentang android masih bisa dihitung dengan jari. Si doi juga bercerita, bahwa mahasiswa yang sedang mengambil skripsi dibebaskan untuk lalu-lalang di kampus+menggunakan fasilitas kampus. Sungguh berbeda jauh dengan kampus saya, dimana saya kemarin sempat diusir dari kampus gara-gara cuma numpang mengerjakan jurnal penelitian di litbang. Ck..ck..ck..itulah kampus saya, apresiasi terhadap kegiatan mahasiswa yang positif saja masih kurang. Saya pun pesimis kampus saya yang tercinta bisa berkembang dan lebih maju dari sekarang. Mungkin celotehan saya di tulisan ini hanya dianggap angin lalu oleh pak Ketua yang baru, yaw biasalah orang yang sudah ada di atas gak pernah peduli dengan bawahannya. Rasanya saya ingin cepat-cepat lulus.

Nah, ngomong-ngomong tentang android, kemarin saya iseng-iseng membuat sebuah class sederhana untuk menangani CRUD pada database SQLite di android. Method yang saya gunakan cukup sederhana, saya mengikuti standarisasi yang ada di developer.android.com. Lumayan tuh class’nya, untuk rekan-rekan yang kebetulan juga sedang mengambil TA atau skripsi tentang android :ngakaks:. Berikut potongan kode classnya :

SqliteManager.java

public class SqliteManager {
	public static final int VERSI_DATABASE= 1;
	public static final String NAMA_DATABASE = "dbCrudSqlite";
	public static final String NAMA_TABEL = "tbAgenda";

	public static final String FIELD_ID = "_id";
	public static final int POSISI_ID = 0;
	public static final String FIELD_JUDUL = "judul";
	public static final int POSISI_JUDUL = 1;
	public static final String FIELD_DESKRIPSI = "deskripsi";
	public static final int POSISI_DESKRIPSI = 2;
	public static final String FIELD_WAKTU = "waktu";
	public static final int POSISI_WAKTU = 3;

	public static final String[] FIELD_TABEL ={ SqliteManager.FIELD_ID, SqliteManager.FIELD_JUDUL, SqliteManager.FIELD_DESKRIPSI, SqliteManager.FIELD_WAKTU };

	private Context crudContext;
	private SQLiteDatabase crudDatabase;
	private SqliteManagerHelper crudHelper;

	private static class SqliteManagerHelper extends SQLiteOpenHelper {
		private static final String BUAT_TABEL =
			"create table " + NAMA_TABEL + " (" +
			SqliteManager.FIELD_ID + " integer primary key autoincrement, " +
			SqliteManager.FIELD_JUDUL + " text not null, " +
			SqliteManager.FIELD_DESKRIPSI + " text not null," +
			SqliteManager.FIELD_WAKTU + " text not null " +
			");";

		public SqliteManagerHelper(Context context) {
			super(context, NAMA_DATABASE, null, VERSI_DATABASE);
		}

		@Override
		public void onCreate(SQLiteDatabase database) {
			database.execSQL(BUAT_TABEL);
		}

		@Override
		public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {}
	}

	public SqliteManager(Context context) {
		crudContext = context;
	}

	public void bukaKoneksi() throws SQLException {
		crudHelper = new SqliteManagerHelper(crudContext);
		crudDatabase = crudHelper.getWritableDatabase();
	}

	public void tutupKoneksi() {
		crudHelper.close();
		crudHelper = null;
		crudDatabase = null;
	}

	public long insertData(ContentValues values) {
		return crudDatabase.insert(NAMA_TABEL, null, values);
	}

	public boolean updateData(long rowId, ContentValues values) {
		return crudDatabase.update(NAMA_TABEL, values,
				SqliteManager.FIELD_ID + "=" + rowId, null) > 0;
	}

	public boolean hapusData(long rowId) {
		return crudDatabase.delete(NAMA_TABEL,
				SqliteManager.FIELD_ID + "=" + rowId, null) > 0;
	}

	public Cursor bacaData() {
		return crudDatabase.query(NAMA_TABEL,FIELD_TABEL,null, null, null, null,SqliteManager.FIELD_JUDUL + " DESC");
	}

	public Cursor bacaDataTerseleksi(long rowId) throws SQLException {
		Cursor cursor = crudDatabase.query(true, NAMA_TABEL,FIELD_TABEL,FIELD_ID + "=" + rowId,null, null, null, null, null);
		cursor.moveToFirst();
		return cursor;
	}

	public ContentValues ambilData(String tempat, String lat, String lng) {
		ContentValues values = new ContentValues();
		values.put(SqliteManager.FIELD_JUDUL, tempat);
		values.put(SqliteManager.FIELD_DESKRIPSI, lat);
		values.put(SqliteManager.FIELD_WAKTU, lng);
		return values;
	}
}

Class SqliteManager di atas akan kita panggil dari sebuah activity. Data yang ada di dalam database sqlite ditampilkan ke dalam listview. Untuk menambah menu, form tambah menu bisa diakses dengan menekan tombol menu. Dan jika ingin melakukan edit atau hapus data, bisa diakses dengan melakukan tap pada salah satu list, maka akan muncul 2 pilihan (edit dan hapus).

CrudSqliteActivity.java

public class CrudSqliteActivity extends ListActivity {
	private SqliteManager sqliteDB;
	private SimpleCursorAdapter mCursorAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        sqliteDB = new SqliteManager(this);
        sqliteDB.bukaKoneksi();

		Cursor cursor = sqliteDB.bacaData();

		startManagingCursor(cursor);

		String[] awal = new String[] { SqliteManager.FIELD_JUDUL };
		int[] tujuan = new int[] { R.id.rowtext };
		mCursorAdapter = new SimpleCursorAdapter(this, R.layout.baris, cursor, awal, tujuan);

		mCursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
			public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
				if (columnIndex == SqliteManager.POSISI_ID) {
					TextView textView = (TextView) view;
						textView.setText("");
					return true;
			    }
			    return false;
			}
			});

		setListAdapter(mCursorAdapter);
		registerForContextMenu(getListView());

    }

	@Override
	protected void onDestroy() {
		super.onDestroy();
		sqliteDB.tutupKoneksi();
	}

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.opt_menu, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        	case R.id.tambah:
        		Intent intent = new Intent(this, SimpanActivity.class);
        		intent.putExtra("judul", "");
        		intent.putExtra("deskripsi", "");
        		intent.putExtra("waktu", "");
        		startActivity(intent);
        		return true;
        	default:
        		return super.onOptionsItemSelected(item);
        }
    }

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.list_menu, menu);
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
		switch (item.getItemId()) {
			case R.id.menu_edit:
				startDetail(info.id, false);
				return true;

			case R.id.menu_delete:
				hapus(info.id);
				return true;
			default:
				return super.onContextItemSelected(item);
		}
	}

    public void hapus(long rowId) {
    	sqliteDB.hapusData(rowId);
		mCursorAdapter.getCursor().requery();
    }

	public static final String EXTRA_ROWID = "rowid";

	@Override
	protected void onListItemClick(ListView l, View v, int position, long rowId) {
		super.onListItemClick(l, v, position, rowId);
		tampilTempatTerseleksi(rowId);

	}

	public void tampilTempatTerseleksi(Long mRowId) {
		Cursor cursor = sqliteDB.bacaDataTerseleksi(mRowId);
		Intent intent = new Intent(this, DetailActivity.class);
		intent.putExtra("judul", cursor.getString(SqliteManager.POSISI_JUDUL));
		intent.putExtra("deskripsi", cursor.getString(SqliteManager.POSISI_DESKRIPSI));
		intent.putExtra("waktu", cursor.getString(SqliteManager.POSISI_WAKTU));
		startActivity(intent);

	}

	public void startDetail(long rowId, boolean baru) {
		Intent intent = new Intent(this, SimpanActivity.class);
		if (!baru) {
			intent.putExtra(EXTRA_ROWID, rowId);
		}
		startActivity(intent);
	}
}

SimpanActivity.java

public class SimpanActivity extends Activity {
	private SqliteManager sqliteDB;
	private Long id;

	private EditText teks_judul;
	private EditText teks_deskripsi;
	private EditText teks_waktu;
	String judul,deskripsi,waktu;

	public static final String SIMPAN_DATA = "simpan";

	@Override
	protected void onCreate(Bundle bundle) {
		super.onCreate(bundle);

		setContentView(R.layout.simpan);

		teks_judul = (EditText) findViewById(R.id.edit_judul);
		teks_deskripsi = (EditText) findViewById(R.id.edit_deskripsi);
		teks_waktu = (EditText) findViewById(R.id.edit_waktu);

		id = null;

		if (bundle == null) {
			Bundle extras = getIntent().getExtras();
			if (extras != null && extras.containsKey(CrudSqliteActivity.EXTRA_ROWID)) {
				id = extras.getLong(CrudSqliteActivity.EXTRA_ROWID);
			}
			else
			{
				judul = extras.getString("judul");
				deskripsi = extras.getString("deskripsi");
				waktu = extras.getString("waktu");
				teks_judul.setText(judul);
				teks_deskripsi.setText(deskripsi);
				teks_waktu.setText(waktu);
			}
		}

		sqliteDB = new SqliteManager(this);
		sqliteDB.bukaKoneksi();

		pindahData();

		Button button = (Button) findViewById(R.id.btn_simpan);
		button.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				simpan();
				finish();
			}
		});

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		sqliteDB.tutupKoneksi();
	}

	private void pindahData() {
		if (id != null) {
			Cursor cursor = sqliteDB.bacaDataTerseleksi(id);
			teks_judul.setText(cursor.getString(SqliteManager.POSISI_JUDUL));
			teks_deskripsi.setText(cursor.getString(SqliteManager.POSISI_DESKRIPSI));
			teks_waktu.setText(cursor.getString(SqliteManager.POSISI_WAKTU));
			cursor.close();
		}
	}

	private void simpan() {
		String judul = teks_judul.getText().toString();
		String deskripsi = teks_deskripsi.getText().toString();
		String waktu = teks_waktu.getText().toString();

		if (id != null) {
			sqliteDB.updateData(id, sqliteDB.ambilData(judul, deskripsi, waktu));
		}
		else {
			id = sqliteDB.insertData(sqliteDB.ambilData(judul, deskripsi, waktu));
		}
	}

	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putLong(SIMPAN_DATA, id);
	}
}

Untuk file layout’nya, silahkan dilihat sendiri di file lengkapnya yang bisa di download di akhir postingan ini. Kalau saya tuliskan di postingan ini, takutnya terlalu panjang :D. Ketika dijalankan via emulator atau langsung di hape/tablet, kira-kira hasilnya seperti di bawah ini.

Gampang kan cara pembuatan dan penggunaannya..??? OK deh, sekian dulu postingan saya kali ini. Semoga bermanfaat untuk kita semua.

Happy Blogging and Keep Coding

Cheerrrsss….!!!!

[to_like]Download Aplikasi[/to_like]

10 comments

  1. andi Reply

    mas mau tanya tentang sintak yang
    int[] tujuan = new int[] { R.id.rowtext };

    R.id.rowtext => rowtext nya ini dapet dari mana ?

    saya coba tulis ulang code ini untu belajar tapi kok saat nyampe situ enggak ada pilihan rowtextnya ya …

  2. kim Reply

    Om,minta emailnya donk. Aq mw minta bantuan buat ngoreksi project soalnya force close mulu..
    padahal pas dicheck codenya g error.. Ane mw tau sbenernya bag mana yang salah…
    Bisa nggak Om?

    Terima Kasih…

  3. adi Reply

    mau izin download gan, tapi harus sign up dulu, nah sign up nya dimana gan ?hehe