Говорит и показывает 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(). Позиция в списке и порядковый номер записи в базе в нашей программе совпадают. |