J2Me работает со списком - PullRequest
       33

J2Me работает со списком

2 голосов
/ 03 марта 2012

Я пытаюсь "обернуть" класс javax.microedition.lcdui.List в класс MyList, я просто хочу использовать свои собственные методы добавления, редактирования, удаления (также getSelectedFlags, но из суперкласса).

Я также хочу управлять вещами recordStore, но я обнаружил, что индексация в 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 Ответ

4 голосов
/ 03 марта 2012

Идентификаторы записи - это уникальные идентификаторы, которые добавляются вместе со вставленными данными системой управления правами. Идентификатор записи равен 1 для первой записи и увеличивается на единицу при каждом добавлении новой записи. Если какая-либо запись будет удалена из хранилища записей, идентификаторы записей не будут сброшены в последовательном порядке. Эта удаленная запись и ее идентификатор будут потеряны навсегда. Мы не можем повторно использовать идентификатор удаленной записи. То есть, если у нас есть три строки в таблице с идентификаторами 1, 2 и 3, удаление идентификатора 2 навсегда удалит этот идентификатор из хранилища записей. А записи с идентификаторами 1,3 останутся в хранилище записей. Если бы мы добавьте еще одну строку в эту таблицу, она будет иметь идентификатор 4. Таким образом, когда вы удаляете запись с идентификатором 1, идентификатор первой не удаленной записи будет равен 2.
Я обычно открываю хранилище записей, читаю его данные и записываю их в вектор, затем удаляю, вставляю ... записи в вектор (вместо хранилища записей) и, наконец, записываю оставшиеся записи в (даже новый) хранилище записей.
Ссылки:
http://www.ibm.com/developerworks/library/j-j2me3/
http://www.j2mesalsa.com/elearning/rms.html

...