予定の表示・保存(2)〜スケジュール管理ソフトをS!アプリで作ってみよう(その13)

前回の続き。

Eventsクラスを作り、そこで予定の保存を行うようにする


package com.ettem.scheduler;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;

import javax.microedition.rms.InvalidRecordIDException;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreNotOpenException;

/**
* 予定をRecordStoreクラスとやり取りする。
*
*/
public class Events {
static private RecordStore scheduleRecordStore;

static void setRecordStore(RecordStore scheduleRecordStore) {
Events.scheduleRecordStore = scheduleRecordStore;
}

static Event getNewEvent() {
return new Event();
}

static Event getNewEvent(Date date) {
return new Event(date);
}

static void setEvent(Event event) {
try {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
DataOutputStream dOut = new DataOutputStream(bOut);

dOut.writeLong(event.startTime.getTime());
dOut.writeLong(event.endTime.getTime());

addStringField(event.what, dOut);
addStringField(event.where, dOut);
addStringField(event.discription, dOut);

byte record[] = bOut.toByteArray();
if (event.recordID == Event.newRecordID) {
scheduleRecordStore.addRecord(record, 0, record.length);
} else {
scheduleRecordStore.setRecord(event.recordID, record, 0, record.length);
}

dOut.close();
bOut.close();
} catch (RecordStoreException e) {

} catch (IOException e) {
// あり得ないはずだが...
}
}

static Event getEvent(int recordID) {
Event event = new Event();

try {
ByteArrayInputStream bIn = new ByteArrayInputStream(scheduleRecordStore.getRecord(recordID));
DataInputStream dIn = new DataInputStream(bIn);

event.startTime = new Date(dIn.readLong());
event.endTime = new Date(dIn.readLong());

event.what = getStringField(dIn);
event.where = getStringField(dIn);
event.discription = getStringField(dIn);

dIn.close();
bIn.close();
} catch (InvalidRecordIDException e) {

} catch (RecordStoreException e) {

} catch (IOException e) {
// あり得ないはずだが...
}

return event;
}

static Event[] getEvents(final Date date) {
Event[] events = new Event[0];

try {
RecordEnumeration recEnum = scheduleRecordStore.enumerateRecords(
new DateRecFilter(date), new DateComparator(), false);

int numRecords = recEnum.numRecords();
events = new Event[numRecords];

for (int i = 0; i < numRecords; i++) {
events[i] = Events.getEvent(recEnum.nextRecordId());
}
} catch (RecordStoreNotOpenException e) {

} catch (InvalidRecordIDException e) {

}

return events;
}

private static void addStringField(String str, DataOutputStream dOut) {
try {
byte bStr[] = str.getBytes("UTF8");
dOut.writeInt(bStr.length);
dOut.write(bStr, 0, bStr.length);
} catch (UnsupportedEncodingException e) {

} catch (IOException e) {

}
}

private static String getStringField(DataInputStream dIn){
String field = new String();

try {
int fieldLen = dIn.readInt();
byte bField[] = new byte[fieldLen];
dIn.read(bField, 0, fieldLen);
field = new String(bField, "UTF8");
} catch (IOException e) {

}

return field;
}
}

予定のRecordStoreから、指定された日の予定をフィルターするクラスを作成する。


package com.ettem.scheduler;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import javax.microedition.rms.RecordFilter;

public class DateRecFilter implements RecordFilter {
private Date selectedDate;

public DateRecFilter(Date selectedDate) {
this.selectedDate = selectedDate;
}

public boolean matches(byte[] record) {
ByteArrayInputStream bIn = new ByteArrayInputStream(record);
DataInputStream dIn = new DataInputStream(bIn);

Date startTime = new Date();
Date endTime = new Date();
try {
startTime = new Date(dIn.readLong());
endTime = new Date(dIn.readLong());

dIn.close();
bIn.close();
} catch (IOException e) {

}

Calendar cal = Calendar.getInstance();
cal.setTime(startTime);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
startTime = cal.getTime();

cal.setTime(endTime);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
endTime = cal.getTime();

return (startTime.getTime() < selectedDate.getTime()
&& selectedDate.getTime() < endTime.getTime());
}
}

予定をフィルターした後の順番を決めるためのComparetorクラスも作成する。


package com.ettem.scheduler;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Date;

import javax.microedition.rms.RecordComparator;

public class DateComparator implements RecordComparator {

public int compare(byte[] rec1, byte[] rec2) {
ByteArrayInputStream bIn;
DataInputStream dIn;

Date startTime1 = new Date();
Date startTime2 = new Date();

try {
bIn = new ByteArrayInputStream(rec1);
dIn = new DataInputStream(bIn);

startTime1 = new Date(dIn.readLong());
dIn.close();
bIn.close();

bIn = new ByteArrayInputStream(rec2);
dIn = new DataInputStream(bIn);

startTime2 = new Date(dIn.readLong());
dIn.close();
bIn.close();
} catch (IOException e) {

}

if (startTime1.getTime() < startTime2.getTime()) {
return RecordComparator.PRECEDES;
} else {
return RecordComparator.FOLLOWS;
}
}

}

こんな感じで、予定の保存と表示は完了。って、表示は、件名だけしか表示されないし、保存した後で修正できないし、こんなんで良いのだろうか? 後でブラッシュアップしないと... 今は、とにかく機能の実装を優先したいので、このままで。