Seperti smartphone kebanyakan, BlackBerry menggunakan memori flash untuk menyimpan data antara aplikasi dan perangkat. Perangkat BlackBerry memiliki memori flash internal, dan sebagian model juga mendukung SDcard eksternal. Beberapa tipe hanya melaui memori internal saja, sementara beberapa bekerja dengan baik melalui memori flash internal dan SDcard yang terpasang ke perangkat.

BlackBerry menawarkan beberapa cara untuk menyimpan data yaitu:

  • Record Management System (RMS) : RMS didukung oleh BlackBerry, format DBMS yang memungkinkan aplikasi untuk menyimpan array byte. Secara umum, tidak ada alasan untuk menggunakan RMS kecuali anda memiliki legacy code atau mengembangkan sebuah MIDlet bukannya aplikasi BlackBerry.
  • BlackBerry Persistent Store : BlackBerry Store Persistent menyediakan fitur mirip dengan RMS, namun, dirancang untuk menyediakan antarmuka penyimpanan data yang fleksibel dan kuat. Dengan BlackBerry Persistent Store API, dapat menyimpan seluruh objek Java ke memori tanpa harus serialize data terlebih dahulu.
  • JSR 75 FileConnection : FileConnection API didefinisikan oleh JSR 75 dan dibangun pada Generic Connection Framework dengan komponen utama dari kelas javax.microedition.io.file.FileConnection FileConnection API merupakan paket opsional Java J2ME yang memberikan-enabled mengakses perangkat untuk file sistem yang terletak pada perangkat mobile. Selain itu JSR 75 mendukung penuh penggunaan PIM (Personal Information Management) API adalah Paket opsional J2ME yang memberikan akses ke PIM (Personal Information Management) data.
  • SQLite : sistem database relational (RDBMS) yang berguna untuk menyimpan data terstruktur. BlackBerry SQLite memungkinkan Anda untuk membuat dan mengakses database disimpan pada memori internal perangkat dan eksternal SD card, tapi hanya tersedia untuk perangkat yang menjalankan BlackBerry OS 5.0.

Mengingat sebelumnya menggunakan OS 4.6, penyimpan data objek kedalam memori flash memungkinan dengan PersistentStore. Saat ini biasanya perangkat flash memori memiliki kapasitas sebesar 128 MB, dengan persentase signifikan untuk ruang bebas (free space) setelah memperhitungkan ruang untuk OS, email dan data lainnya. Bukan ide yang baik menyimpan dokumen atau data lainya yang memiliki kapasitas besar kedalam memori flash. Jika untuk mengelola gambar ber-resolusi tinggi, audio, video atau simpan data kapasitas besar pilihan terbaik adalah menggunakan SDcard dengan FileConnection API.

PersistentStore Key

Persistent Store mengelola kunci/key (nilai long) dan objek (instansi dari Persistent Object). Kunci ini bersifat global di semua aplikasi pada perangkat, tetapi kita perlu mengetahui dulu kunci yang sedang dipakai dalam aplikasi. Sehingga kita bisa memakai Persistent Store di aplikasi yang berbeda dengan key tersebut.

Untuk menghasilkan nilai long untuk digunakan sebagai key, Blackberry JDE plugin pada Eclipse menawarkan cara yang mudah. Caranya cukup ketik beberapa teks ke dalam editor, pilih, dan klik kanan. Kemudian pilih Convert String to Long, akan menhasilkan nilai long berdasarkan pada hash dari teks yang dipilih.

Convert string to long

PersistentObject

Gunakan method PersistentStore.getPersistentObject menghasilkan objek dari PersistentObject, bahkan jika key belum pernah digunakan sebelumnya. Anda selalu mendapatkan objek PersistentObject, akan tetapi isi dari objek bisa saja null. Artinya tidak ada yang telah disimpan pada key tersebut atau telah mungkin telah dihapus.

PersistentObject persistentObject = PersistentStore.getPersistentObject (0x2a5c4229e4666089L);

Isi/contents PersistentObject diakses melalui metode getContents. Masih sama, method ini akan kembali menghasilkan null:

