【问题标题】:read write object in codenameone storage代号存储中的读写对象
【发布时间】:2012-12-19 18:18:19
【问题描述】:

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

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

某些实体类有 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 中写入一个对象并再次读取它?

提前致谢。

【问题讨论】:

    标签: java-me storage lwuit codenameone


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢Shai,我会照你说的试试。
    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多