Last Updated on 7 years by Mas Herdi
Pada bagian kedua tentang tutorial aplikasi inventaris Android menggunakan database SQLite ini, kita akan belajar tentang bagaimana membuat fungsi create/insert data, untuk memasukkan data baru ke dalam database SQLite.
Tutorial ini berhubungan dengan tutorial-tutorial tentang database SQLite sebelumnya, karena itu saya sarankan untuk membaca tutorial-tutorial sebelumnya di sini.
Pre-Requisites
Let’s Begin
Oke, sekarang buka kembali project Aplikasi Inventaris kalian. Di pertemuan sebelumnya kita sudah membuat kelas Barang.java yang berfungsi sebagai Model objek barang, dan kelas DBHelper.java yang berfungsi untuk mempermudah aplikasi dalam membuat dan mengakses database. Sekarang untuk kelanjutannya, kita akan membuat sebuah kelas yang berfungsi untuk insert data atau create data. Kelas ini berfungsi untuk menambahkan data barang baru ke database. Dan inilah daftar file-file yang akan kita buat :
- menu.xml : berfungsi untuk membuat sebuah layout main menu
- create_data.xml : berfungsi sebagail layout untuk tampilan input data
- DBDataSource.java : berfungsi sebagai Controller, kelas inilah yang nantinya berguna untuk melakukan operasi-operasi pada database, termasuk operasi Create Data
- CreateData.java : berfungsi sebagai View atau interface untuk memasukkan data
Pertama-tama, kita akan membuat kelas Menu terlebih dahulu, karena itu kita butuh file layout-nya. Buka folder res/layout pada proyek kalian, dan buat sebuah file xml baru dengan nama menu.xml Isikan kode berikut :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/nama_app" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textSize="20sp" android:text="twoh.co" /> <Button android:id="@+id/button_tambah" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/nama_app" android:layout_centerHorizontal="true" android:text="Tambah Data" /> </RelativeLayout>
Yups, kali ini layout di atas menggunakan Relative Layout supaya mudah mengatur posisinya. Layout di atas hanya berisi Nama Aplikasi dan sebuah tombol untuk Tambah Data.
Setelah itu, kita akan membuat kelas Main Menunya, buat sebuah activity class bernama Menu.java
package id.twooh.appinventory; 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; public class Menu extends Activity implements OnClickListener{ private Button bTambah; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.menu); bTambah = (Button) findViewById(R.id.button_tambah); bTambah.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()) { case R.id.button_tambah : Intent i = new Intent(this, CreateData.class); startActivity(i); break; } } }
Kelas ini berfungsi untuk menampilkan tombol “Tambah Data”, yang apabila kita klik akan berpindah ke Activity Create Data. Karena kelas Create Data nya belum ada, selanjutnya kita akan membuat kelas tersebut. Namun kita akan membuat file xml layout-nya terlebih dahulu, yang bernama create_data.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/nama_barang" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:inputType="text" android:hint=Nama Barang" android:ems="10" > <requestFocus /> </EditText> <EditText android:id="@+id/merk_barang" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:inputType="text" android:hint="Merk Barang" android:ems="10" > <requestFocus /> </EditText> <EditText android:id="@+id/harga_barang" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:inputType="number" android:hint="Harga Barang" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/buttom_submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Submit" /> </LinearLayout>
Layout di atas berisi EditText yang berfungsi sebagai wadah inputan tiga buah informasi dasar, yaitu nama barang, merk barang dan harga barang, dan sebuah tombol submit di bawahnya. Setelah itu, kita akan buat Activity CreateData. Aktivitas ini berfungsi sebagai View dalam paradigma Model-View-Controller yang kita gunakan. Atau dengan kata lain kelas ini menyediakan sebuah interface untuk menambahkan barang. Langsung saja kita buat kelas baru bernama CreateData.java
package id.twooh.appinventory; import android.os.Bundle; import android.app.Activity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class CreateData extends Activity implements OnClickListener{ //inisilisasi elemen-elemen pada layout private Button buttonSubmit; private EditText edNama; private EditText edMerk; private EditText edHarga; //inisialisasi kontroller/Data Source private DBDataSource dataSource; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.create_data); buttonSubmit = (Button) findViewById(R.id.buttom_submit); buttonSubmit.setOnClickListener(this); edNama = (EditText) findViewById(R.id.nama_barang); edHarga = (EditText) findViewById(R.id.harga_barang); edMerk = (EditText) findViewById(R.id.merk_barang); // instanstiasi kelas DBDataSource dataSource = new DBDataSource(this); //membuat sambungan baru ke database dataSource.open(); } //KETIKA Tombol Submit Diklik @Override public void onClick(View v) { // Inisialisasi data barang String nama = null; String merk = null; String harga = null; @SuppressWarnings("unused") //inisialisasi barang baru (masih kosong) Barang barang = null; if(edNama.getText()!=null && edMerk.getText()!=null && edHarga.getText()!=null) { /* jika field nama, merk, dan harga tidak kosong * maka masukkan ke dalam data barang*/ nama = edNama.getText().toString(); merk = edMerk.getText().toString(); harga = edHarga.getText().toString(); } switch(v.getId()) { case R.id.buttom_submit: // insert data barang baru barang = dataSource.createBarang(nama, merk, harga); //konfirmasi kesuksesan Toast.makeText(this, "masuk Barang\n" + "nama" + barang.getNama_barang() + "merk" + barang.getMerk_barang() + "harga" + barang.getHarga_barang(), Toast.LENGTH_LONG).show(); break; } } }
Nah, sekarang kita sudah membuat sebuah interface/antar muka untuk menginputkan data. Yang kita perlukan sekarang adalah sebuah Controller yang akan menyambungkan interface tersebut dengan database yang kita buat. Jika kalian copy pastekan kode di atas akan ada error, tapi biarkan saja. Karena error tersebut disebabkan oleh kelas kontroler DBDataSource yang belum kita buat. Salah satu error yang muncul adalah pada bagian inisialiasi DBDataSource seperti berikut :
private DBDataSource dataSource;
Oke, langsung kita buat saja file baru bernama DBDataSource.java. Kodenya seperti berikut :
package id.twooh.appinventory; import java.util.ArrayList; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.util.Log; public class DBDataSource { //inisialiasi SQLite Database private SQLiteDatabase database; //inisialisasi kelas DBHelper private DBHelper dbHelper; //ambil semua nama kolom private String[] allColumns = { DBHelper.COLUMN_ID, DBHelper.COLUMN_NAME, DBHelper.COLUMN_MERK,DBHelper.COLUMN_HARGA}; //DBHelper diinstantiasi pada constructor public DBDataSource(Context context) { dbHelper = new DBHelper(context); } //membuka/membuat sambungan baru ke database public void open() throws SQLException { database = dbHelper.getWritableDatabase(); } //menutup sambungan ke database public void close() { dbHelper.close(); } //method untuk create/insert barang ke database public Barang createBarang(String nama, String merk, String harga) { // membuat sebuah ContentValues, yang berfungsi // untuk memasangkan data dengan nama-nama // kolom pada database ContentValues values = new ContentValues(); values.put(DBHelper.COLUMN_NAME, nama); values.put(DBHelper.COLUMN_MERK, merk); values.put(DBHelper.COLUMN_HARGA, harga); // mengeksekusi perintah SQL insert data // yang akan mengembalikan sebuah insert ID long insertId = database.insert(DBHelper.TABLE_NAME, null, values); // setelah data dimasukkan, memanggil // perintah SQL Select menggunakan Cursor untuk // melihat apakah data tadi benar2 sudah masuk // dengan menyesuaikan ID = insertID Cursor cursor = database.query(DBHelper.TABLE_NAME, allColumns, DBHelper.COLUMN_ID + " = " + insertId, null, null, null, null); // pindah ke data paling pertama cursor.moveToFirst(); // mengubah objek pada kursor pertama tadi // ke dalam objek barang Barang newBarang = cursorToBarang(cursor); // close cursor cursor.close(); // mengembalikan barang baru return newBarang; } private Barang cursorToBarang(Cursor cursor) { // buat objek barang baru Barang barang = new Barang(); // debug LOGCAT Log.v("info", "The getLONG "+cursor.getLong(0)); Log.v("info", "The setLatLng "+cursor.getString(1)+","+cursor.getString(2)); /* Set atribut pada objek barang dengan * data kursor yang diambil dari database*/ barang.setId(cursor.getLong(0)); barang.setNama_barang(cursor.getString(1)); barang.setMerk_barang(cursor.getString(2)); barang.setHarga_barang(cursor.getString(3)); //kembalikan sebagai objek barang return barang; } }
Untuk penjelasan tiap baris kodenya, bisa dibaca pada komentar-komentar yang ada di atas. Adapun cara kerjanya sebagai berikut, pertama-tama kita kembali ke kelas CreateData.java. Apabila kita telah mengisi data barang dan mengklik tombol submit, data barang tersebut akan dilempar ke Controller. Kemudian kontroler akan menerima inputan data barang tersebut dan memasangkannya sesuai dengan nama kolom pada database menggunakan ContentValues. Untuk selanjutnya dimasukkan ke database.
Setelah dimasukkan, data akan dicek kembali menggunakan SQL select yang mengembalikan data berupa Cursor. Data kursor tersebut kemudian akan diubah menjadi objek barang, dan dilemparkan lagi ke kelas CreateData untuk kemudian mengkonfirmasikan data apa saja yang barusan kita masukkan.
Yang terakhir, kita akan memodifikasi Android Manifest. Kita pindahkan intent filter launcher nya ke Activity Menu supaya aktivitas tersebut yang dijalankan pertama kali apabila aplikasi dibuka.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="id.twooh.appinventory" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="id.twooh.appinventory.CreateData" android:label="@string/title_activity_main" > </activity> <activity android:name=".Menu" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
That’s all. 😉
Demo Program
Ketika kita running aplikasinya-nya, beginilah hasilnya :
Tampilan aktivitas Main Menu
Apabila kita klik tombol “Tambah Data”, maka kita akan masuk ke aktivitas CreateData
Kita coba inputkan sembarang data, seperti berikut :
Ketika kita klik tombol Submit, akan muncul notifikasi Toast sesuai dengan data barang yang kita masukkan
Conclusion
Postingan ini adalah bagian pertama dari fitur CRUD(Create, Read, Update, Delete) yang akan kita implementasikan. Semoga berguna, nantikan tutorial selanjutnya tentang Read/Lihat Data. 😀
Untuk demo-nya, kalian bisa cek dan download AppInventory di Google Play Store.
Jangan sungkan untuk bertanya apabila ada yang kurang mengerti, silahkan tulis lewat komentar di bawah. 😉
pak, mau tanya.. aku udah ngikutin langkah2nya, tapi ko setiap dihubungin ke database error terus, padahal kayaknya udah bener dbHelpernya. terus, ko di eclipse sekarang gak bisa buat lihat file database yang ada di file explorer/data/data/package. jadi kalo di klik data gak muncul apa2 lagi.. mohon bantuannya 😐
oke bu ^^ Mungkin bisa dicek dulu error-nya di bagian mananya lewat logcat, dari situ nanti bisa ketahuan errornya dimana. Terus kalo cek file database pastikan emulator atau hp androidnya sudah tersambung 🙂
CRUD alhamdulillah bebas error 🙂 tapi untuk lihat database di file explorer masih nggak bisa 😐 apa gara2 ADT nya experied ya? soalnya di bagian plugin, “sertificate” unsigned….. kasih solusi dong mas.. 😀
btw ini tutoral CRUD paling mudengin 🙂
Hehe makasih 🙂
Kalau expired coba diupdate ADT-nya. Seharusnya bisa kok kelihatan di file explorernya. File-nya .db
mas ko muncul error android.database.sqlite.SQLiteException : no such table
Berarti tabel-nya belum ada di database itu gan
Maaf Mas Saya Mau nanya klu buat pencarian datanya ada tutorialnya gak??
Mas q mau tanya error ini dibawah ini
error: Error: No resource found that matches the given name (at ‘label’ with value ‘@string/title_activity_main’).
ini error nya di AndroidManifest.xml
Sori masi pemula mas, mohon pencerahannya ya mas
😀 😀
itu berarti valuenya untuk title_activity_main belum ada, tambah value-nya di string.xml gan 🙂
string.xml itu dimana mas..sori pemula
di /res/values/string.xml
gan kalau mau tambahin tombol foto untuk jenis produknya bisa? nah untuk itu kan di tambahkan fitur camera, apa gambarnya juga di masukkan ke database??
bisa… gambar dimasukin di storage… (SD Card) jangan di database
mau tanya nih, kenapa ya setiap kali ganti nama databasenya, selelu muncul error android.database.sqlite.SQLiteException : no such table, mohon pencerahannya 😀
yoi, kalau nama database-nya diganti. nama tabel/database pada syntax harus ikut diganti supaya tabel yang baru bisa ditemukan
terus mau tanya, itu di DBDataSource.java itu kan ada method untuk create Barang, nah di sana ada kode seperti ini :
public Barang createBarang(String nama, String merk, String harga)
{}, nah pertanyaannya kenapa kok pake class Barang? bukan pake Cursor ya? bedanya di mananya ya? 😀
Class Barang itu container untuk object nya… Kalau Cursor untuk ambil data dari databasenya
mas, kalo mau nambah string baru di database,
database + nama tabel juga harus di rubah?
mau nanya kenapa ya kok saya error nya ini ? padahal semua nya udah sukses tolong bantuan nya :
Unable to execute dex: Java heap space
Java heap space
Unhandled event loop exception
Java heap space
makasih
Gan cara nampilin ke list view dengan syarat cuman kolom “merek” aja gmana ?
Pas di cursor nya
mas, mohon bantu… kalo misal nya harga table 1 – (di kurang ) harga 2 table = hasil..
itu gmn ya mas ? bisa bantuin kah ?
Gan di String nya udah di tambahin title_activity_main tapi masih g bisa baca
tambahin di string.xml gan, pastikan namanya sama title_activity_main
tanya dong mas… step terakhir, sy harus buat apa ya? (.xml atau class). Harap maklum, newbie… 😀
Bukan buat, edit aja di file AndroidManifest.xml, sesuaikan dengan kode di atas
Mantap
http://syukurzay.student.telkomuniversity.ac.id/
Tutorial yang sangat bermanfaat, terima kasih 😀
Trims yunita
mas mau nanya dong ..
untuk CreateData,java syntax “setContentView (R.layout.createdata);” itu eror kaya gini “create data cannot be resolved or is not a field” itu kaya apa mas solusinya ? makasih sebelumnya
Tanya mas, q mo nambahin string di values / strings.xml nya…namanya q kasih title_activity_main, trus value nya diisi apa ya?
value nya terserah mas
mas saya udah buat dan berhasil tapi sqlite record harga terisi oleh merk ? cara mengatasi nya ada dimana ya mas ?
#trims
sudah bisa mas, sudah saya koreksi sendiri..
#trims tutorial yang membantu ^_^
ada masalah, saat insert data, notif
Masuk Barang
namanullmerknullharganull
cara mengatasi nya dimana mas, mohon koreksinya ? ^_^
Hmmm itu berarti value yg dari edit text nya belum keambil
private String nama_barang;
/**
* @return the name barang
*/
public String getNama_barang() {
return nama_barang;
}
public String toString() {
return “Barang “+ nama_barang +” “+ merk_barang + ” “+ harga_barang;
}
Pastikan saja kodenya sama dengan di tutorial
malam mas hafizh,
tolong mas, pas di run lansung ke tambah data
menu tambah y g muncul?
tolong pecerahannya
malam mas hafizh,
tolong mas, pas di run lansung ke tambah data
main menu ya tidak muncul?
tolong pecerahannya
Mas help saya dong error: Error: No resource found that matches the given name (at ‘label’ with value ‘@string/title_activity_main’). nambahin value di string.xml kan? nah itu codingnya seperti apa saya pemula thx
iya bro, caranya buka folder res/values/ trus buka file string.xml, di sana nanti tambahkan string baru bernama “title_activity_main”. Contohnya ikut aja dari data yang sudah ada di situ.
saya sudah coba menambahkan values di string.xml tapi msh error karna ga ada referensinya.. bantu tolong gan..
kampus seperti ini salah -_-
mas, tanya donk, kalau di contoh kodingan nya kan itu database kita insert sendiri baru show, kalau untuk data yang kita sudah ada dan kita masukin ke dalam bentuk format .csv mau import ke sqlite nya itu gimana ya dan show datanya tersebut? saya cari terus tapi masih bingung gimana caranya. terima kasih 🙂
Selamat Malam Mas Hafizh,
terimakasih atas ilmunya , saya ingin bertanya setelah sampai create data ini.. saya coba tambahkan data diklik kok crash ya ? itu knp? mohon tanggapannya.. terimakasih
coba dicek error logcatnya seperti apa?
suhu … gimana caranya nambah field ? saya udh mencoba nambah 1 field pas running bisa masuk tambah data bisa… tapi saat disubmit alias disimpan tidak bisa langsung crash.. itu knp ya? error logcat seperti ini
06-23 20:14:52.710 9993-9993/sqlite.dosen E/SQLiteLog﹕ (1) table data_dosen has no column named no_hp
06-23 20:14:52.710 9993-9993/sqlite.dosen E/SQLiteDatabase﹕ Error inserting alamat_dosen= no_hp= email= nama_dosen=
android.database.sqlite.SQLiteException: table data_dosen has no column named no_hp (code 1): , while compiling: INSERT INTO data_dosen(alamat_dosen,no_hp,email,nama_dosen) VALUES (?,?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
at sqlite.dosen.DBDataSource.createDosen(DBDataSource.java:39)
at sqlite.dosen.CreateData.onClick(CreateData.java:59)
at android.view.View.performClick(View.java:4443)
at android.view.View$PerformClick.run(View.java:18433)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5021)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
at dalvik.system.NativeStart.main(Native Method)
saya mencoba menambah field semua sudah diprogram persis.. tapi saat tambah data dan mau disubmit kok malah crash ya mental gitu..? tau solusinya gak?
saya juga begitu mas, smua gk ada error dah bisa running tapi masuk ke tombol tambah bisa terus di isi mw di submit/simpan malah error gtu mental kembali ke menu awal lgi ?
mas sudah dapat belum kendala nya apa ?
Malam mas, saya mau tanya tentang hal yang ini “memodifikasi Android Manifest. Kita pindahkan intent filter launcher nya ke Activity Menu”. Itu caranya gimana ya mas? Trus di punyaku yg menu.java masih ada yang eror di baris ke sepuluh, yang “public class Menu extends Activity implements OnClickListener {“.
Mohon pencerahan, dan bimbingannya
suhu newbie mau tanya kalau dari tutorial navigation view suhu terus mau di gabung ke database ini gimana yah soalnya kan di tutorial ini : http://www.twoh.co/2015/07/tutorial-membuat-material-navigation-view-di-android/
suhu tidak menggunakan fragment.. newbie kebingungan nih suhu mohon bantuan nya suhu.. thx
Salam Kak..
Trimakasih banyak sblmnya untuk artikel” Androidnya yang sangat membantu sy, maklum sy masih baru banget..
Mau tanya, klo saya mau masukkan Gambar Barang gmn y caranya?
jadi setiap barang akan ada gambarnya..
mas, pas coba saya run kok error ya.
ini logcat nya :
java.lang.NullPointerException: Attempt to invoke virtual method ‘android.text.Editable android.widget.EditText.getText()’ on a null object reference
gan, sy coba di android studi muncul error
Error:Execution failed for task ‘:app:processDebugManifest’.
> Manifest merger failed with multiple errors, see logs
Ka tolong bantuin, saya run berhasil gak ada error, di layout menu gak ada apa2, tapi pas klik button tambah malah force close. mohon pencerahannya ka. terimakasih
iya mas, saya coba android manifest ya udah di ganti ke create_data, gak kemenu lagi, langsung create_data, tidak apa2 tapi kalo pas di menu, klik button tambah data, force close
coba langsung compile dari source di github aja gan link di sini https://github.com/twoh/twoh-appinventory
mas , sedikit koreksi
di file create_data.xml
android:hint=”Nama Barang”
” nya ketinggalan tu .
makasih tutorialnya sangat membantuu
kak, gimana yah caranya untuk menampilkan 2 isi tabel sekaligus?
Yang terakhir, kita akan memodifikasi Android Manifest. Kita pindahkan intent filter launcher nya ke Activity Menu supaya aktivitas tersebut yang dijalankan pertama kali apabila aplikasi dibuka.
kurang ngerti codingnya disisipkan dibagian mana?
mas, waktu tambah data itu kok langsung force close ya mas. Tolong pencerahannya mas
Tulisan error nya gimana ya?
terimakasih, informasinya sangat membantu saya.
Kunjungi UMJ Islami