【问题标题】:Delete Persistent Object when app is Deleted in Blackberry在黑莓中删除应用程序时删除持久对象
【发布时间】:2012-02-20 11:51:35
【问题描述】:

我在黑莓中使用持久对象来存储特定于应用程序的配置详细信息。这是我如何实现类

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;
        }

    }
}

但如果我卸载/删除应用程序,这些存储的值不会被删除。当我下次安装该应用程序时,该应用程序正在获取旧的存储值。

如何在黑莓中正确执行此操作? 谢谢

【问题讨论】:

  • 删除您的应用程序后,有时设备不会要求重新启动;如果您在安装相同的应用程序之前重新启动设备,那么问题应该可以解决; “持久对象未删除”问题多发生在黑莓5.0版本的设备上;你用的是哪个版本?

标签: blackberry persistent-storage


【解决方案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.Vectorjavax.microedition.location.AddressInfo 对象的应用程序),应用程序应创建并使用扩展Vector 的类为了识别Vector 属于给定的应用程序。当您存储此 Vector(由其包唯一标识)时,您可以保证在删除应用程序时从持久存储中删除数据。

这个info is from here

【讨论】:

  • 感谢您的回答。我按照你说的实现了。但是 MyAppHashtable tbl = (MyAppHashtable )persistentObject.getContents();正在抛出类强制转换异常。有什么想法吗?
  • 是的,那是因为您正在读取保存为哈希表的旧值。清除持久存储。删除所有值并删除存储。然后重试。它应该可以工作。
  • 如果你也可以看看这个,请stackoverflow.com/q/9093706/623401。会很棒的。
  • @rfsk2010 。我真的很喜欢这条指南。我通过了您的建议,但是当我从模拟器中删除应用程序并再次运行时,首选项不删除,它给了我以前的存储值。 ?可能是什么错误?我必须在设备中测试那个案例?
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多