2013-04-01 2 views
1

У меня есть приложение BlackBerry, которое запускается (загрузка приложения) с помощью экрана регистрации, когда приложение впервые установлено. Позже приложение загрузится с главного экрана. Экран регистрации появляется только при первой загрузке. Я достигаю этого, сохраняя значение boolean в PersistentStore. Если это значение существует, то экран регистрации не появится.Удалить Постоянное Сохранять данные, когда приложение удалено или удалено

PersistentStoreHelper.persistentHashtable.put("flagged",Boolean.TRUE); 
PersistentStoreHelper.persistentObject.commit(); 
UiApplication.getUiApplication().pushScreen(new MyScreen()); 

Я отдаю себе отчет в том, что для того, чтобы удалить Persistent магазина на удаление/удаления приложения, я должен сделать Хеш подкласс моих и поэтому я объявил Hashtable в отдельном классе :

public class PersistentStoreHelper extends Hashtable implements Persistable{ 

    public static PersistentObject persistentObject; 
    public static final long KEY = 0x9df9f961bc6d6daL; 
    public static Hashtable persistentHashtable; 

} 

Однако это не помогло и значение флага boolean не очищается от PersistentStore. Пожалуйста посоветуй.


EDIT: Когда я изменяю выше PersistentStoreHelper класс

public static PersistentObject persistentObject = 
    PersistentStore.getPersistentObject(KEY); 

и удалить

PersistentStoreHelper.persistentObject = 
    PersistentStore.getPersistentObject(PersistentStoreHelper.KEY); 

из класса B, где boolean значение спасаемых, я замечаю, что значение boolean удаляется каждый раз, когда приложение закрывается. Этого не должно произойти, и значение должно быть удалено только в том случае, если приложение будет удалено/удалено. Любые указатели?

ответ

1

Как это работает, BlackBerry OS смотрит на объекты, которые вы храните в PersistentStore. Если он распознает, что эти объекты могут использоваться только вашим приложением, он удалит их при удалении приложения. Однако, если классы хранимых объектов являются классами, которые используются другими приложениями, то ваши данные будут удалены не.

Вы объявили свой вспомогательный класс, как это:

public class PersistentStoreHelper extends Hashtable implements Persistable{ 

но вспомогательный класс не то, что в настоящее время сохраняется. Ваш вспомогательный класс - это только помощник, который хранит для вас другие вещи. В вашем случае, это хранение этого:

public static Hashtable persistentHashtable; 

но, что объект типа java.util.Hashtable, который является класс, используемый многими приложениями. Поэтому при удалении приложения он не будет удален. То, что вы должны сделать, это что-то вроде этого:

public class PersistentStoreHelper implements Persistable { // so inner class = Persistable 

    public static PersistentObject persistentObject; 
    public static final long KEY = 0x9df9f961bc6d6daL; 
    /** 
     * persistentHashtable is now an instance of a class that 
     * only exists in your app 
     */ 
    public static MyAppsHashtable persistentHashtable; 

    private class MyAppsHashtable extends Hashtable implements Persistable { 
     // don't need anything else ... the declaration does it all! 
    } 
} 

Я не могу видеть его здесь, но я предполагаю, что где-то есть этот код:

persistentObject = PersistentStore.getPersistentObject(KEY); 

и тогда, когда вы хотите сохранить данные обратно в магазин, вы делаете что-то вроде этого;

persistentHashtable.put("SomeKey", someNewData); 
persistentObject.setContents(persistentHashtable); 
persistentObject.commit(); 

просто добавить данные в persistentHashtable не спасает его (постоянно). Надеюсь, у вас уже была эта часть.


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

persistentHashtable = (MyAppsHashtable)persistentObject.getContents(); 

, так как последняя версия кода не использовал класс MyAppsHashtable, поэтому загруженные данные не будут такого типа. Это одна из причин того, что это важно в первый раз. В общем, я всегда задерживаю сохранение данных в PersistentStore, которые содержатся в одном верхнем уровне Hashtableподкласс, который реализует Persistable. Я могу позже изменить то, что в нем, но я никогда не изменю подпись этого объекта верхнего уровня. Надеюсь, вы уже не выпустили свое приложение.


Update: В ответ на Ваш комментарий/вопрос ниже:

if (PersistentStoreHelper.persistentObject.getContents() == null) { 
    PersistentStoreHelper.persistentHashtable = new MyAppsHashtable();  
    PersistentStoreHelper.persistentObject.setContents(PersistentStoreHelper.persist‌entHashtable); 
} else { 
    PersistentStoreHelper.persistentHashtable = 
     (MyAppsHashtable)PersistentStoreHelper.persistentObject.getContents(); 
} 
+0

Спасибо @Nate. Я пытаюсь это сделать. Раньше я вызывал следующий способ getContents: 'if (PersistentStoreHelper.persistentObject.getContents() == null) { \t PersistentStoreHelper.persistentHashtable = new Hashtable(); \t PersistentStoreHelper.persistentObject.setContents (PersistentStoreHelper.persistentHashtable); } else { \t PersistentStoreHelper.persistentHashtable = (Hashtable) PersistentStoreHelper. persistentObject.getContents(); ' \t} Я не могу редактировать:' persistentHashtable = (MyAppsHashtable) persistentObject.getContents(); 'Как это сделать? – Sarah

+0

@Sarah, см. Мое второе обновление в ответе выше. Благодарю. – Nate

+0

Я работаю с Редактированием, но не помогал; Я получаю несоответствие типа: 'Невозможно преобразовать из Hashtable в PersistentStoreHelper.MyAppsHashtable'. Не могли бы вы помочь? EDIT: проблема теперь находится в 'PersistentStoreHelper.persistentObject.setContents (PersistentStoreHelper.persistentHashtable);'. Эта строка дает ошибку: persistentHashtable не может быть разрешен или не является полем. – Sarah

Смежные вопросы