java-me - 在 codenameone 存储中读写对象

标签 java-me storage lwuit codenameone

我正在开发一个基于 codenameone 的 j2me 应用程序。我实现了一些代码,现在我想将数据库添加到我的应用程序中。经过大量搜索后,我找到了代号为 One 的存储类,它简化了移动应用程序中的数据库概念。

在此应用程序中,我为每个实体(如人、城市等)创建一个类,并添加“读取”和“写入”方法来读取和写入数据。

某些实体类有 2 个或更多字段。所以我必须使用 Storage 类来保存和读取它们。

我该怎么做?

这是我的示例代码:

package com.x.database;

import com.codename1.io.Storage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;

public class Person {

    public Person(){
    }
    public Person(int pID, String pPersonNumber){
        ID = pID;
        PersonNumber = pPersonNumber;
    }

    public static String PERSON = "Person";

    private Storage store;
    private int ID;

    public int getID(){
        return ID;
    }

    public void setID(int pID){
        ID = pID;
    }

    private String PersonNumber;

    public String getPersonNumber(){
        return PersonNumber;
    }

    public void setPersonNumber(String pPersonNumber){
        PersonNumber = pPersonNumber;
    }

    public int getLastKeyNumber(){
        if(store == null) {
            store = Storage.getInstance();
        }

        Hashtable depHash = (Hashtable)store.readObject(PERSON);
        ArrayList<String> keyArray = (ArrayList<String>)depHash.keys();

        int i = 0;
        for (Iterator<String> it = keyArray.iterator(); it.hasNext();) {
            int tmp = Integer.parseInt(it.next());
            i = i < tmp ? tmp : i;
        }

        return i;
    }

    public void write(Person pPerson){
        if(store == null) {
            store = Storage.getInstance();
        }

        if(!store.exists(PERSON)) {
            Hashtable depHash = new Hashtable();
            try {
                depHash.put("0", pPerson);
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
            store.writeObject(PERSON, depHash);
        }
        else {
            Hashtable depHash = (Hashtable)store.readObject(PERSON);

            ArrayList<Person> depArray = (ArrayList<Person>)depHash.keys();

            for (Iterator<Person> it = depArray.iterator(); it.hasNext();) {
                Person tmp = it.next();

                if(!tmp.getPersonNumber().equals(pPerson)) {
                    depHash.put(String.valueOf(getLastKeyNumber()), pPerson.getPersonNumber());
                    store.writeObject(Person depHash);
                }
            }
        }
    }

    public ArrayList<Person> readAll(){
        Storage store = Storage.getInstance();

        if(!store.exists(PERSON)) {
            Hashtable depHash = (Hashtable)store.readObject(PERSON);

            return (ArrayList<Person>)depHash.elements();
        }
        return new ArrayList<Person>();
    }
}

在此代码中,我在存储上写入和读取对象时出现错误。

如何在存储中写入一个对象并再次读取它?

提前致谢。

最佳答案

您可以在存储中存储 VectorHashtable 并将它们嵌套到您喜欢的深度,例如:

Vector v = new Vector();
Hashtable content = new Hashtable();
content.put("A", ...);
content.put("B", ...);
v.addElement(content);

等等...您可以添加更多哈希值,它们可以包含字符串、数字或字节数组。

或者,您可以实现 Codename OneExternalized 接口(interface),该接口(interface)允许您将任意类写入存储。但这提出了一个要求,您需要调用 Util.register 来注册可外部化的类名。提示者演示中有一个这样的示例。

关于java-me - 在 codenameone 存储中读写对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916271/

相关文章:

php - 以可逆形式存储密码

javascript - 当我使用 XMLHttpRequest 和 SAS 将图像放入 azure blob 存储时格式错误

java - lwuit向导并部署

java - LWUIT HtmlComponent 渲染本地镜像

java - 如何生成 JSR-172 stub

http - (HttpConnection) Connector.open(url) 与触摸电话

blackberry - 如何以编程方式删除 BlackBerry 中的服务预订?

objective-c - Objective C 属性变量和非属性变量的存储

java - 我们如何在ubuntu os中通过j2me代码打开浏览器?

java-me - 使用 LWUIT 的饼图、条形图和图表