Удалить постоянный объект при удалении приложения в Blackberry - PullRequest
2 голосов
/ 27 января 2012

Я использую постоянный объект в 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?Спасибо

1 Ответ

7 голосов
/ 27 января 2012

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

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, который уникальным образом определяется его пакетом, вы гарантируете, что данные удаляются из постоянного хранилища при удалении приложения.

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

...