2011-01-31 2 views
1

Как вы можете легко проверить, имеет ли ваше приложение persistentObjects? Сейчас я использую следующее:PersistentObject Blackberry

public boolean needsFirstTimeInit() { 
    PersistentObject persistentObject = getPersistentObject(Settings.TABLE_USERS); 
    Vector vector = (Vector) getVector(persistentObject); 
    if(vector.size()<=0){ 
     return true; 
    } 
    return false; 
} 

Отрицательные здесь является то, что я прошу данные из таблицы, я знаю, что должно существует, и если она существует я предполагаю, что таблицы не были инициализированы. Есть ли лучший способ сделать это?

ответ

0

Следующее решение работает лучше для меня:

PersistentObject рассматривается в виде таблицы и содержит вектор (заполненный объектами).

Я создал вектор со всеми хэш-кодами таблиц. (v1) Я сделал хэш-таблицу (hashcode tablename, PersistentObject); (h1) При каждом запуске я проверяю, имеют ли все хэш-коды в v1 значение (persistentObject) в h2. Если нет, я инициализирую persistentObject и помещаю его в хэш-таблицу.

1

Код, который вы показали, не совсем прав. В документах BlackBerry API PersistentStore есть простой пример, который показывает вам, что вам нужно делать.

В основном вы вызываете getContents() в PersistentObject, который вы вылавливаете из магазина. Если он равен нулю, ничего не хранится, и вам нужно инициализировать его чем-то, используя setContents().

+0

Да, но тогда вам все равно необходимо указать имя таблицы. Разве нет способа сказать: «Если нет постоянных объектов»? – Vincent

+0

Не знаете, что вы подразумеваете под «именем таблицы», это не реляционная база данных. Стойкие объекты идентифицируются с помощью уникального ключа. Если вы хотите узнать, существует ли постоянный объект или нет, для этого нет API. Вы можете получать только постоянные объекты (которые создадут его, если он не существует) или уничтожить их. –

+0

Я использую hashcode для имени таблицы для поиска объектов (я, вероятно, должен был сделать это ясно). – Vincent

0

Конкретный постоянный объект не связан с конкретным приложением, поэтому не имеет смысла говорить о постоянных объектах вашего приложения.

Любое приложение, которое знает GUID, которое вы использовали для получения PersistentObject, может передать тот же идентификатор GUID PersistentStore.getPersistentObject, чтобы вернуть тот же объект обратно. Это означает, что GUID, который вы используете для PersistentStore.getPersistentObject, должен быть уникальным для всех приложений на BlackBerry (на практике это сложно гарантировать). Поэтому, если вы используете данный GUID и возвращаете постоянный объект с содержимым не null, возможно, ваше приложение сохранила его (скорее всего, учитывая небольшую вероятность использования двух приложений с использованием того же 64-битного GUID), или оно может что какое-то другое приложение сохранит объект с тем же идентификатором GUID.

На практике большинство приложений не утруждают себя проверкой того, что они вернули ожидаемый объект для данного GUID, и это не вызывает проблем. Но это то, о чем нужно помнить, когда вы получаете странную ошибку из-за столкновения GUID.

+0

Не совсем верно ... постоянные объекты связаны с приложениями в том смысле, что если вы сохраняете класс, являющийся частью вашего приложения, и вы удаляете приложение, постоянный объект удаляется. Как вы говорите, GUID разделяются между устройствами, и это один из способов, которыми приложения могут обмениваться данными, и существует удаленная возможность столкновения имен. –

+0

Правда - и я подумал о том, чтобы упомянуть об этом в своем ответе, но решил, что это может немного отойти от темы. –