Приложение в JaveME с использованием RMS

Я пытаюсь написать приложение в Jave ME с RMS. Приложение хранит информацию о клиенте курьера.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;

public class ClientsApp extends MIDlet implements CommandListener {
// controls
private Display screen = null; 
private List menu = null;
private Form addClientForm = null;
private Form showClientForm = null;
private RecordStore clients;
private ByteArrayOutputStream stream = null;
private DataOutputStream out = null;
private byte[] dates;

TextField name = null;
TextField surname = null;
TextField email = null;
TextField phone = null;
DateField date = null;
TextField price = null;
TextField description = null;


// comands
private final Command backCommand;
private final Command mainMenuCommand;
private final Command exitCommand; 
private final Command addClientCommand;

public ClientsApp() {
    // initializating controls and comands
    menu = new List("Lista klientów", Choice.IMPLICIT);
    backCommand = new Command("Cofnij", Command.BACK, 0);
    mainMenuCommand = new Command("Main", Command.SCREEN, 1);
    exitCommand = new Command("Koniec", Command.EXIT, 2);
    addClientCommand = new Command("Zapisz", Command.OK, 3);    
    stream = new ByteArrayOutputStream();
    out = new DataOutputStream(stream);

    menu.append("Dodaj klienta", null);
    menu.append("Przegladaj klientow", null);
    menu.append("Usun klienta", null);
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}

protected void pauseApp() {

}

protected void startApp() throws MIDletStateChangeException {
    screen = Display.getDisplay(this);
    screen.setCurrent(menu);

    try {
        clients = RecordStore.openRecordStore("clients", false, RecordStore.AUTHMODE_PRIVATE, false);
    }
    catch(RecordStoreException exc) {
    }

    menu.addCommand(exitCommand);
    menu.setCommandListener(this);
}

public void commandAction(Command cmd, Displayable dsp) {
    if(cmd.getCommandType() == Command.EXIT) {
        try{
            destroyApp(false);
            notifyDestroyed();
        }
        catch(Exception exc) {
            exc.printStackTrace();              
        }
    }
    else if(cmd.getCommandType() == Command.BACK) {
        screen.setCurrent(menu);
    }
    else if(cmd.getCommandType() == Command.OK) {
        try {
            out.writeUTF(name.getString());
            out.writeUTF(surname.getString());
            out.writeUTF(email.getString());
            out.writeUTF(phone.getString());
            out.writeUTF(date.getDate().toString());
            out.writeUTF(price.getString());
            out.writeUTF(description.getString());
            dates = stream.toByteArray();

            clients.addRecord(dates, 0, dates.length);

            stream.close();
            out.close();
            clients.closeRecordStore();
        }
        catch(Exception exc) {

        }
    }
    else {
        List option = (List) screen.getCurrent();

        switch(option.getSelectedIndex()) {
        case 0 : {
            addClients();
            break;
        }
        case 1 : {
            showClients();
            break;
        }
        case 2 : {
            deleteClients();
            break;
        }
        }
    }
}

protected void addClients() {
    addClientForm = new Form("Dodaj klienta");
    name = new TextField("Imię klienta", "", 10, TextField.ANY);
    surname = new TextField("Nazwisko klienta", "", 15, TextField.ANY);
    email = new TextField("Email klienta", "", 20, TextField.EMAILADDR);
    phone = new TextField("Numer telefonu", "", 12, TextField.PHONENUMBER);
    date = new DateField("Data dostarczenia", DateField.DATE);
    price = new TextField("Do zapłaty", "", 6, TextField.NUMERIC);
    description = new TextField("Uwagi", "", 50, TextField.ANY);

    addClientForm.append(name);
    addClientForm.append(surname);
    addClientForm.append(email);
    addClientForm.append(phone);
    addClientForm.append(date);
    addClientForm.append(price);
    addClientForm.append(description);
    screen.setCurrent(addClientForm);

    addClientForm.addCommand(backCommand);
    addClientForm.addCommand(addClientCommand);
    addClientForm.setCommandListener(this);
}

protected void showClients() {
    TextBox info = new TextBox("Klienci", null, 100, 0);

    RecordEnumeration iterator = null;
    String str = null;
    byte[] temp = null;

    try {
        iterator = clients.enumerateRecords(null, null, false);

        while(iterator.hasNextElement()) {
            temp = iterator.nextRecord();
        }

        for(int i = 0; i < temp.length; i++) {
            str += (char) temp[i];
        }
        System.out.println(str);
        clients.closeRecordStore();
    }
    catch(Exception exc) {

    }       

    info.setString(str);
    screen.setCurrent(info);
}
}

Запись/чтение информации из RecordStore не работает. У меня нет исключения. Может ли кто-нибудь помочь мне?

PS Извините за ненормативную лексику.


person user2316721    schedule 31.03.2014    source источник


Ответы (1)


Вы уверены, что не получаете никаких исключений? Блоки захвата пусты... Я вижу несколько проблем: Не следует ли открывать хранилище записей с параметром createIfNecessary (2-й параметр), установленным в значение true? В методе ShowClients вы должны использовать DataInputStream для чтения элементов из записи (массив байтов «temp»), цикл по temp странный. Также отсутствует проверка на нулевой «temp», чтобы избежать NPE, когда хранилище пусто. По команде OK, а также в ShowClients хранилище закрывается, так что в следующий раз, я думаю, произойдет сбой с RecordStoreNotOpenException.

Я бы также подумал о сбросе исходящего потока перед вызовом stream.toByteArray(), хотя в этом случае (DataOutputStrea/ByteArrayOutputStream) это не что иное, как хорошая практика.

person Ales    schedule 15.04.2014