Object contents = persistentObject.getContents();

Untuk set atau mengganti isi dari PersistentObject, gunakan method setContents:

Hashtable hashtable = new  Hashtable();
persistentObject.setContents(hashtable);

Menetapkan isi PersistentObject dengan method commit:

persistentObject.commit();

Untuk mengubah data dalam PersistentObject, hanya perlu memodifikasi objeknya dan tetapkan dengan persistentObject.commit, tidak perlu memanggil setContents lagi, kecuali jika ingin set objek dengan kunci yang berbeda pada persistent:

hashtable.put("Key", "Value");
persistentObject.commit();

Apa yang bisa disimpan ?

PersistentStore hanya bisa menyimpan objek saja, bukan tipe data primitif. Salah satu contoh, kita tidak dapat menyimpan tipe int secara langsung, tetapi dengan membungkus int dalam suatu objek Integer. Seperti berikut:

persistentObject.setContents(new  Integer(1234));

Umumnya, setiap objek yang masuk ke setContents harus mengimplementasikan antarmuka net.rim.device.api.util.Persistable. Interface ini tidak mengandung method, hanya penanda untuk OS BlackBerry.

Selain itu, beberapa kelas dasar Java juga diperbolehkan, meskipun mereka tidak secara eksplisit menerapkan Persistable. Kelas-kelas tambahan persistable diperbolehkan adalah:

java.lang.Boolean
java.lang.Byte
java.lang.Characte
java.lang.Integer
java.lang.Long
java.lang.Object
java.lang.Short
java.lang.String
java.util.Vector
java.util.Hashtable

Array dari tipe primitif juga implisit persistable, sebagaimana array jenis persistable lainnya. Jadi, kita dapat menyimpan byte [], char [], int [], String [], Vektor [], dan sebagainya. Perhatikan bahwa persistent menyimpan seluruh objek, termasuk semua objek referensinya. Ini berarti bahwa jika ada objek referensi objek lainnya, objek tersebut harus persistable juga.

Berikut ini contoh yang salah:

public class  MyClass {
    int  someValue;
} 

...

hashtable.put("Key", new  MyClass());
persistentObject.commit();

Tetapi jika kelas MyClass implements Persistable, maka dapat dilakukan:

public class  MyClass implements Persistable {
    int  someValue;
} 

...

hashtable.put("Key", new  MyClass());
persistentObject.commit();

Implementasi Persistent

Masih menggunakan project custom UI, buat PersistentObject menggunakan Hastable untuk menyimpan isi/kontent. Tambahkan variable Hastable, PersistentKey dan key Field Hastable untuk pada kelas AplikasiPertamaMainScreen:

class AplikasiPertamaMainScreen extends MainScreen implements FieldChangeListener {

	...

	private Hashtable persistentHashtable;
	private PersistentObject persistentObject;
	static final long KEY_PERSISTENT = 0x7ca5ef0a1ad81231L;

	static final String KEY_USERNAME = "usernameData";
	static final String KEY_PASSWORD = "passwordData";
	static final String KEY_LEVEL = "levelData";
	static final String KEY_JOB = "jobData";
	static final String KEY_HOBI1 = "hobiProgrammerData";
	static final String KEY_HOBI2 = "hobiDokterData";
	static final String KEY_HOBI3 = "hobiAkuntanData";
	static final String KEY_SEX1 = "sexPriaData";
	static final String KEY_SEX2 = "sexWanitaData";
	static final String KEY_AGE = "ageData";
	static final String KEY_BORN = "bornData";

