データベースオブジェクトの更新

梅澤さんの「SeaSideへGO!!(第4回)」を参考にしながらOmniBaseの使い方を学んでいます。

例にならって、Dictionaryを登録してみました。

dbSession := SBOmniBaseAccessor default.
dbSession commitDo: [:tr |
(dbSession dictionaryNamed: 'myTest')
at: 'test' put: Dictionary new

ところが、こうやって登録した辞書にデータを加えてみてもうまくいきません。

dbSession := SBOmniBaseAccessor default.
dbSession commitDo: [:tr |
dic := (dbSession dictionaryNamed: 'myTest') at: 'test'.
dic at: 'name' put: 'itoh'.

上記のようなコードを評価した後で、以下のコードを評価してもインスペクタには空っぽのDictionaryが表示されます。

dbSession := SBOmniBaseAccessor default.
dbSession readDo: [:tr |
dic := (dbSession dictionaryNamed: 'myTest') at: 'test'.
dic inspect.

面倒ですが再度辞書を追加してみますが、結果は変わらず空っぽのままです。

dbSession := SBOmniBaseAccessor default.
dbSession commitDo: [:tr |
dic := (dbSession dictionaryNamed: 'myTest') at: 'test'.
dic at: 'name' put: 'itoh'.
(dbSession dictionaryNamed: 'myTest') at: 'test' put: dic.

この状態で2日間困ってしまいました。

結局、解決方法ですが以下のようにすれば良いことがわかりました。

dbSession := SBOmniBaseAccessor default.
dbSession commitDo: [:tr |
dic := (dbSession dictionaryNamed: 'myTest') at: 'test'.
dic at: 'name' put: 'itoh'.
dic markDirty.

気がついてみれば当然ですが、登録したオブジェクトに変更があったことを明示的に伝えないといけないんですね。

OmniBaseの学習は手探り状態で進んでいます。