【问题标题】:getting Null value from Persistent object从 Persistent 对象获取 Null 值
【发布时间】:2013-05-10 01:47:06
【问题描述】:

我正在尝试将用户的注册状态存储在我的应用中。我使用了持久存储。但我没有从商店获取数据。我写了以下代码:

package com.saiservices.util;

import java.util.Enumeration;

import com.saiservices.ui.Logger;


import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.util.Persistable;

public class SaiPersistentStore implements Persistable{

    private SaiHashTable mElements = null;
    static SaiPersistentStore instance;
    private static final long KEY = xxxxxxxxxxxx;
    private PersistentObject persistentObject = null;


    /**
     * Gets the single instance of DataBase.
     * 
     * @return single instance of DataBase
     */
    public static SaiPersistentStore getInstance() {
        try {
            if (instance == null) {
                instance = new SaiPersistentStore();
            }
        } catch (Exception e) {
            instance = null;
        }
        return instance;
    }


    private SaiPersistentStore()
    {
         Logger.out("PersistentStoreInfo", "inside constructor  ");
        persistentObject = PersistentStore.getPersistentObject(KEY);
         synchronized (persistentObject) 
           { 
               if (persistentObject.getContents() == null) 
               { 
                   persistentObject.setContents(new SaiHashTable()); 
                   persistentObject.commit(); 
               }  
           }

         mElements = (SaiHashTable)persistentObject.getContents();
         if (mElements == null){
             Logger.out("PersistentStoreInfo", "************"+(mElements == null));
             mElements = new SaiHashTable();
         }
    }


    public String getElement(String key)
    {
        Logger.out("PersistentStoreInfo", "getElement :"+key);
        Logger.out("PersistentStoreInfo", "getElement value   :"+mElements.get(key));

        return (String) mElements.get(key);
    }

    public void setElement(String key, String value)
    {
        Logger.out("PersistentStoreInfo", "setElement11111 :"+key + "   "+value);
        mElements.put(key, value);
        persistentObject.setContents(mElements);
        Logger.out("PersistentStoreInfo", "setElement22222 :"+key+"   "+value);
        persistentObject.commit(); 
    }

    public Enumeration getAllKeys() 
    {
        return mElements.keys();
    }

}

这里是哈希表代码:

package com.saiservices.util;

import java.util.Hashtable;

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

public class SaiHashTable extends Hashtable implements Persistable{

    public SaiHashTable(){
        super();
    }
    public SaiHashTable(int initialCepacity){
        super(initialCepacity);
    }

}

现在我像这样设置元素:

SaiPersistentStore.getInstance().setElement("Registration","on");

但是当我试图以这种方式获取元素时,得到空值:

 SaiPersistentStore.getInstance().getElement("Register")

我在哪里做错了?请帮忙。

【问题讨论】:

    标签: blackberry hashtable persistent-storage


    【解决方案1】:

    setElement() 方法中删除以下行:

        persistentObject.setContents(mElements);
    

    通过这样做,您将覆盖持久对象的内容,该对象之前是 SaiHashTable 对象。所以下次你尝试转换持久对象的内容时,你会得到一个异常,然后你会捕获并重置实例。

    您还应该尝试获得您设置的相同值:

    SaiPersistentStore.getInstance().getElement("Registration")

    【讨论】:

    • 我已经评论过了。但我仍然得到 null 的值。
    • 使用相同的键来获取值“注册”而不是“注册”。我已经改变了答案。
    • 天啊!现在我得到了。写了这么多代码后真是个错误。谢谢。
    • 第一个建议(删除对setContents()的调用)实际上不是问题,对吧?是他使用了不同的键名(你的第二个建议)?我认为在他的情况下调用setContents() 是不必要的,但我认为这不会造成任何伤害。 mElements其实就是原来的new SaiHashTable()实例,他第一次传给setContents(),所以应该没有效果。
    • 是的,问题主要是键值的拼写错误。和persistentObject.setContents(mElements);在这种情况下,这是必需的。但我观察到的是,在 getElement() 方法中,我需要检查哈希表中键的存在。如果不存在,则需要更改返回值。很快,我需要将其保留在我的论坛中。以便其他开发人员可以使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多