Boosting Android SQLite Database Insert Performance

Assalaamu ‘alaikum warahmatullah wabarakaatuh :)

seharian saya berusaha untuk meningkatkan performance operasi insert (banyak rows) ke dalam database sqlite di android, dan alhamdulillah berhasil juga menemukan teknik yang paling bagus.
setidaknya saya telah mencoba 3 (sebenarnya 4) teknik, yaitu:

1. insert satu-persatu data:
jadi setiap kali data di dapat langsung masukin ke table satu persatu dengan fungsi kurang lebih seperti ini:

	public long inserData(Data data){
		ContentValues newdata= new ContentValues();
		newdata.put(KEY_ID_DATA, data.getId());
		newdata.put(KEY_DATA1, data.getData1());
		newdata.put(KEY_DATA2, data.getData2());
		
		return mDb.insert(NAMA_TABLE, null, newdata);
	}

performance dengan teknik ini benar-benar buruk, kalau harus meng insert data/row yang banyakt: *begintransaction->insert->commit->endtransaction->begintransaction* terus berulang2 itu benar-benar memakan banyak waktu, karena harus commit dulu setiap kali satu rows di insert.
2. cara kedua yang saya coba adalah dengan bulk insert menggunakan kelas InsertHelper

	public void inserHadith(int kitab, Vector<Hadith> vhadith){
		mDb.setLockingEnabled(false);
		String tableRawi = getNamaTable(kitab);
		InsertHelper inhelper = new InsertHelper(mDb, tableRawi);
		int iNoHadith = inhelper.getColumnIndex(KEY_NO_HADITH);
		int iText = inhelper.getColumnIndex(KEY_TEXT);
		int iTerjemah = inhelper.getColumnIndex(KEY_TERJEMAH);
		
		for (Hadith hadits : vhadith){
			inhelper.prepareForInsert();
			inhelper.bind(iNoHadith, hadits.getNumber());
			inhelper.bind(iText, hadits.getText());
			inhelper.bind(iTerjemah, hadits.getTranslation());
			
			inhelper.execute();
		}
		mDb.setLockingEnabled(true);
		
	}

karena masih lambat, saya coba untuk meng ‘unlock’ database sebelum insert dan me locknya lagi setelahnya; tapi masih tetap tidak memuaskan.
akhirnya ketemulah cara yang ketiga:
3. explicit transaction

	public void inserHadith(int kitab, Vector<Hadith> vhadith){
		mDb.beginTransaction();
		for (Hadith hadits : vhadith){
			ContentValues newhadith = new ContentValues();
			newhadith.put(KEY_NO_HADITH, hadits.getNumber());
			newhadith.put(KEY_TEXT, hadits.getText());
			newhadith.put(KEY_TERJEMAH, hadits.getTranslation());
			
			mDb.insert(tableRawi, null, newhadith);
		}
		mDb.setTransactionSuccessful();
		mDb.endTransaction();
	}

semua data di batch dulu, gak di commit hingga semua data siap. perlu di ingat untuk selalu menandai transaksi berhasil dengan setTransactionSuccessful() sebelum menutup transaksi (commit), agar tidak di rollback.

teknik ketiga inilah yang paling bagus performancenya. proses yang sebelumnya memakan waktu 20 detik bisa jadi tinggal 1-2 detik. alhamdulillah :)

anda punya cara yang lebih baik ? silahkan share di komentar :)

2 thoughts on “Boosting Android SQLite Database Insert Performance

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 )

Gambar Twitter

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

Foto Facebook

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

Foto Google+

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

Connecting to %s