久々に、開発関連の記事を書く事にする。
最近は、今までに使った事のある内容の組み合わせで開発を行っていた。
そのため、ちょっとした事で引っかかった事は会ったのだが、その都度、検索して解決させて、記事にするのを失念してしまっていた。
今回は、結構試行錯誤しながら進めたので、きちんと書いておく事にした。
タイトルにあるように、現在、coredataを使用したアプリを作成中。
coredata自体は、以前も使った事があったが、今回は、独自クラスをデータベースに保存するようにした。
coredataの使い方は、省略させていただく。
データベースに保存するデータのクラス(型)は、選択肢から選ぶ事になるのだが、種類はさほど多くない。
さらに、タイトルにあるように、独自のものを保存したい場合も多いので、単純にはうまくいかない。
そこで用意されているものが「Transformable」だ。
名前の通り、変更可能となる。
ここで、変更可能と言っても、そのまま設定しようとしてもエラーが出るだけ。
-[Sample initWithCoder:]: unrecognized selector sent to instance 0xXXXXXXX'
こんな感じのエラーが発生する。
これは、指定されているもの(Sample initWithCoder:この部分)が、存在しないとおこられてしまう。
実装上、こんなものをコールする事は無いのだが、「Transformable」に設定しようとする時に、自動的に変換する為にコールされるようだ。
「Transformable」と指定されたものは、NSDataに自力で変更する必要があるらしい。
標準のクラスには、変換の為のものが、入っているものもあるが、独自であれば、当然ない。
こういわれてしまうのであれば、単純にそれを追加すればよいという事。
ただし、上記で指摘されてたものとペアとなる「encodeWithCoder」
その結果追加したものが、下記の内容。
- (void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeInteger:_itemNo forKey:@"itemNo"];
[coder encodeObject:_itemName forKey:@"itemName"];
[coder encodeDouble:_itemDouble forKey:@"itemDouble"];
}
- (id)initWithCoder:(NSCoder*)decoder
{
self = [super init];
_itemNo = [decoder decodeIntegerForKey:@"workOfArt"];
_itemName = [decoder decodeObjectForKey:@"itemName"];
_itemDouble = [decoder decodeDoubleForKey:@"itemDouble"];
return self;
}
サンプルとして、3種類をいれて、それぞれ、NSInteger、NSString、doubleとしてみた。
他のクラスや型を使用したいと思った場合も上記と変わらない。
「encodeInteger」等の部分を、encodeのあたりまで入力すると、xcodeの補完機能で一覧が出るため使用しているものにあうと思われる名前のものを選択するとよいようだ。
ここまでは、まだ、比較的簡単に進める事が出来たのだが、標準のクラスだが、NSDataへの変換に対応していない場合にはまってしまった。
いろいろと調べてみたり試したりしたのだがうまくいかない。
きっと、うまく対応させる方法があるのだと思うのだが、そこまでは分からなかった。
結果的に、変換不可のクラスの、自分の使用したパラメータを、複数の変更可能なクラスに分て保存する事にした。
こうすれば、深く考える事無く対応する事が可能。
当然、その事は始めから分かっている事だったのだが、管理するには、そのまま保存した方がよい事は明らかなので、がんばってみたが、結局断念。
これも、継続して調査して、うまい方法を見つけた時には、置き換えて、ここにも残すつもり。
[0回]
PR