Удалить постоянный объект при удалении приложения в Blackberry

Я использую постоянный объект в Blackberry для хранения деталей конфигурации, специфичных для приложения. Вот как я реализую класс

public class Preferences implements Persistable
{
    private static  PersistentObject persistentObject = PersistentStore.getPersistentObject(0x2759d6ff72264bdbL);
    private static Hashtable tbl = new Hashtable();

    public static void storeLoginToken(String token)
    {
        token = removeCharAt(token,0);
        token = removeCharAt(token,token.length()-1);
        tbl.put("token", token);
        persistentObject.setContents(tbl);
        persistentObject.commit();
    }

    public static String getLoginToken()
    {
        Hashtable tbl = (Hashtable)persistentObject.getContents();
        try
        {
            String token = tbl.get("token").toString();
            System.out.println("Token = "+token);
            return token;
        }
        catch(Exception e)
        {
            return null;
        }

    }
}

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

Как я могу сделать это правильно в Blackberry? Спасибо


person Zach    schedule 27.01.2012    source источник
comment
После удаления приложения иногда устройство не запрашивает перезагрузку; Если вы перезагрузите устройство перед установкой того же приложения, проблема должна быть решена; Проблемы с не удаленным постоянным объектом чаще всего возникают на устройствах Blackberry версии 5.0; какую версию вы используете?   -  person alishaik786    schedule 27.01.2012


Ответы (1)


Создайте собственный класс хэш-таблицы, подобный этому

package com.myapp.items;


import net.rim.device.api.util.Persistable;

import java.util.*;

public class MyAppHashtable extends Hashtable implements Persistable{

}  

И измените свой код на

public class Preferences
{
    private static  PersistentObject persistentObject = PersistentStore.getPersistentObject(0x2759d6ff72264bdbL);
    private static MyAppHashtable tbl = new MyAppHashtable ();

    public static void storeLoginToken(String token)
    {
        token = removeCharAt(token,0);
        token = removeCharAt(token,token.length()-1);
        tbl.put("token", token);
        persistentObject.setContents(tbl);
        persistentObject.commit();
    }

    public static String getLoginToken()
    {
        MyAppHashtable tbl = (MyAppHashtable )persistentObject.getContents();
        try
        {
            String token = tbl.get("token").toString();
            System.out.println("Token = "+token);
            return token;
        }
        catch(Exception e)
        {
            return null;
        }

    }
}

Это сделано для того, чтобы мы придерживались следующей информации от RIM.

Модель постоянства BlackBerry

При использовании модели сохраняемости BlackBerry данные удаляются только в том случае, если в хранилище содержатся данные, принадлежащие удаленному приложению.

Например, если приложение хранит объект с пакетом под названием com.mycompany.application.storage и никакое другое приложение на смартфоне BlackBerry не ссылается на этот пакет, постоянное хранилище и удаленное приложение удаляются.

То же самое верно, если объект заключен в контейнер, такой как Vector. Даже если только один из элементов Vector имеет имя пакета, которое не используется другими приложениями, весь Vector удаляется из постоянного хранилища.

Примечание. Если приложение не хранит никаких объектов с идентифицирующей структурой пакета (например, приложение, которое хранит объекты java.util.Vector или javax.microedition.location.AddressInfo), приложение должно создать и использовать класс, расширяющий Vector, чтобы определить, что Vector принадлежит к данное приложение. Когда вы сохраняете этот Vector, который однозначно идентифицируется его пакетом, вы гарантируете, что данные будут удалены из постоянного хранилища при удалении приложения.

Это информация отсюда

person rfsk2010    schedule 27.01.2012
comment
Спасибо за Ваш ответ. Я реализовал это, как вы сказали. Но MyAppHashtable tbl = (MyAppHashtable) persistentObject.getContents (); выбрасывает исключение приведения класса. Любая идея? - person Zach; 27.01.2012
comment
Да, потому что вы читаете старые значения, которые сохраняются как хеш-таблица. Очистить постоянное хранилище. удалить все значения и удалить магазин. а затем повторите попытку. Он должен работать. - person rfsk2010; 27.01.2012
comment
Если вы тоже можете взглянуть на это, пожалуйста, stackoverflow.com/q/9093706/623401. было бы здорово. - person Zach; 01.02.2012
comment
@ rfsk2010. Я действительно благодарен за эту руководящую линию. Я просматриваю ваше предложение, но когда я удаляю приложение из симулятора и снова запускаю, предпочтение не удаляется, и оно дает мне предыдущее сохраненное значение. ? в чем может быть ошибка? я должен испытать этот случай на устройстве? - person Hitarth; 28.09.2012