	...

Buat Hastable. jika pertama kali menggunakan PersistentObject. Sebaliknya, hastable akan mengambil isi/kontent dari PersistentObject jika tidak bernilai null :

if(persistentObject.getContents() == null ) {
	persistentHashtable = new  Hashtable();
	persistentObject.setContents(persistentHashtable);
}
else{
	persistentHashtable = (Hashtable)persistentObject.getContents();
}

Jika PersistentObject memiliki isi/kontent, maka ambil data dengan Hashtable. Kemudian set value sesuai Field:

if (persistentHashtable.containsKey(KEY_USERNAME)) {
	usernameField.setText((String)persistentHashtable.get(KEY_USERNAME));
}
if (persistentHashtable.containsKey(KEY_PASSWORD)) {
	passwordField.setText((String)persistentHashtable.get(KEY_PASSWORD));
}
if (persistentHashtable.containsKey(KEY_HOBI1)) {
	Boolean booleanObject = (Boolean)persistentHashtable.get(KEY_HOBI1);
	chk.setChecked(booleanObject.booleanValue());
}
if (persistentHashtable.containsKey(KEY_HOBI2)) {
	Boolean booleanObject = (Boolean)persistentHashtable.get(KEY_HOBI1);
	chk2.setChecked(booleanObject.booleanValue());
}
if (persistentHashtable.containsKey(KEY_HOBI3)) {
	Boolean booleanObject = (Boolean)persistentHashtable.get(KEY_HOBI1);
	chk3.setChecked(booleanObject.booleanValue());
}
if (persistentHashtable.containsKey(KEY_LEVEL)) {
	Integer intObject = (Integer)persistentHashtable.get(KEY_LEVEL);
	levelField.setSelectedIndex(intObject.intValue());
}
if (persistentHashtable.containsKey(KEY_JOB)) {
	Integer intObject = (Integer)persistentHashtable.get(KEY_JOB);
	choiceJob.setSelectedIndex(intObject.intValue());
}
if (persistentHashtable.containsKey(KEY_AGE)) {
	Integer intObject = (Integer)persistentHashtable.get(KEY_AGE);
	ageNumeric.setSelectedValue(intObject.intValue());
}
if (persistentHashtable.containsKey(KEY_SEX1)) {
	Boolean booleanObject = (Boolean) persistentHashtable.get(KEY_HOBI1);
	radio.setSelected(booleanObject.booleanValue());
}
if (persistentHashtable.containsKey(KEY_SEX2)) {
	Boolean booleanObject = (Boolean) persistentHashtable.get(KEY_SEX2);
	radio2.setSelected(booleanObject.booleanValue());
}
if (persistentHashtable.containsKey(KEY_BORN)) {
	Long longObject = (Long)persistentHashtable.get(KEY_BORN);
	bornDate.setDate(longObject.longValue());
}

Pola ini sama untuk semua tipe data primitif. Bungkus mereka di kelas data/objek yang terkait dan memasukkan ke hashtable.

...

public void save() throws IOException {
	persistentHashtable.put(KEY_USERNAME, usernameField.getText());
	persistentHashtable.put(KEY_PASSWORD, passwordField.getText());
	persistentHashtable.put(KEY_HOBI1, new Boolean(chk.getChecked()));
	persistentHashtable.put(KEY_HOBI2, new Boolean(chk2.getChecked()));
	persistentHashtable.put(KEY_HOBI3, new Boolean(chk3.getChecked()));
	persistentHashtable.put(KEY_SEX1, new Boolean(radio.isSelected()));
	persistentHashtable.put(KEY_SEX2, new Boolean(radio2.isSelected()));
	persistentHashtable.put(KEY_LEVEL, new Integer(levelField.getSelectedIndex()));
	persistentHashtable.put(KEY_JOB, new Integer(choiceJob.getSelectedIndex()));
	persistentHashtable.put(KEY_AGE, new Integer(ageNumeric.getSelectedIndex()));
	persistentHashtable.put(KEY_BORN, new Long(bornDate.getDate()));
	persistentObject.commit();
} 

...

PersistentObject akan menyimpan referensi ke Hashtable, kemudian tetapkan dengan commit dan akan menulis baru dari semua data yang direferensikan ke penyimpanan persistent.

Screenshot :
PersistentStore

Jalankan aplikasi, lalu isi semua field pada form. Setelah itu tekan tombol back, muncul dialog dan pilih save. Kemudian masuk kembali ke aplikasi, maka terlihat semua field terisi sesuai dengan apa yang kita inputkan sebelumnya.
Download