|   | Emerging Technology Fall Semester, 2004 MIDlet Persistent Storage | |
|---|---|---|
| © 2004, All Rights Reserved, SDSU & Roger Whitney San Diego State University -- This page last updated 28-Oct-04 | 
CS 683 Emerging Technologies Fall Semester, 2004 Doc 22 MIDlet Persistent Storage
Comparing to Change the Order of an Enumeration
Copyright ©, All rights reserved. 2004 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA. OpenContent ( http://www.opencontent.org/opl.shtml) license defines the copyright on this document.
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 2 | 
J2ME in a Nutshell, Kim Topley, O’Reilly, 2002, Chapter 6, pp 210-229
Examples in this lecture are based on examples in the above reference
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 3 | 
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 4 | 
public static RecordStore openRecordStore( 
         String recordStoreName, 
         String vendorName,  
         String suiteName) 
   
public int addRecord(byte[] data,
                int offset,
                int numBytes)
   
public void setRecord(int recordId,
               byte[] newData,
               int offset,
               int numBytes)
   
public byte[] getRecord(int recordId)
   
public void deleteRecord(int recordId)
   
public int getNumRecords()
   
public int getNextRecordID()
   
public RecordEnumeration enumerateRecords(RecordFilter filter,
                           RecordComparator comparator,
                           boolean keepUpdated)
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 5 | 
Enumerate through records
Forward and backward enumeration
Used to select which records read by RecordEnumeration
Has one method - boolean matches(byte[] candidate)
Used to determine order of records in a RecordEnumeration
Has one method - int compare(byte[] rec1, byte[] rec2)
Used to inform a RecordEnumeration of updates to store
RecordEnumeration updates index
Might have some performance problem
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 6 | 
Based on example from Chapter 6 of J2ME in a Nutshell
import java.io.InputStream;
import java.io.IOException;
   
public class BookInfo {
   int   id;
   String isbn;
   String title;
   
   public BookInfo(String isbn) {  this.isbn = isbn; }
   
   public BookInfo(byte[] bytes) {
      DataInputStream is = 
         new DataInputStream(new ByteArrayInputStream(bytes));
   
      isbn = is.readUTF();
      info.title = is.readUTF();
   }
   
   public String getIsbn() { return isbn; }
   
   public String getTitle() {  return title; }
   
   public byte[] toByteArray() throws IOException {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      DataOutputStream os = new DataOutputStream(baos);
   
      os.writeUTF(isbn);
      os.writeUTF(title == null ? "" : title);
   
      return baos.toByteArray();
   }
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 7 | 
   public boolean equals(Object aBook) {
      try {
         return getIsbn.equals(((BookInfo) aBook).getIsbn() );
      } catch (Exception notABook ) {
         return false;
      }
   }
   
   public boolean compareTo(BookInfo aBook ) {
      return getTitle().compareTo( aBook.getTitle());
   }
}
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 8 | 
import java.io.*;
import javax.microedition.rms.*;
   
public class BookStore implements RecordComparator, RecordFilter {
   
   private static final String STORE_NAME = "BookStore";
   
   private RecordStore store;
   private String searchISBN;
   
   public BookStore() {
      try {
         boolean createIfNeeded = true;
         store = 
            RecordStore.openRecordStore(STORE_NAME, createIfNeeded);
      } catch (RecordStoreException ex) {
         System.err.println(ex);
      }
   }
   
   public void close() throws RecordStoreException {
      if (store != null) {
         store.closeRecordStore();
      }
   }
   
   public int getBookCount() throws RecordStoreException {
      if (store != null) {
         return store.getNumRecords();
      }
      return 0;
   }
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 9 | 
   public void saveNewBook(BookInfo bookInfo)
                        throws IOException, RecordStoreException {
      if (store != null) {
         bookInfo.id = store.getNextRecordID();
         byte[] bytes = bookInfo.toByteArray();
         int bufferOffset = 0;
         store.addRecord(bytes, bufferOffset, bytes.length);
      }
   }
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 10 | 
   public BookInfo getBookInfo(int id) throws RecordStoreException,
                                       IOException {
      byte[] bytes = store.getRecord(id);
      BookInfo info = new BookInfo(bytes);
      info.id = id;
   
      return info;
   }
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 11 | 
   public BookInfo getBookInfo(String isbn) 
      throws RecordStoreException, IOException {
   
      BookInfo bookInfo = null;
      searchISBN = isbn; 
      
      RecordFilter isbnFilter = this;
      RecordComparitor defaultSort = null;
      boolean  noUpdates = false;
      RecordEnumeration enum = 
         store.enumerateRecords(isbnFilter, defaultSort, noUpdates);
      
      if (enum.numRecords() > 0) {
         int id = enum.nextRecordId();
         bookInfo = getBookInfo(id);
      }
   
      enum.destroy();
      return bookInfo;
   }
      
   public boolean matches(byte[] bookBytes) {
      if (searchISBN != null) {
         try {
            BookInfo bookInfo = new BookInfo(bookBytes);
   
            return searchISBN.equals(bookInfo.getIsbn());
         } catch (IOException ex) {
            System.err.println(ex);
         }
      }
      return false;
   }
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 12 | 
   public void saveBookInfo(BookInfo bookInfo)
                        throws IOException, RecordStoreException {
      if (store != null) {
         searchISBN = bookInfo.getIsbn();
         RecordFilter isbnFilter = this;
         RecordComparitor defaultSort = null;
         boolean  noUpdates = false;
   
         RecordEnumeration enum = 
            store.enumerateRecords(isbnFilter, defaultSort, noUpdates);
   
         if (enum.numRecords() > 0) {
            bookInfo.id = enum.nextRecordId();
            byte[] bytes = bookInfo.toByteArray();
            store.setRecord(bookInfo.id, bytes, 0, bytes.length);
         } else {
            saveNewBook(bookInfo);
         }
         enum.destroy();
      }
   }
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 13 | 
   public void deleteBook(BookInfo bookInfo) throws RecordStoreException {
      if (store != null) {
         store.deleteRecord(bookInfo.id);
      }
   }
| CS 683 Fall 04 | Doc 22, MIDlet Persistent Storage Slide # 14 | 
   public int compare(byte[] book1Bytes, byte[] book2Bytes) {
      try {
         BookInfo book1 = new BookInfo(book1Bytes);
         BookInfo book2 = new BookInfo(book2Bytes);
   
         if (book1.equals(book2)) {
            return RecordComparator.EQUIVALENT;
         }
         int result = book1.compareTo(book2);
         if (result == 0) {
            return RecordComparator.EQUIVALENT;
         }
         return result < 0 ? 
            RecordComparator.PRECEDES : RecordComparator.FOLLOWS;
      } catch (IOException ex) {
         return RecordComparator.EQUIVALENT;
      }
   }
   
   public RecordEnumeration getBooks() throws RecordStoreException {
      if (store != null) {
         return store.enumerateRecords(null, this, false);
      }
      return null;
   }
Copyright ©, All rights reserved.
2004 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA.
OpenContent license defines the copyright on this document.