Birthday Database
/**** Chapter 5 Sample code for RMS Package****/ import java.io.*; import javax.microedition.midlet.*; import javax.microedition.rms.*; public class BirthdayDB extends MIDlet { static final String RSNAME = "birthdayDB"; private RecordStore rs = null; public BirthdayDB() { try { openBirthdayDB(RSNAME); populateSampleRecords(); //BEGIN: Test for basic funcitionality of a record store displayRecordStoreinfo(); searchAndDisplayRecords(null, null); //Simple enumeration withouit any criteria deleteBirthday(2); updateBirthday(3, "Lisa", "03/07/99"); searchAndDisplayRecords(null, null); //Simple enumeration withouit any criteria //END: Test for basic funcitionality of a record store //BEGIN: Test for record listener rs.addRecordListener((RecordListener) new BirthdayDBListener()); addBirthday("Maya","09/08/96"); deleteBirthday(3); updateBirthday(4, "NewLisa", "03/08/99"); rs.removeRecordListener((RecordListener) new BirthdayDBListener()); //END: Test for record listener //BEGIN: Complex test for record enumeration with record filter and record comparator NameFilter nameFilter = new NameFilter("John"); NameComparator nameComparator = new NameComparator(); searchAndDisplayRecords(nameFilter,nameComparator); //END: Complex test for record enumeration with record filter and record comparator closeBirthdayDB(); } catch( Exception e ){ System.out.print("Error in BirthdayDB.BirthdayDB-> "); System.out.println("Exception : " + e.getMessage()); } notifyDestroyed(); } /**** This function will create/open database. ****/ private void openBirthdayDB(String name) { // Just to avoid using wrong DB, // First clear out the old record store try { RecordStore.deleteRecordStore( name ); } catch( Exception e ){ // ignore any errors... } // attempt to create a new RecordStore database try { rs = RecordStore.openRecordStore( name, true ); } catch( Exception e ){ System.out.print("Error in BirthdayDB.openBirthdayDB -> "); System.out.println("Exception : " + e.getMessage()); } } /**** This function closes the DB if it is open. ****/ private void closeBirthdayDB() { if (rs != null) { try { rs.closeRecordStore(); } catch (Exception e) { System.out.print("Error in BirthdayDB.closeBirthdayDB -> "); System.out.println("Exception : " + e.getMessage()); } } } /**** This function will search for the records using criteria defined in Filter class and it will display records in the order specfied in Comparator class ****/ public void searchAndDisplayRecords(NameFilter f, NameComparator c){ try { RecordEnumeration rEnum = rs.enumerateRecords( f, c , false); System.out.println("Total Records in Enumeration: " + rEnum.numRecords()); while (rEnum.hasNextElement()){ byte [] bRec = rEnum.nextRecord(); //unpack a multi-column record ByteArrayInputStream bais = new ByteArrayInputStream(bRec); DataInputStream dis = new DataInputStream(bais); String name = dis.readUTF(); String bDay = dis.readUTF(); System.out.println("Name: " + name + " BirthDay: "+ bDay); } } catch (Exception e) { System.out.print("Error in BirthdayDB.searchAndDisplayRecords -> "); System.out.println("Exception : " + e.getMessage()); } return; } /**** This function creates a byte stream for record and adds a record to database ****/ public void addBirthday(String name, String bDay) { try{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(name); dos.writeUTF(bDay); byte [] bRec = baos.toByteArray(); rs.addRecord(bRec,0,bRec.length); dos.close(); baos.close(); } catch (Exception e) { System.out.print("Error in BirthdayDB.addBirthdayDB -> "); System.out.println("Exception : " + e.getMessage()); } return; } /**** This function deleted a record with given recordId ****/ public void deleteBirthday(int recordId) { try{ rs.deleteRecord(recordId); } catch (Exception e) { System.out.print("Error in BirthdayDB.deleteBirthday -> "); System.out.println("Exception : " + e.getMessage()); } return; } /**** This function updates the record with new name and birthday at given recordId ****/ public void updateBirthday(int recordId, String newName, String newBDay) { try{ // convert new data into byte stream ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(newName); dos.writeUTF(newBDay); byte [] bRec = baos.toByteArray(); rs.setRecord(recordId, bRec,0,bRec.length); dos.close(); baos.close(); } catch (Exception e) { System.out.print("Error in BirthdayDB.updateBirthday -> "); System.out.println("Exception : " + e.getMessage()); } return; } /**** This function populates seed records ****/ public void populateSampleRecords() { addBirthday("John", "01/04/1969"); addBirthday("Joe", "05/05/1976"); addBirthday("Keran", "09/12/1976"); addBirthday("Marry", "04/22/1979"); addBirthday("Paul", "06/26/1972"); addBirthday("Robert", "08/30/1971"); addBirthday("John", "01/04/1970"); } /**** This function displays information of a record store ****/ public void displayRecordStoreinfo() { try { System.out.println("Name of the record store is " + rs.getName()); System.out.println("Number of records in this record store are " + rs.getNumRecords()); System.out.println("Size of record store is " + rs.getSize()); System.out.println("Available size for the record store " + rs.getSizeAvailable()); System.out.println("Version number of the record store is " + rs.getVersion()); System.out.println("Last Modified Date is " + rs.getLastModified()); } catch (Exception e) { System.out.print("Error in BirthdayDB.displayRecordStoreinfo -> "); System.out.println("Exception : " + e.getMessage()); } } /**** MIDlet lifecycle functions ****/ public void destroyApp( boolean unconditional ) { if (rs != null) closeBirthdayDB(); } public void startApp() { } public void pauseApp() { } } class NameFilter implements RecordFilter { String name; public NameFilter(String filterOnThisName) { name = filterOnThisName; } public boolean matches(byte [] candidateRecord) { try{ ByteArrayInputStream bais = new ByteArrayInputStream(candidateRecord); DataInputStream dis = new DataInputStream(bais); String nameFromRec = dis.readUTF(); dis.close(); bais.close(); if (name.compareTo(nameFromRec) == 0 ) return true; } catch (Exception e) { System.out.print("Error in NameFilter.matches -> "); System.out.println("Exception : " + e.getMessage()); } return false; } } class NameComparator implements RecordComparator { public int compare(byte [] rec1, byte [] rec2) { try{ // read first record and extract name ByteArrayInputStream bais1 = new ByteArrayInputStream(rec1); DataInputStream dis1 = new DataInputStream(bais1); String name1 = dis1.readUTF(); dis1.close(); bais1.close(); // read second record and extract name ByteArrayInputStream bais2 = new ByteArrayInputStream(rec2); DataInputStream dis2 = new DataInputStream(bais2); String name2 = dis2.readUTF(); dis2.close(); bais2.close(); if (name1.compareTo(name2) < 0 ) return PRECEDES; if (name1.compareTo(name2) > 0 ) return FOLLOWS; } catch (Exception e) { System.out.print("Error in NameComparator.compare -> "); System.out.println("Exception : " + e.getMessage()); } return EQUIVALENT; } } class BirthdayDBListener implements RecordListener { public void recordAdded(RecordStore rs, int recordId) { System.out.println("Record Added in record store " ); } public void recordDeleted(RecordStore rs, int recordId) { System.out.println("Record Deleted from record store "); } public void recordChanged(RecordStore rs, int recordId) { System.out.println("Record Changed in record store "); } }