Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

Говорит и показывает Palm

Константин Клягин

Xakep, номер #069, стр. 069-122-5


1. Открытие существующей БД.

Открываем БД

static DmOpenRef dbh = 0;

...

dbh = DmOpenDatabaseByTypeCreator(appDBType, appFileCreator, dmModeReadWrite);

Первые два параметра идентифицируют базу. Константа appFileCreator обычно автоматом определяется в начале генерируемого исходника. Что касается типа, то его можно придумать самому. Желательно, чтобы он как-то характеризовал базу. Разные типы с одинаковым криэйтором будут обозначать разные базы, принадлежащие одному и тому же приложению.

2. Создание БД. Если попытка открытия БД не удалась, рекомендую попробовать ее создать. Это избавит пользователя от необходимости заливать помимо бинарника еще и базу данных в свой Палм. Впрочем, большинство умных программ так и делают. Продолжаем:

Проверка на наличие, открытие и создание БД

dbh = DmOpenDatabaseByTypeCreator(appDBType, appFileCreator, dmModeReadWrite);

if(!dbh)

if(DmCreateDatabase(0, "palmtv", appFileCreator, appDBType, false) == errNone)

dbh = DmOpenDatabaseByTypeCreator(appDBType, appFileCreator, dmModeReadWrite);

3. Добавление записи. Здесь тоже все не так просто. Сначала надо задать позицию. Потом получить ссылку на вновь добавленную запись, после чего залочить ее и записать данные. Всем этим занимаются специальные функции. Смотри:

Создаем запись в БД

UInt16 rn = dmMaxRecordIndex;

MemHandle h = DmNewRecord(dbh, &rn, StrLen(title)+1+MemPtrSize(irData));

if(h) {

p = (Char *) MemHandleLock(h);

DmWrite(p, offset, title, StrLen(title)+1);

DmWrite(p, offset + StrLen(title)+1, irData, MemPtrSize(irData));

MemHandleUnlock(h);

DmReleaseRecord(dbh, rn, true);

}

В нашей программе каждая запись будет состоять из двух частей: названия команды, которое будет отображаться в списке, и самого ИК-кода команды. Раз уж первая часть - строка, то разделителем будет служить нулевой символ.

4. Перебор записей в базе. Делается тривиально. Организуется простой цикл for от нуля до количества записей в базе, которое можно высчитать с помощью вызова DmNumRecords(). В этом цикле при помощи DmQueryRecord() получаем ссылку на запись и читаем ее. Еще мы тут же будем формировать список элементов для элемента интерфейса List (массив items; количество элементов в nitems).

Перебираем записи в базе и заполняем список

for(i = 0; i < DmNumRecords(dbh); i++) {

h = DmQueryRecord(dbh, i);

if(!h) continue;

if((p = (char *) MemHandleLock(h))) {

hp = MemHandleNew(StrLen(p)+1);

items[nitems] = (char *) MemHandleLock(hp);

StrCopy(items[nitems], p);

MemHandleUnlock(h);

nitems++;

}

}

5. Удаление записей. Для этого существует две функции: DmDeleteRecord() и DmRemoveRecord(), разницу между которыми следует знать. В то время как первая только помечает записи для удаления, вторая их стирает решительно и насовсем. Пометка для удаления может быть впоследствии снята. Однако как только произойдет следующий HotSync с десктопом на компе, такая запись тоже будет снесена.

Обе функции принимают два параметра. Первый - DmOpenRef базы, второй - индексный номер записи. Тот самый, по которому ее читает DmQueryRecord(). Позиция в списке и порядковый номер записи в базе в нашей программе совпадают.

Назад на стр. 069-122-4  Содержание  Вперед на стр. 069-122-6