Платформа программирования J2ME для портативных устройств

         

Поиск имен, которые


import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.TextField;

import javax.microedition.rms.RecordEnumeration;

import javax.microedition.rms.RecordStoreException;

import Java.util.Enumeration;

import Java.util.Vector;

/**

Этот класс внедряет экран, который дает возможность пользователю искать одну

или несколько определенных записей в адресной книге. Пользователь вводит имя



или префикс, который представляет имя одной или нескольких записей

в адресной книге.

*/

public class SearchScreen extends Form

implements CommandListener

{

private static Command go =

new Command("Go", Command.SCREEN, 1);

private static Command back = new Command("Back", Command.BACK, 1);

private static SearchScreen instance; private Display display;

private AddressBookMain addressBook; private TextField keyEntry;

/**

Конструктор.

*/

public SearchScreen(}

(

super("Search for entry");

instance = this;

PersistenceDerao pDemo = PersistenceDemo.getlnstance () ;

display = Display .getDisplay (pDerno) ;

addressBook = AddressBookMain.getlnstance ();

keyEntry = new TextField("Enter name",

null, 20, TextFieid.ANY);
append(keyEntry);

addCommand(go);
addCommand(back);

setCoramandListener(this);

}

/**

Возвращает один экземпляр данного класса.

Вызов данного метода до создания объекта возвращает нулевой указатель.

/**

возвращает экземпляр данного класса.

**/

public static SearchScreen getlnstance ()

return instance; ) void display!)

( display.setCurrentlthis) ;

}

/**

Отображает данные, переданные на экран.

На самом деле этот метод передает обязанности по отображению

данных экземпляру SearchResultScreen. Этот метод,

однако, устанавливает новый экземпляр данного класса на текущее отображение.

Затрата выражается в Vector записей из хранилища записей адресной книги.



*/

void displaySearchResults(Vector results)

SearchResultScreen screen =

new SearchResultScreen (results);


display. setCurrenJ: (screen) ;

)

Создает конечный набор записей, соответствующих указанному имени.

Критерии отбора заключаются в том, что запись должна

соответствовать имени, введенному

пользователем в TextField "keyEntry". Этот метод задействует метод

AddressBook.getMatchesByName() для применения специального фильтра,

определяющего соответствие этого имени.

*/

Vector buildSearchResults()

{

AddressBook addressBook =

AddressBookMain.getInstance().getAddressBookf);


String matchKey = keyEntry.getString();
Vector results = new Vectorf);


try

{

RecordEnuraeration re =

addressBook.getMatchesByName(matchKey);


byte [] record = null;

while (re.hasNextElement())

record = re.nextRecord () ; results.addElement(record);

}

}

catch (RecordStoreException rse)

}

rse.printStackTracet) ;

)

return results;

)

/**

Создает результаты поиска и отображает их на экране.

class BuildSearchResultsAction implements Runnable

{

public void run ()

Vector results = buildSearchResults ();


displaySearchResults(results) ;

}

}

public void commandAction(Command c, Displayable d) ;

if (c == go)

Runnable action = new BuildSearchResultsAction();


action.run () ;

)

else if (c == beck)

}

AddressBookMain.getInstanced.display!);


}

}

}

Метод buildSearchResults() в классе SearchScreen получает список записей, вызывая метод getMatchesByName (String matchKey) в классе AddressBook. Этот метод фильтрует записи для вывода лишь тех, в которых поле имени начинается с matchKey.

Метод getMatchesByName () выполняет эту фильтрацию, пересылая фильтр записей как первый аргумент в метод enumerateRecords (). Экземпляр MatchAllNamesFilter определяет семантику фильтра для нахождения всех записей, которые начинаются с подстроки matchKey.

Метод enumerateRecords () обращается к следующему методу объекта фильтра для каждой записи в хранилище:

boolean matches(byte [] candidate)

Если в результате выводится true, он включает эту запись в набор списка. Теоретически это сходно с определением запроса SQL в системе родственных баз данных. Объект RecordFilter определяет критерии поиска.

Обратите внимание, что в листинге 7.2 аргумент RecordFilter был равен нулю. Таким образом класс RecordList может вывести все записи в списке, фильтр не применяется.

Вы можете описать несколько фильтров для поддержки поиска по различным критериям. Следуя программе листинга 7.4, вы можете определить несколько внутренних классов, которые реализуют RecordFilter и используют внутренний класс, соответствующий осуществляемому поиску.


Содержание раздела