Mengisi Database App saat Instalasi

— Catatan: Sebenarnya saya biasa posting tentang Android dev di blog yang lain (indonesiaberkicau.com), tapi hosting Qwords terlalu sering bermasalah (situs tidak merespon). Saya sudah upgrade ke paket yang lebih tinggi tapi tetap bermasalah, mau upgrade lagi apa ada jaminan bakal lancar? Informasi penyebab situs mati juga tidak ada (habis resources yang mana?). Oleh karena itu saya akan pindahkan ke blog ini saja — end

Pada aplikasi yang sedang saya buat, saya ingin agar database terisi saat user selesai menginstall app. Cara yang paling sederhana dengan mengisi satu persatu data di method SQLiteOpenHelper.onCreate(SQLiteDatabase) dengan query insert, tapi tidak praktis untuk data yang cukup banyak. Cara yang lain adalah membuat database di luar, diletakkan di assets lalu file database ini dicopy. Harusnya ini yang paling cepat, karena langsung copy antar file dan tidak melibatkan database. Cuma setelah saya coba, selalu gagal, dan ada resiko jika struktur database yang digunakan Android berganti.

Solusi yang saya gunakan adalah membuat file JSON lalu diletakkan di direktori assets kemudian diparsing dan diinsert.  Contoh JSON-nya seperti ini:

[
   {
     "nama": "resto A",
     "alamat": "sarijadi blok 23",
     "telp": "08162424"
   },
   {
     "nama": "resto B",
     "alamat": "buahbatu",
     "telp": "0832324"
   }
]

Simpan sebagai file teks, letakkan di direktori assets (…\app\src\main\assets).

Code berikut memparse data ini dan memindahkannya ke tabel. Transaction diatur manual agar kinerja lebih optimal (cuma belum saya test). Untuk data yang besar, sebaiknya proses load ini dilakukan di thread yang terpisah.

public static final String TABLE_INSERT = "insert into tempat_makan (nama, telepon, alamat) values(?,?,?)";
private static String DATA_FILE = "data.txt";
private void loadData(SQLiteDatabase db) {
    try {
        InputStream myInput  = myContext.getAssets().open(DATA_FILE);
        String jsonStr = getStringFromInputStream(myInput);
        SQLiteStatement insert = db.compileStatement(TABLE_INSERT);
        db.beginTransaction();
        JSONArray jArr = new JSONArray(jsonStr); //karena dimulai dgn array
        for (int i=0; i < jArr.length(); i++)
        {
            JSONObject jObj = jArr.getJSONObject(i);

            String nama      = jObj.getString("nama");
            String alamat    = jObj.getString("alamat");
            String telp      = jObj.getString("telp");

            insert.bindString(1,nama);
            insert.bindString(2,alamat);
            insert.bindString(3,telp);
            insert.execute();
        }
        db.setTransactionSuccessful();
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("yw",e.getMessage());
    } finally {
        db.endTransaction();
    }
}

// convert InputStream to String
private static String getStringFromInputStream(InputStream is) {
    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();

    String line;
    try {

        br = new BufferedReader(new InputStreamReader(is));
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return sb.toString();
}

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google+

You are commenting using your Google+ account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s