3

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

1 に答える 1

4

あなたのコード スニペットは非常に大きく、フォーマットが悪いため、私が気付かなかった他のバグがあるかもしれませんが、次の行で作成した列挙のトラバースの順序について懸念がある場合:

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

これは正常な動作です。MIDP RMS API ドキュメントには、2 番目のパラメーターが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
    ...

Midlet を実行するたびに、Netbeans エミュレーターが同じ方法でレコードをトラバースするのは、幸運な偶然にすぎないと考えるかもしれません。理論的には、実行ごとに順序を変更できます。

于 2012-03-16T06:14:39.110 に答える