Download - MIDP: Persistant Storage

Transcript
Page 1: MIDP: Persistant Storage

MIDP Development:Persistent Storage

Jussi PohjolainenTAMK University of Applied Sciences

Page 2: MIDP: Persistant Storage

Persistent Storage

• The nature of mobile device is different from PC:– All the actions done by the user will

be saved automatically. (Mobile Device works like pen and paper)

– There is no "Save as.." function.

• In MIDP-programming persistent storage is done by Record Store.

Page 3: MIDP: Persistant Storage

Record Store

MIDletMIDlet

MIDlet Suite MIDlet Suite

Device Persistent StorageRAM, Flash ROM, etc

MIDletMIDlet

MIDletMIDlet

MIDletMIDlet

Record StoreRecord Store Record StoreRecord StoreRecord Store Record StoreRecord Store

Page 4: MIDP: Persistant Storage

Handling Record Store

• Opening record store– public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException

• In Practice– RecordStore rs = RecordStore.openRecordStore(“Address”, true);

Page 5: MIDP: Persistant Storage

Closing and Deleting

• Closing– rs.closeRecordStore();

• To get all the Record Stores:– public static String[] listRecordStores();

• Deleting record store– rs.deleteRecordStore()

Page 6: MIDP: Persistant Storage

Record Store's other methods

• int getSize()– Returns the amount of space, in bytes, that the record store occupies.

• int getSizeAvailable()– Returns the amount of additional room (in bytes) available for

this record store to grow• int getVersion()

– Each time a record store is modified (by addRecord, setRecord, or deleteRecord methods) its version is incremented

• long getLastModified() – Returns the last time the record store was modified, in the

format used by System.currentTimeMillis().

Page 7: MIDP: Persistant Storage

RecordStore

int idint id byte [] databyte [] data

RecordStoreconsists of

Records

RecordStoreconsists of

Records

Reco

rdSt

ore

int idint id byte [] databyte [] data

int idint id byte [] databyte [] data

int idint id byte [] databyte [] data

Page 8: MIDP: Persistant Storage

Handling Records

• Adding Record to Record Store– public int addRecord(byte[] data, int offset, int numBytes) throws RecordStoreNotOpenException, RecordStoreException, RecordStoreFullException

• Example– String record = "Save this.."

– byte [] data = record.getBytes();

– int id = rs.addRecord(data, 0, data.length);

Page 9: MIDP: Persistant Storage

Getting the Record

• To get the record– public byte[] getRecord(int recordId) throws RecordStoreNotOpenException, InvalidRecordIDException, RecordStoreException

• Example– byte[] retrieved = rs.getRecord(id);

Page 10: MIDP: Persistant Storage

Deleting and Replacing a Record

• Deleting– void deleteRecord(int id)

• Replacing– void setRecord(int id, byte[ ] newData, int offset, int numbytes);

Page 11: MIDP: Persistant Storage

Example// SavingRecordStore rs = RecordStore.openRecordStore(”name”, true);String t = “This will be saved”byte [] tb = t.getBytes();int id = rs.addRecord(tb, 0, tb.length); // Adds a Record// Replacingt = “Replace the old record”tb = t.getBytes();rs.setRecord(id, tb, 0, tb.length);// Gettingbyte [] fromrecord = rs.getRecord(id);String string = new String(fromrecord);// Closingrs.closeRecordStore();

Page 12: MIDP: Persistant Storage

What happens if addRecord fails?try{ RecordStore rs =

RecordStore.openRecordStore(”name”, true); String t = “This will be saved” byte [] tb = t.getBytes(); int id = rs.addRecord(tb, 0, tb.length); // Adds a

record rs.closeRecordStore();}catch(RecordStoreException e){

System.out.println(”Some problem...”)}

Page 13: MIDP: Persistant Storage

SolutionRecordStore rs = null;try{ rs = RecordStore.openRecordStore(”name”, true); String t = “This will be saved” byte [] tb = t.getBytes(); int id = rs.addRecord(tb, 0, tb.length); // Add's a record }catch(RecordStoreException e){

System.out.println(”Problem...”)}finally{

try{ if(rs != null) rs.closeRecordStore(); }

catch(Exception e){}}

Page 14: MIDP: Persistant Storage

Record Store Events

• It is possible to listen to Record Store Events. (If there is a change in Record Store)– addRecordListener(RecordListener listener)

• Methods in the interface– recordAdded()– recordChanged()– recordDeleted()

Page 15: MIDP: Persistant Storage

Retrieving results from the RecordStore: Enumeration

• RecordStore– public RecordEnumeration

enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated)

• RecordFilter = What is retrieved from the Store

• RecordComparator = Order of the result

Page 16: MIDP: Persistant Storage

RecordFilter

class MyFilter implements RecordFilter{

public boolean matches(byte [] candidate){

if(candidate[0] == 7)

return true;

else

return false;

}

}

Page 17: MIDP: Persistant Storage

RecordComparatorclass MyComparator implements RecordComparator{

public int compare(byte [] rec1, byte[] rec2){

// Make comparing between two byte-arrays

if(...)

return PRECEDES; // rec1 on ennen rec2

else if(...)

return FOLLOWS; // rec2 on ennen rec1

else

return EQUIVALENT; // samat

}

}

Page 18: MIDP: Persistant Storage

Enumeration// Open RecordStore

// Create RecordFilter rf

// Create RecordComparator rc

RecordEnumeration re = rs.enumerateRecords(rf, rc, false);

while(re.hasNextElement()){

byte [] rb = re.nextRecord();

.

.

}

Can be also null!

Page 19: MIDP: Persistant Storage

Enumeration example

RecordStore rs = RecordStore.openRecordStore(rs_name, true);

RecordEnumeration re = rs.enumerateRecords(null, null, false);

while(re.hasNextElement()){byte [] x = re.nextRecord();String merkkijonoksi = new String(x);

// Do something}

// Deleting all the recordswhile(re.hasNextElement()){

int id = re.nextRecordId();rs.deleteRecord(id);

}