DataStoreは、fileNameプロパティに従ってファイルを作成します。新規にDataStoreファイルを作成するには、create()メソッドを用います。以下は、ファイルが存在しなければ作成するコードの例です。
if (!(new java.io.File(dataStore1.getFileName()).exists()))
dataStore1.create();
既存のファイルを破棄し、常に新しいDataStoreファイルを作成したい場合は、以下のようにします。
File storeFile = new java.io.File(dataStore1.getFileName());
if (storeFile.exists())
storeFile.delete();
dataStore1.create();
DataStoreコンポーネントは、任意のオブジェクトの格納庫として利用できます。オブジェクトの保管には、writeObject()メソッドを使います。このメソッドは2つの引数をとります。最初の引数は、Stringです。ここには、StoreNameつまり、オブジェクトを保管する一意の名前を付けます。2番目の引数には、保管するオブジェクトを指定します。次の例は、EmployeeオブジェクトをDataStoreに保管する例です。
Employee emp = new Employee();
try {
dataStore1.writeObject("EMPLOYEE1", emp);
}
catch (Exception ex){
}
保管されたオブジェクトは、名前によって管理されます。readObject()メソッドは、StoreNameによってDataStoreに保管されたオブジェクトを取り出します。
try {
Object obj = dataStore1.readObject("EMPLOYEE1");
textControl1.setText(obj.toString());
}
catch (Exception ex){
}
DataStoreでは、ファイルシステムによって、複数のオブジェクトなどを格納、管理します。このファイルシステム、すなわちディレクトリ情報へのアクセスは、openDirectory()メソッドによって可能です。openDirectory()は、borland.jbcl.dataset.StorageDataSetオブジェクトでディレクトリ情報を返します。
borland.jbcl.dataset.StorageDataSetは、JBuilderのデータベースアクセス機能を提供するDataExpressのコンポーネントです。つまり、DataStoreのディレクトリ情報には、DataExpressのテーブルの形式でアクセスできます。
StorageDataSetを使用するには、borland.jbcl.datasetパッケージをインポートします。
import borland.jbcl.dataset.*;
openDirectory()は、以下の列を持ったデータセットを返します。
Table 1 ディレクトリ情報に含まれる列
列 |
型 |
説明 |
State |
short |
ストリームの状態を表わす定数(~_STATE)を保持 |
DeleteTime |
long |
ストリームが削除されたUTC時間 |
StoreName |
String |
ストリームの192バイトの名前 |
Type |
short |
ストリームの種別を表わす定数(~_STREAM)を保持 |
Id |
int |
ストリームの一意な識別子 |
Properties |
String |
DataSet ストリームの持続プロパティ/イベント |
ModTime |
long |
ストリームが変更された最後のUTC時間 |
Length |
long |
ストリームの長さ(バイト数) |
BlobLength |
long |
テーブルストリームのBLOBの長さ(バイト数) |
|
|
|
例えば、ListControlにDataStoreのディレクトリ情報を表示するには、以下のようなコードを記述します。
gridControl1.setDataSet(dataStore1.openDirectory());
GridControlを用いれば、すべての情報を表示できます。ただし、StoreName以外の列のvisibleプロパティはデフォルトでfalseになっています。すべての情報を表示するには、以下のように、各列のvisibleプロパティに対し、borland.jbcl.util.TriStateProperty.TRUEを設定します。
try {
StorageDataSet dir = dataStore1.openDirectory();
for (int i = 0; i < dir.getColumnCount(); i++)
dir.getColumn(i).setVisible(
borland.jbcl.util.TriStateProperty.TRUE);
gridControl1.setDataSet(dir);
}
catch (Exception ex){
}
borland.jbcl.util.TriStatePropertyは、DEFAULT、FALSE、TRUEの3つの値を保持できるプロパティを実装するために使用されるインターフェースです。
各列の名称は、borland.datastore.DataStoreクラスで定義されています。
Table 2 DataStoreクラスで定義された列名定数
定数 |
値 |
DIR_ACCESS |
(将来の使用のために予約) |
DIR_BLOB_LENGTH |
BlobLength |
DIR_DEL_TIME |
DelTime |
DIR_ID |
Id |
DIR_LENGTH |
Length |
DIR_MOD_TIME |
ModTime |
DIR_PROPERTIES |
Properties |
DIR_STATE |
State |
DIR_STORE_NAME |
StoreName |
DIR_TYPE |
Type |
|
|
コードによって、ディレクトリ情報にアクセスするには、StorageDataSetの以下のようなレコード操作のメソッドを用います。
Table 3 StorageDataSetのレコード移動メソッド
メソッド |
説明 |
first() |
最初のレコードに移動します |
next() |
次のレコードに移動します |
prior() |
前のレコードに移動します |
last() |
最後のレコードに移動します |
inBounds() |
次のレコードに移動できるかどうかを返します |
locate() |
レコードを検索します |
lookup() |
条件に一致するレコードの内容を取得します |
|
|
次の例は、コードによってディレクトリ情報にアクセスし、その結果をTreeControlに表示するものです。
try {
// ディレクトリ情報を取得
StorageDataSet dir = dataStore1.openDirectory();
// TreeControlのルート項目を設定
GraphLocation root = treeControl1.setRoot(dataStore1.getFileName());
for (dir.first();dir.inBounds(); dir.next()) {
// StoreNameを取得して項目に追加
GraphLocation loc =
treeControl1.addChild(root,
dir.getString(DataStore.DIR_STORE_NAME));
// 更新時刻とサイズを取得して子項目に追加
treeControl1.addChild(loc,
new java.util.Date(dir.getLong(DataStore.DIR_MOD_TIME)));
treeControl1.addChild(loc,
dir.getLong(DataStore.DIR_LENGTH) + "bytes");
}
}
catch (Exception ex){
// エラー処理
}
各列のデータは、この例で使用しているようにget~()メソッドを用います。Table 1に示したデータ型に応じて、メソッドを使い分けます。例えば、String型のStoreName項目はgetString()、short型のState項目はgetShort()になります。
String storeName = dir.getString(DataStore.DIR_STORE_NAME);
short state = dir.getShort(DataStore.DIR_STATE);
ディレクトリ情報は、リードオンリーです。このデータセットに値を設定して、直接ディレクトリ情報を変更することはできません。