package com.j2medev.chapter4;
import javax.microedition.lcdui.*;
public class InputUI extends Form implements ItemStateListener{
private SearchController controller = null;
private TextField input = new TextField("查询条件:", "", 20, TextField.ANY);
public InputUI(SearchController controller) {
super("查询");
this.controller = controller;
this.append(input);
this.setItemStateListener(this);
}
public void itemStateChanged(Item item){
if(item == input){
String data = input.getString();
String[] result = controller.getResult(data);
controller.displayResult(result);
}
}
}
package com.j2medev.chapter4;
import javax.microedition.rms.*;
public class RMSHandler {
private RecordStore rs = null;
//内部类的方式实现SearchFilter,通过比较记录的开始字母决定返回的子集
private class SearchFilter implements RecordFilter{
private String query = null;
public SearchFilter(String query){
this.query = query;
}
public boolean matches(byte[] data){
return new String(data).startsWith(query);
}
}
//内部类的方式实现SearchComparator,决定返回子集的排列顺序
private class SearchComparator implements RecordComparator{
public int compare(byte[] data1,byte[] data2){
int i = new String(data1).compareTo(new String(data2));
if(i < 0){
return RecordComparator.FOLLOWS;
}else if(i == 0){
return RecordComparator.EQUIVALENT;
}else if(i > 0){
return RecordComparator.PRECEDES;
}
return i;
}
}
public RMSHandler() {
openDatabase();
}
//打开RecordStore对象
public void openDatabase(){
try{
rs = RecordStore.openRecordStore("search",true);
if(rs.getNumRecords() <= 0){
initDatabase();
}
}catch(RecordStoreException e){
e.printStackTrace();
}
}
//初始化RecordStore对象,向其中添加8条记录。
public void initDatabase(){
String[] data = new String[]{"h1","h2","c1","c2","m1","m2","d1","d2"};
try{
for(int i = 0;i<data.length;i++){
byte[] array = data[i].getBytes();
rs.addRecord(array, 0, array.length);
}
}catch(RecordStoreException e){
e.printStackTrace();
}
}
//使用RecordEnumeration来访问记录。
public String[] getResult(String query){
try{
//这里返回的记录是符合SearchComparator的排列顺序并经过SearchFilter筛选的记录
RecordEnumeration re = rs.enumerateRecords(new SearchFilter(query), new SearchComparator(), false);
if(re.numRecords() <= 0){
return null;
}else{
String[] result = new String[re.numRecords()];
int i = 0;
//循环记录集合放入result数组中
while(re.hasNextElement()){
result[i++] = new String(re.nextRecord());
}
return result;
}
}catch(RecordStoreException e){
e.printStackTrace();
}catch(NullPointerException e){
e.printStackTrace();
}
return null;
}
}
package com.j2medev.chapter4;
import javax.microedition.lcdui.*;
public class SearchController implements CommandListener{
private SearchMIDlet midlet = null;
private RMSHandler database = null;
private Display display = null;
private InputUI input = new InputUI(this);
private List result = new List("查询结果",List.IMPLICIT);
public static final Command backCommand = new Command("返回",Command.BACK,1);
public static final Command exitCommand = new Command("退出",Command.EXIT,2);
public SearchController(SearchMIDlet midlet) {
this.midlet = midlet;
display = Display.getDisplay(midlet);
database = new RMSHandler();
input.addCommand(exitCommand);
input.setCommandListener(this);
result.addCommand(backCommand);
result.addCommand(exitCommand);
result.setCommandListener(this);
display.setCurrent(input);
}
public String[] getResult(String query){
return database.getResult(query);
}
public void displayResult(String[] queryResult){
if(queryResult == null){
queryResult = new String[]{"查询结果为空"};
}
result.deleteAll();
for(int i = 0;i<queryResult.length;i++){
result.append(queryResult[i],null);
}
display.setCurrent(result);
}
public void commandAction(Command cmd,Displayable displayable){
if(cmd == backCommand){
display.setCurrent(input);
}else if(cmd == exitCommand){
midlet.exit();
}
}
}
package com.j2medev.chapter4;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class SearchMIDlet extends MIDlet {
private SearchController controller = null;
public void startApp() {
controller = new SearchController(this);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void exit(){
destroyApp(false);
notifyDestroyed();
}
}