Tìm Kiếm Với Bộ Lọc RecordFilter

Một phần của tài liệu Xây dựng ứng dụng từ điển anh việt cho điện thoại di động bằng J2ME (Trang 68 - 72)

c) Cơ chế luồng an toàn

4.5 Tìm Kiếm Với Bộ Lọc RecordFilter

Ngoài việc sắp xếp các record (sử dụng RecordComparator), enumerator còn cung cấp cơ chế lọc (tìm kiếm các record thỏa mãn một điều kiện nào đó). Khi sử dụng RecordComparator tất cả các record trong RecordStore đều được lưu trong một result set. Nhưng khi dùng RecordFilter, chỉ có những thỏa mãn điều kiện mới có trong enumerator result set.

class SearchFilter implements RecordFilter { private String searchText = null;

public SearchFilter(String searchText) { this.searchText = searchText.toLowerCase(); }

public boolean matches(byte[] candidate) {

String str = new String(candidate).toLowerCase();

if (searchText != null && str.indexOf(searchText) != -1) return true; else return false;

} }

Trên đây là một class đơn giản thực thi interface RecordFilter. Class này sẽ được gắn với một enumerator, và khi đó enumerator sẽ dùng hàm matches() duyệt hết recordstore lấy ra những record cần tìm:

SearchFilter search = new SearchFilter("search text");

RecordEnumeration re = rs.enumerateRecords(search,null,false); if (re.numRecords() > 0)

RecordFilter Interface: javax.microedition.rms.RecordFilter

Method Description

boolean matches(byte[] candidate)

Tìm kiếm record thỏa mãn một điều kiện nào đó

Bảng 3.5 Phương thức của RecordFilter

Sau đây ta sẽ xem qua chương trình tìm kiếm đơn giản sử dụng interface RecordFilter: Ví dụ

/*--- * SimpleSearch.java */ import java.io.*; import javax.microedition.midlet.*; import javax.microedition.rms.*; import javax.microedition.lcdui.*;

public class SimpleSearch extends MIDlet implements CommandListener { private Display display;

private Form fmMain; StringItem siMatch;

private Command cmFind; private Command cmExit; private TextField tfFind; private RecordStore rs = null;

static final String REC_STORE = "db_6"; public SimpleSearch() {

display = Display.getDisplay(this);

tfFind = new TextField("Find", "", 10, TextField.ANY); siMatch = new StringItem(null, null);

cmExit = new Command("Exit", Command.EXIT, 1); cmFind = new Command("Find", Command.SCREEN, 2); fmMain = new Form("Record Search");

fmMain.addCommand(cmExit); fmMain.addCommand(cmFind);

// Gắn textfield and stringItem vào form

fmMain.append(tfFind); fmMain.append(siMatch); fmMain.setCommandListener(this); openRecStore(); writeTestData(); }

public void destroyApp( boolean unconditional ) { closeRecStore();

deleteRecStore(); }

public void startApp() { display.setCurrent(fmMain); }

public void openRecStore() { try { rs = RecordStore.openRecordStore(REC_STORE, true ); } catch (Exception e) { db(e.toString()); } }

public void closeRecStore() { try { rs.closeRecordStore(); } catch (Exception e) { db(e.toString()); } }

public void deleteRecStore() {

if (RecordStore.listRecordStores() != null) { try { RecordStore.deleteRecordStore(REC_STORE); } catch (Exception e) { db(e.toString()); } } }

public void writeTestData() {

String[] golfClubs = { "Wedge...good from the sand trap", "Truong dai hoc Cong nghe ", "Putter...only on the green", "Hoc mon LTUDM rat boich!"}; writeRecords(golfClubs);

}

public void writeRecords(String[] sData) { byte[] record;

try {

if (rs.getNumRecords() > 0) return; for (int i = 0; i < sData.length; i++) { record = sData[i].getBytes();

rs.addRecord(record, 0, record.length); }

}

db(e.toString()); }

}

private void searchRecordStore() { try {

if (rs.getNumRecords() > 0) {

SearchFilter search = newSearchFilter(tfFind.getString());

RecordEnumeration re= rs.enumerateRecords(search, null, false); if (re.numRecords() > 0)

// Hiển thị chuổi trên form

siMatch.setText(new String(re.nextRecord())); re.destroy(); } } catch (Exception e) { db(e.toString()); } }

public void commandAction(Command c, Displayable s) { if (c == cmFind) { searchRecordStore(); } else if (c == cmExit) { destroyApp(false); notifyDestroyed(); } }

private void db(String str) {

System.err.println("Msg: " + str); }

}

class SearchFilter implements RecordFilter { private String searchText = null;

public SearchFilter(String searchText) {

this.searchText = searchText.toLowerCase(); }

public boolean matches(byte[] candidate) {

String str = new String(candidate).toLowerCase();

if (searchText != null && str.indexOf(searchText) != -1) return true; else return false;

} }

Sau khi viết class SearchFilter, ta tạo một instance search, khi khai báo class RecordEnumeration sẽ tham chiếu đến instance trên. Khi đó chỉ có những record thỏa mãn điều kiện (trong hàm matches()) mới hiển thị trong result set:

SearchFilter search = new SearchFilter(tfFind.getString()); RecordEnumeration re =rs.enumerateRecords(search,null,false); if (re.numRecords() > 0)

siMatch.setText(new String(re.nextRecord()));

Một phần của tài liệu Xây dựng ứng dụng từ điển anh việt cho điện thoại di động bằng J2ME (Trang 68 - 72)