我想知道是否有可能在j2me有2個或更多的記錄存儲在同一時間打開。我基本上希望能夠在代碼的相同執行中添加/刪除2個不同recordStore中的記錄。這可能嗎?是否可以在j2me中同時打開和編輯2個或更多的RecordStore?
如果是這樣,你會怎麼做?在班級的頂部,你可以做一些類似'私人RecordStore rs'的東西你需要有兩個這樣的實例才能使它工作,或者你可以用一個聲明來做到嗎?
在此先感謝。
我想知道是否有可能在j2me有2個或更多的記錄存儲在同一時間打開。我基本上希望能夠在代碼的相同執行中添加/刪除2個不同recordStore中的記錄。這可能嗎?是否可以在j2me中同時打開和編輯2個或更多的RecordStore?
如果是這樣,你會怎麼做?在班級的頂部,你可以做一些類似'私人RecordStore rs'的東西你需要有兩個這樣的實例才能使它工作,或者你可以用一個聲明來做到嗎?
在此先感謝。
從RecordStore javadoc:「一個MIDlet套件中的MIDlet被允許創建多個唱片店,只要它們分別賦予不同的名字。當一個MIDlet套件從平臺刪除了所有與它的MIDlet相關的唱片店會。 MIDlet套件中的MIDlet可以直接訪問彼此的記錄存儲。「
因此,您可以在MIDlet中操作多個記錄存儲。
下面是我有時與學生一起使用的示例(警告:此MIDlet中沒有UI:僅用於演示目的)。你可以看到使用一個或兩個變量並不重要。
package test;
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import javax.microedition.midlet。*; import javax.microedition.rms.RecordEnumeration; import javax.microedition.rms.RecordStore; import javax.microedition.rms.RecordStoreException;
公共類ExampleTwoRS擴展的MIDlet {
private final static String RS_BOYS_NAME = "boys";
private final static String RS_GIRLS_NAME = "girls";
public ExampleTwoRS() {
Person[] people = new Person[4];
people[0] = new Person("Angelina", false);
people[1] = new Person("Brad", true);
people[2] = new Person("Mirka", false);
people[3] = new Person("Roger", true);
try {
initData(people);
readData(RS_BOYS_NAME);
readData(RS_GIRLS_NAME);
} catch (RecordStoreException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void startApp() {
}
private void initData(Person[] people) throws RecordStoreException, IOException {
RecordStore rsBoys = null;
RecordStore rsGirls = null;
try {
rsBoys = RecordStore.openRecordStore(RS_BOYS_NAME, true);
rsGirls = RecordStore.openRecordStore(RS_GIRLS_NAME, true);
for (int i = 0; i < people.length; i++) {
byte[] data = people[i].toByteArray();
if (people[i].isMale()) {
rsBoys.addRecord(data, 0, data.length);
} else {
rsGirls.addRecord(data, 0, data.length);
}
}
} finally {
rsBoys.closeRecordStore();
rsGirls.closeRecordStore();
}
}
private void readData(String rsName) throws RecordStoreException, IOException {
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore(rsName, true);
int i = 0;
RecordEnumeration re = rs.enumerateRecords(null, null, true);
Person[] people = new Person[re.numRecords()];
while (re.hasNextElement()) {
people[i] = new Person();
people[i].fromByteArray(re.nextRecord());
System.out.println(rsName + ": " + people[i].toString());
i++;
}
} finally {
rs.closeRecordStore();
}
}
private void initNumbers() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
類Person { 私人字符串名稱; boolean male;
public Person() {
}
public Person(String name, boolean male) {
this.name = name;
this.male = male;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isMale() {
return male;
}
public void setMale(boolean male) {
this.male = male;
}
public void fromDataStream(DataInputStream dis) throws IOException {
this.name = dis.readUTF();
this.male = dis.readBoolean();
}
public void toDataStream(DataOutputStream dos) throws IOException {
dos.writeUTF(getName());
dos.writeBoolean(isMale());
}
public void fromByteArray(byte[] data) throws IOException {
ByteArrayInputStream bin = new ByteArrayInputStream(data);
DataInputStream din = new DataInputStream(bin);
fromDataStream(din);
din.close();
}
public byte[] toByteArray() throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
toDataStream(dout);
dout.close();
return bout.toByteArray();
}
public String toString() {
return name + (male ? " (b)" : " (g)");
}
}
我想補充一點,雖然規範當然允許單個MIDlet使用多個RecordStore,但它並不能證明它們都可以同時打開。這是一個開放解釋的分裂點,需要在實際的目標手機上進行測試。 – 2010-04-07 10:27:30
+1好站出來,謝謝。 – jalopaba 2010-04-07 11:27:11
如果你想要兩個的RecordStore實例是在同一時間打開,您不能使用兩個相同的變量。 – 2010-04-07 10:24:43