【问题标题】:Blackberry - application settings save/load黑莓 - 应用程序设置保存/加载
【发布时间】:2010-04-30 23:44:41
【问题描述】:

我知道两种保存/加载应用程序设置的方法:

  • 使用PersistentStore
  • 使用文件系统(存储,因为 SDCard 是可选的)

我想知道您在处理应用程序设置方面的做法是什么?

使用 PersistentStore 保存/加载应用程序设置

持久存储为对象提供了一种在设备重置后持久存在的方法。持久对象由键值对组成。当持久对象被提交到持久存储时,该对象的值通过深拷贝存储在闪存中。然后可以在稍后的时间点通过密钥检索该值。

用于存储和检索设置的帮助类示例:

class PSOptions {
    private PersistentObject mStore;
    private LongHashtableCollection mSettings;
    private long KEY_URL = 0;
    private long KEY_ENCRYPT = 1;
    private long KEY_REFRESH_PERIOD = 2;

    public PSOptions() {
        // "AppSettings" = 0x71f1f00b95850cfeL
        mStore = PersistentStore.getPersistentObject(0x71f1f00b95850cfeL);
    }

    public String getUrl() {
        Object result = get(KEY_URL);
        return (null != result) ? (String) result : null;
    }

    public void setUrl(String url) {
        set(KEY_URL, url);
    }

    public boolean getEncrypt() {
        Object result = get(KEY_ENCRYPT);
        return (null != result) ? ((Boolean) result).booleanValue() : false;
    }

    public void setEncrypt(boolean encrypt) {
        set(KEY_ENCRYPT, new Boolean(encrypt));
    }

    public int getRefreshPeriod() {
        Object result = get(KEY_REFRESH_PERIOD);
        return (null != result) ? ((Integer) result).intValue() : -1;
    }

    public void setRefreshRate(int refreshRate) {
        set(KEY_REFRESH_PERIOD, new Integer(refreshRate));
    }

    private void set(long key, Object value) {
        synchronized (mStore) {
            mSettings = (LongHashtableCollection) mStore.getContents();
            if (null == mSettings) {
                mSettings = new LongHashtableCollection();
            }
            mSettings.put(key, value);
            mStore.setContents(mSettings);
            mStore.commit();
        }
    }

    private Object get(long key) {
        synchronized (mStore) {
            mSettings = (LongHashtableCollection) mStore.getContents();
            if (null != mSettings && mSettings.size() != 0) {
                return mSettings.get(key);
            } else {
                return null;
            }
        }
    }
}

sample app screen http://img182.imageshack.us/img182/6348/appsettings.png

使用示例:

class Scr extends MainScreen implements FieldChangeListener {
    PSOptions mOptions = new PSOptions();

    BasicEditField mUrl = new BasicEditField("Url:",
            "http://stackoverflow.com/");
    CheckboxField mEncrypt = new CheckboxField("Enable encrypt", false);
    GaugeField mRefresh = new GaugeField("Refresh period", 1, 60 * 10, 10,
            GaugeField.EDITABLE|FOCUSABLE);
    ButtonField mLoad = new ButtonField("Load settings",
            ButtonField.CONSUME_CLICK);
    ButtonField mSave = new ButtonField("Save settings",
            ButtonField.CONSUME_CLICK);

    public Scr() {
        add(mUrl);
        mUrl.setChangeListener(this);
        add(mEncrypt);
        mEncrypt.setChangeListener(this);
        add(mRefresh);
        mRefresh.setChangeListener(this);
        HorizontalFieldManager hfm = new HorizontalFieldManager(USE_ALL_WIDTH);
        add(hfm);
        hfm.add(mLoad);
        mLoad.setChangeListener(this);
        hfm.add(mSave);
        mSave.setChangeListener(this);
        loadSettings();
    }

    public void fieldChanged(Field field, int context) {
        if (field == mLoad) {
            loadSettings();
        } else if (field == mSave) {
            saveSettings();
        }
    }

    private void saveSettings() {
        mOptions.setUrl(mUrl.getText());
        mOptions.setEncrypt(mEncrypt.getChecked());
        mOptions.setRefreshRate(mRefresh.getValue());
    }

    private void loadSettings() {
        mUrl.setText(mOptions.getUrl());
        mEncrypt.setChecked(mOptions.getEncrypt());
        mRefresh.setValue(mOptions.getRefreshPeriod());
    }
}

【问题讨论】:

    标签: blackberry application-settings datastore


    【解决方案1】:

    第三个选项:使用 RMS 进行简单的应用设置。

    虽然您建议的持久存储听起来不错,但它与任何其他 java 手机都不兼容,因此当您必须移植您的应用程序时,您必须重新创建这部分

    我在某处读到,仅在图片或视频的情况下才应在文件系统本身上创建文件,因此基本上用户也可以通过其他方式查看内容。

    【讨论】:

    • 谢谢!设备重置后是否可以访问 RMS 数据,就像使用持久存储一样?
    • 是的...它唯一无法幸存的两件事是重新安装应用程序(尽管安装程序会询问是否应该保存或清除 rms)。而且它也无法在设备恢复出厂设置后继续存在。
    • rms 代表记录管理存储,ibm.com/developerworks/library/wi-rms 必须搜索它
    • 啊...抱歉没有更清楚。感谢您提供一个不错的链接
    【解决方案2】:

    我们使用 PersistentStore,我可以确认即使在卸载并重新安装应用程序后数据仍然存在。

    更新:据我了解,如果你持久化一个非本地对象(即你创建一个 Hashtable 的子类并存储它),那么当你卸载你的应用程序,因为持久化的类不再有意义。

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多