在codenameone存储中读取写入对象

时间:2012-12-17 14:43:13

标签: java-me storage lwuit codenameone

我正在开发一种基于codenameone的j2me应用程序。我实现了一些代码,现在我想将数据库添加到我的应用程序中。在搜索了很多之后,我发现了在移动应用程序中简化数据库概念的存储类codenameone。

在这个应用程序中,我为每个实体创建了一个类(如person,city,...)并添加" read"和"写"读写数据的方法。

某些实体类有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>();
    }
}

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

如何在Storage中编写一个对象并再次阅读?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以将VectorHashtable存储在存储空间中并尽可能深地嵌套,例如:

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

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

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