Платформа J2Me - Автор неизвестен
Шрифт:
Интервал:
Закладка:
*/
class AlphabeticalOrdering implements RecordCoraparator
}
Конструктор.
public AlphabeticalOrdering ()
(
)
public int compare(byte [] reel, byte [] rec2)
{
ByteArraylnputStream baisl =
new ByteArraylnputStream(recl);
DatalnputStream disl = new DatalnputStream(baisl);
ByteArraylnputStream bais2 =
new ByteArraylnputStream(rec2);
DatalnputStream dis2 = new DatalnputStream(bais2);
String namel = null; String name2 = null; try
namel = disl.readUTF ();
name2 = dis2.readUTF ();
}
catch (lOException ioe)
ioe.printStackTrace();
}
if (namel == null II name2 == null) return 0;
int result = namel.compareTo(name2);
if (result < 0)
return RecordCornparator. PRECEDES;
else if (result == 0)
return RecordCoraparator.EQUIVALENT;
else
return RecordComparator.FOLLOWS;
}
}
/**
Удаляет все записи из хранилища данных.
В текущих реализациях самый быстрый способ удаления всех записей заключается в удалении хранилища данных и повторном его создании, вместо удаления каждой записи по очереди!
void deleteAHRecords ()
}
try
RecordEnumeration re =
recordStore.enumerateRecords(null, null, false);
while (re.hasNextElement())
*/
int id = re.nextRecordld();
recordStore.deleteRecord(id);
}
}
catch (RecordStoreException rse)
{
rse.printStackTracel);
} }
/**
Получает статистику хранилища данных, используемого данной адресной книгой.
/**
возвращает String статистических данных.
*/
public String getStatistics ()
{
int numRecords = 0;
int space = 0;
StringBuffer stats = new StringBuffer("Records:
*/
try
{
numRecords = recordStore.getNumRecords ();
space = recordStore.getSizeAvailable();
)
catch (RecordStoreException rse)
(
rse.printStackTrace();
}
stats.append(String.valueOf(nuraRecords));
stats.append("nn");
stats.append("Available bytes: ");
stats.append(String.valueOf(space));
return stats. toString();
}
}
Обратите внимание, что класс AddressBook определяет член типа RecordStore. Это экземпляр действительного хранилища записей, используемого приложением. Класс RecordStore является единственным открыто объявляемым классом в пакете RMS. Он определяет абстракцию хранилища записей.
Конструктор AddressBook сбрасывает RecordStoreException, поскольку метод openRecordStore() может сбрасывать три исключения, которые происходят от него. Пакет javax.microedition.rras определяет пять исключений. На рисунке 7.2 показана иерархия наследования, которая содержит типы исключений RMS.
Рисунок 7.2. Пакет RMS определяет несколько исключений, связанных с доступом к хранилищу данных. Все исключения принадлежат пакету javax.microedition.rms, если не определено иное
Класс AddressBook предоставляет следующие методы, поддерживающие функции уровня приложения, выполняемые в хранилище данных:
void addRecord(String name, String phone)
void deleteAHReccrds ()
String ge-Scatistics ()
RecordEnumeration getAHRecords(String matchKey)
При реализации данного приложения на реальном устройстве необходимо обеспечение более полного набора методов для окончательной доработки этого интерфейса. Тем не менее, данный набор можно использовать с целью демонстрации понятий, связанных с использованием RMS MIDP.
Работа с данными byte []Как уже упоминалось выше, приложение в этом примере работает с записями, которые содержат имя и номер телефона. Пользователь вводит как имена, так и телефонные номера как объекты String, поскольку экран ввода данных использует экземпляры класса TextField, описанный ранее в главе 5. Соответственно, метод addRecord () получает эти значения String и преобразует их в байты.
Так или иначе, эти значения должны быть преобразованы в один массив байтов перед добавлением в хранилище данных. Причина того, что вы должны выполнить это преобразование, заключается в том, что API RecordStore хранит записи только в виде однобайтового массива.
Метод addRecord () использует стандартную идиому ввода-вывода Java при создании DatalnputStream, который поддерживает запись встроенных типов Java в выходном потоке. Получающийся в результате байтовый массив затем добавляется в объект RecordStore.
Метод RecordStore.addRecord() возвращает int, которая представляет значение ID только что созданной записи. Ваше приложение может сохранить данный ID и использовать его при последующем извлечении записи. Но существует более интересный способ извлечения записей.
CпиcкиСуществует на самом деле два способа извлечения записей из хранилища данных:
— Извлечение отдельной записи с помощью ее уникального ID;
— Извлечение списка записей и выбор из них одной или нескольких нужных вам записей.
Чтобы извлечь определенную запись, вы можете использовать следующий метод класса RecordStore:
byte [] getRecord(int recordld)
Этот метод, очевидно, требует, чтобы вы знали уникальный ID записи, которую вы хотите извлечь. К сожалению, это означает, что вам, возможно, придется хранить ID где-нибудь в легкодоступном месте после того, как он будет выдан вам методом addRecord (). Это не всегда удобно или практично при большом количестве записей.
Самый легкий способ найти записи, которые вам нужны, — это использовать списки, которые поддерживаются классом RecordStore. Список весьма удобен при извлечении записей, если вы не знаете ID записей, которые вам нужны. Вы можете создать список записей, хранящихся в хранилище записей, а затем исследовать его, выбрав одну или несколько записей, которые вам нужны.
Класс RecordStore определяет метод
RecordEnumeration
enumerateRecords(RecordFilter filter,
RecordComparator comparator,
boolean keepUpdated)
который выдает список записей в хранилище записей. В листинге 7.2 показан исходный код RecordList.Java. Этот класс создает и отображает список всех записей адресной книги. Обратите внимание, что для того, чтобы извлекать записи, ID записей указывать не нужно.
Листинг 7.2. Списки дают вам возможность получать доступ к записям, не зная их идентификационных номеров (ID)
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import java.io.ByteArraylnputStream;
import Java.io.DatalnputStream; import Java.io.lOException;
/**
Этот класс является компонентом пользовательского интерфейса, отображающим список записей, находящихся в хранилище записей.
Он использует объект AddressBook, определенный классом MID-лета для данного приложения MID-лета.
@смотри AddressBook
@смотри AddressBookMain
*/
public class RecordList extends List
implements CommandListener
{
private static Command go =
new command("Go", Command.SCREEN, 1);
private static Command back =
new Command("Back", Command.BACK, 1);
private Display display;
private static RecordList instance;
/**
Конструктор.
@param title название экрана пользовательского интерфейса,
который является List.
*/
public RecordList (String title)
superltitle, List.IMPLICIT);
instance = this;
PersistenceDemo pDemo = PersistenceDemo.getlnstance ();
display = Display.get-Display (pDemo);
addCommand(back); setCommandListener (this);
if (buildRecordList() <= 0) setTitle("No records found");
}
/**
Возвращает один экземпляр данного класса.
Вызов этого метода перед созданием объекта возвращает нулевой указатель.
@возвращает экземпляр данного класса.
*/
public static RecordList getlnstance()
}
return instance;
}
void display ()
{
display.setCurrent (this);
{
/**
Создает список записей, хранящихся в хранилище записей. Выдает число найденных записей. Этот метод извлекает все записи из хранилища записей, то есть он не использует фильтров для извлечения записей. Он также не использует компараторов записей, так что не упорядочивает выводимые записи.
Этот метод не сбрасывает исключений, но находит исключения, которые происходят при доступе к хранилищу записей.
(@возвращает число записей, найденных в хранилище записей, или 0, если записей не найдено.
*/
int buildRecordList ()
{
AddressBook addressBook =
AddressBookMain.get Instance!). getAddressBook();
RecordStore recordStore = addressBook.getRecordStore();
int numRecords = 0; try
RecordEnuraeration re;
re = recordStore.enumerateRecords(null,
null, false);
if (re.numRecords() > 0)
{
ByteArraylnputStream bais = null;
DatalnputStreara dis = null;
String name = null;
while (re.hasNextElement())
byte [] record = re.nextRecord();
bais = new ByteArraylnputStream(record); dis = new DatalnputStrearn (bais);
String strRec = new String(record);
name = dis. readUTFO;
appendfname, null;
numRecords++;
)
)
else
}
Alert a = new Alert("No records",
"No records found in record store", null,
AlertType.CONFIRMATION); a.setTimeout(Alert.FOREVER);
display.setCurrent (a, AddressBookMain.get Instance ());