j2me使用列表

时间:2012-03-03 07:44:30

标签: java java-me midp lcdui recordstore

我正在尝试将javax.microedition.lcdui.List类“包装”到MyList类中,我只想使用自己的追加,编辑,删除方法(也来自超类的getSelectedFlags)。

我也想管理recordStore的东西,但是我发现List中的索引对我来说很奇怪,当我删除列表的第一个元素等时,所有元素的索引都会减少(不确定它到底在做什么)。

我找到了解决方案,其中我将东西保存到vector中,它具有与List类似的行为,但我不想将内容保存在矢量中,也不想保存在recordStore中。

package hello;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

public class ListOfPersons extends List {

    RecordStore rs;
    Hashtable hash;

    public ListOfPersons(String title) {
        super(title, List.IMPLICIT);
        hash = new Hashtable();
        this.loadAllRecords();
    }

    public void delete(int elementNum) {
        Integer rsID = (Integer) hash.get(new Integer(elementNum));
        openRS();
        try {
            rs.deleteRecord(rsID.intValue());
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
        closeRS();

        hash.remove(new Integer(elementNum));
        super.delete(elementNum);
    }

    public Person getSelectedPerson() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public int append(Person element) {
        Integer idList, idRecord = null;
        openRS();
        idList = new Integer(super.append(element.toString(), null));

        byte[] b;
        try {
            b = element.storeToBytes();
            idRecord = new Integer(rs.addRecord(b, 0, b.length));
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            closeRS();
        }
        hash.put(idList, idRecord);
        return idList.intValue();
    }

    private void loadAllRecords() {
        Integer idList, idRecord;
        Person p;
        openRS();
        try {
            RecordEnumeration re = rs.enumerateRecords(null, null, true);
            while (re.hasNextElement()) {
                p = new Person();
                idRecord = new Integer(re.nextRecordId());
                byte[] b = rs.getRecord(idRecord.intValue());
                p.loadFromBytes(b);
                idList = new Integer(super.append(p.toString(), null));
                hash.put(idList, idRecord);
            }
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeRS();
        }


    }

    private void openRS() {
        try {
            rs = RecordStore.openRecordStore("Users", true);
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }

    private void closeRS() {
        try {
            rs.closeRecordStore();
        } catch (RecordStoreNotOpenException ex) {
            ex.printStackTrace();
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }  
}

1 个答案:

答案 0 :(得分:4)

记录ID是与RMS系统插入的数据一起添加的唯一标识符。第一条记录的记录ID为1,每增加一条新记录,记录ID增加1。如果从记录存储中删除任何记录,记录ID将不会按顺序重置。此删除的记录及其ID将永久丢失。我们无法重复使用已删除的记录ID。也就是说,如果我们在ID为1,2和3的表中有三行,则删除ID 2将永久地从记录存储中删除此标识符。ID为1,3的记录将保留在recordstore中。如果我们是在此表中添加另一行,它的标识符为4.因此,当您删除ID为1的记录时,第一个未删除的记录'ID将为2.
我经常打开记录库,读取它的数据并将它们写入一个向量然后删除,插入,...记录在向量(而不是记录库)中,最后将剩余的记录写入(甚至是新的)记录库。
参考文献:
http://www.ibm.com/developerworks/library/j-j2me3/
http://www.j2mesalsa.com/elearning/rms.html