Sunday, November 3, 2013

Menyalin Database Sqlite ke Aplikasi Android

Pada tutorial kali ini akan membahas bagaimana menyalin database Sqlite ke aplikasi android. Jadi, kita bisa menggunakan database yang sudah kita buat sebelumnya baru selanjutnya disalin ke aplikasi.
Di tutorial ini, database yang sudah berhasil dicopy, datanya akan ditampilkan pada ListView.
Well, langsung saja menuju ke langkah-langkahnya.
1. Menyiapkan file Sqlite Database.
Untuk mempermudah pembuatan database dapat digunakan program SQLite Database Browser atau   SQLite Expert Personal.
Buat database dengan nama sesuai yang diinginkan. Pada tutorial ini saya membuat database yaitu "dbsiswa.db" (tanpa tanda petik).
Kemudian buat tabel dengan nama “android_metadata” (tanpa tanda petik) dan isikan dengan ‘en_US’ (tanpa tanda petik).
Selanjutnya buat tabel sesuai dengan yang dibutuhkan. Disini saya membuat tabel dengan nama "tbsiswa" (tanpa tanda petik) dengan field-field "_id, nama, alamat" (tanpa tanda petik) . Perlu diperhatikan ganti field id di tabel yang kalian buat dengan "_id" (tanpa tanda petik).
2. Buatlah sebuah project. Disini saya membuat project dengan nama "com.aina.sqliteproject" (tanpa tanda petik) dan dengan activity "MainActivity" (tanpa tanda petik). (Selanjutnya untuk script sesuaikan dengan project yang kalian buat).
3. Copy-kan file database yang sudah dibuat sebelumnya di folder asset.
4. Atur layout.xml seperti berikut ini:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    >

<TextView
    android:id="@+id/judul"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="10dp"
    android:text="@string/datasiswa"
    android:textStyle="bold"
    />

<ListView
    android:id="@+id/lv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/judul" >
</ListView>

</RelativeLayout>
5.  Kemudian buatlah sebuah file xml dengan nama "row.xml" (tanpa tanda petik). Dan atur seperti berikut ini:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <TextView
        android:id="@+id/nama"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:text="@string/nama"
        />

    <TextView
        android:id="@+id/alamat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/alamat"
    />

</LinearLayout>
6. Selanjutnya buat sebuah class untuk menangani database. Beri nama  "DatabaseHelper" (tanpa tanda petik). Tuliskan script seperti berikut ini:
package com.aina.sqliteproject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

@SuppressLint("SdCardPath")
public class DatabaseHelper extends SQLiteOpenHelper{
    //The Android's default system path of your application database.
    String DB_PATH =null;

    private static String DB_NAME = "dbsiswa.db";

    private SQLiteDatabase myDataBase;
   
    private final Context myContext;

    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
     * @param context
     */
    public DatabaseHelper(Context context) {

        super(context, DB_NAME, null, 1);
        this.myContext = context;
        DB_PATH="/data/data/"+context.getPackageName()+"/"+"databases/";
    }   

  /**
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    public void createDataBase() throws IOException{

        boolean dbExist = checkDataBase();

        if(dbExist){
            //do nothing - database already exist
        }else{

            //By calling this method and empty database will be created into the default system path
               //of your application so we are gonna be able to overwrite that database with our database.
            this.getReadableDatabase();

            try {

                copyDataBase();

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }

    /**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase(){

        File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();
    }

    /**
     * Copies your database from your local assets-folder to the just created empty database in the
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException{

        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public void openDataBase() throws SQLException{

        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

            if(myDataBase != null)
                myDataBase.close();

            super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }
}
7.  Untuk "MainActivity" , tuliskan script seperti berikut ini:
import java.io.IOException;

import android.app.Activity;

import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;


public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    DatabaseHelper myDbHelper;
    protected Cursor cursor;
    protected ListAdapter adapter;
    protected ListView listSiswa;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        listSiswa = (ListView) findViewById(R.id.lv);
         myDbHelper = new DatabaseHelper(this);
         try {
             myDbHelper.createDataBase();
 
         } catch (IOException ioe) {         
             throw new Error("Unable to create database");
         }
 
      /*   try {
             myDbHelper.openDataBase();
 
         }catch(SQLException sqle){
             throw sqle;
         }
         */
         view ();
    }
    private void view (){
         SQLiteDatabase db = myDbHelper.getReadableDatabase();
         //db.getReadableDatabase();
         try{
             cursor = db.rawQuery("SELECT * FROM tbsiswa", null);
             adapter= new SimpleCursorAdapter(this,R.layout.row, cursor,
                        new String [] {"nama","alamat"},
                        new int [] {R.id.nama,R.id.alamat});
                listSiswa.setAdapter(adapter);
         }catch(SQLException sqle){
             throw sqle;
         }
    }
}
8. Jangan lupa pada "strings.xml" tambahkan script berikut ini:
    <string name="datasiswa">DATA SISWA</string>
    <string name="nama">Nama</string>
    <string name="alamat">Alamat</string>
9. Jalankan aplikasi apabila berhasil akan tampil seperti berikut ini:
(Tentunya data yang akan tampil adalah sesuai dengan yang sudah kalian isikan di field-field yang sudah kalian buat di tabel kalian).

Oiya, untuk mengecek apakah database yang sudah dibuat beneran sudah tersalin di aplikasi, Kalian bisa masuk ke DDMS -> File Explorer -> data -> data -> cari nama project kalian -> buka file databases dan kalian akan menemukan file database yang ada di folder asset.

Fin.
Happy Coding...
Alhamdulillah.... :)

4 comments:

  1. Jadi malu n minder karena kurang belajar nih..
    ^_^

    ReplyDelete
    Replies
    1. jangan gitu ah...
      aku juga baru belajar...
      masih sangat kebingungan....

      Delete
  2. kalo mau masukkin gambar di listviewnya gimana iya ?

    ReplyDelete