Getting different output when running the same code in j2me & NetBeans
Run the below code in j2me and NetBeans:
This code is for filtering records (search for records).
The problem is that while we run this code in j2me it searches from the beginning, while in NetBeans it searches from the back.
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)
{
}
}
}
source to share
Your code snippet is quite large and the formatting is bad, so there might be some other errors that I didn't notice, but if you are referring to the order of the transitions you have created on this line:
recordEnumeration = recordstore.enumerateRecords(filter, null, false);
then this is normal behavior. The MIDP RMS API documentation states that when the second parameter is null
(and it's in your code) then the entries intersect in undefined order.
See the quote below and note the details related to 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 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 ...
You might think about it, as it's just a lucky coincidence that the Netbeans emulator bypasses the entries the same way every time you start your MIDlet; it is theoretically allowed to change the order on every run.
source to share