2012-03-15 57 views
3

相同的代碼在兩個J2ME & NetBeans的下面的代碼運行:獲得不同的輸出,同時運行在J2ME&的NetBeans

該代碼可用於記錄濾波(查詢的記錄)。

問題是,我們在j2me中運行此代碼時,它從頭開始執行搜索,而在NetBeans中則是從反向搜索。

 import javax.microedition.rms.*; 
     import javax.microedition.midlet.*; 
     import javax.microedition.lcdui.*; 
     import java.io.*; 
     import javax.microedition.rms.RecordFilter; 
     public class SearchExample extends MIDlet implements CommandListener 
     { 
     private Display display; 
     private Alert alert; 
     private Form form; 
     private Command exit; 
     private Command start; 
     private RecordStore recordstore = null; 
     private RecordEnumeration recordEnumeration = null; 
     private Filter filter = null; 
     public SearchExample() 
     { 
     display = Display.getDisplay(this); 
     exit = new Command("Exit", Command.SCREEN, 1); 
     start = new Command("Start", Command.SCREEN, 1); 
     form = new Form("Mixed RecordEnumeration", null); 
     form.addCommand(exit); 
     form.addCommand(start); 
     form.setCommandListener(this); 
     } 
     public void startApp() 
     { 
     display.setCurrent(form); 
     } 
     public void pauseApp() 
     { 
     } 
     public void destroyApp(boolean unconditional) 
     { 
     } 
     public void commandAction(Command command, Displayable displayable) 
     { 
     if (command == exit) 
     { 
     destroyApp(true); 
     notifyDestroyed(); 
     } 
     else if (command == start) 
     { 
     try 
     { 
     recordstore = RecordStore.openRecordStore("myRecordStore", true); 
     } 
     catch (Exception error) 
     { 
     alert = new Alert("Error Creating",error.toString(), null, AlertType.WARNING); 
     alert.setTimeout(Alert.FOREVER); 
     display.setCurrent(alert); 
     } 
     try 
     { 
     String outputData[] = {"Mary", "Adam","dancebob","bobby","bob1"}; 
     for (int x = 0 ; x < outputData.length; x++) 
     { 

     byte[] byteOutputData = outputData[x].getBytes(); 
     recordstore.addRecord(byteOutputData, 0,byteOutputData.length); 
     } 
     } 
     catch (Exception error) 
     { 
     alert = new Alert("Error Writing",error.toString(), null, AlertType.WARNING); 
     alert.setTimeout(Alert.FOREVER); 
     display.setCurrent(alert); 
     } 
     try 
     { 
     filter = new Filter("Bob"); 
     StringBuffer sbuf=new StringBuffer(); 
     recordEnumeration = recordstore.enumerateRecords(filter, null, false); 
     if (recordEnumeration.numRecords() > 0) 
     { 
     for(int i=0;i<recordEnumeration.numRecords();i++){ 
     String string = new String(recordEnumeration.nextRecord()); 
     sbuf.append(string+"\n"); 
     } 

     alert = new Alert("Reading", sbuf.toString(),null, AlertType.WARNING); 
     alert.setTimeout(Alert.FOREVER); 
     display.setCurrent(alert); 
     } 
     } 
     catch (Exception error) 
     { 
     alert = new Alert("Error Reading",error.toString(), null, AlertType.WARNING); 
     alert.setTimeout(Alert.FOREVER); 
     display.setCurrent(alert); 
     } 
     try 
     { 
     recordstore.closeRecordStore(); 
     } 
     catch (Exception error) 
     { 
     alert = new Alert("Error Closing",error.toString(), null, AlertType.WARNING); 
     alert.setTimeout(Alert.FOREVER); 
     display.setCurrent(alert); 
     } 
     if (RecordStore.listRecordStores() != null) 
     { 
     try 
     { 
     RecordStore.deleteRecordStore("myRecordStore"); 
     recordEnumeration.destroy(); 
     filter.filterClose(); 
     } 
     catch (Exception error) 
     { 
     alert = new Alert("Error Removing",error.toString(), null, AlertType.WARNING); 
     alert.setTimeout(Alert.FOREVER); 
     display.setCurrent(alert); 
     } 
     } 

     } 
     } 
     } 
     class Filter implements RecordFilter 
     { 
     private String search = null; 
     private ByteArrayInputStream inputstream = null; 
     private DataInputStream datainputstream = null; 
     public Filter(String search) 
     { 
     this.search = search.toLowerCase(); 
     } 
     public boolean matches(byte[] suspect) 
     { 
     String string = new String(suspect).toLowerCase(); 

     if (string!= null && string.indexOf(search) != -1) 
      return true; 
     else 
      return false; 
     } 

     public void filterClose() 
     { 
     try 
     { 
     if (inputstream != null) 
     { 
     inputstream.close(); 
     } 
     if (datainputstream != null) 
     { 
     datainputstream.close(); 
     } 
     } 
     catch (Exception error) 
     { 
     } 
     } 
     } 

回答

4

你的代碼片斷是相當大的和格式是壞的,所以有可能是我沒有注意到其他一些錯誤,但如果你擔心的是遍歷枚舉你在這行創建的順序:

recordEnumeration = recordstore.enumerateRecords(filter, null, false); 

那麼這是正常的行爲。 MIDP RMS API documentation指出,當第二個參數是null(並且在您的代碼中它是),則記錄按未定義的順序遍歷。

請參閱下面的報價,並注意您可能會認爲這關係到RecordComparator comparator

public RecordEnumeration enumerateRecords(RecordFilter filter, 
             RecordComparator comparator, 
             boolean keepUpdated) 
           throws RecordStoreNotOpenException 

Returns an enumeration for traversing a set of records in the record store 
    in an optionally specified order. 

The filter, if non-null, will be used to determine what subset 
    of the record store records will be used. 

The comparator, if non-null, will be used to determine the order 
    in which the records are returned. 

If both the filter and comparator is null, the enumeration will traverse 
    all records in the record store in an undefined order. This is the most 
    efficient way to traverse all of the records in a record store. If a filter 
    is used with a null comparator, the enumeration will traverse the filtered 
    records in an undefined order. The first call to RecordEnumeration.nextRecord() 
    returns the record data from the first record in the sequence. Subsequent calls 
    to RecordEnumeration.nextRecord() return the next consecutive record's data. 
    To return the record data from the previous consecutive from any given point 
    in the enumeration, call previousRecord(). On the other hand, if after creation 
    the first call is to previousRecord(), the record data of the last element 
    of the enumeration will be returned. Each subsequent call to previousRecord() 
    will step backwards through the sequence. 

Parameters: 
    filter - if non-null, will be used to determine what subset of the 
    record store records will be used 
    comparator - if non-null, will be used to determine the order in which 
    the records are returned 
    ... 

細節,因爲它僅僅是一個幸運的巧合,Netbeans的模擬器每次運行MIDlet的時間遍歷同樣的方式記錄;理論上允許在每次運行中改變順序。