NSArrayをプロパティに指定すると
*** Terminating app due to uncaught exception 'RLMException', reason: ''NSArray' is not supported as an RLMObject property. All properties must be primitives, NSString, NSDate, NSData, RLMArray, or subclasses of RLMObject. See http://realm.io/docs/cocoa/api/Classes/RLMObject.html for more information.'
と言われます。
「例外エラーで落としたよ。NSArrayはRLMObjectのプロパティとしてサポートしてないよ。プロパティはNSString、NSDate、NSData、RLMArray、それかRLMObjectのサブクラスにしてね。というかドキュメント読んでね。」
と、要約するとこんな感じかと思います。
文中のRLMArray、これちょっと今回の問題に関わりありそうですね。Arrayって書いてあるし。
RLMArrayの使い方ですが、NSArrayと置き換えてしまって大丈夫です。が、ちゃんと中身にどんなのが入るかは教えてね。ってことらしいです。
まずはbooksという配列を持つLibraryモデルを例に実装してみましょう。
Library.h
@interface Library : NSObject
@property (nonatomic) NSArray *books;
@end
ライブラリのimportはpchでしているので省略しますね。
これをRealmに対応させるには、まずはBookモデルを作ります。
ファイルが増えるのが嫌ならLibrary.h上に作ってしまっても良いですよ。
次の例はLibrary.h上にbookモデルを作っている例です。
Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)
@interface Library : NSObject
@property (nonatomic) NSArray *books;
@end
これでtitleのプロパティを持つBookモデルが出来上がりました。
実際は色々他にもプロパティを持つかと思いますが、ここでは簡単にタイトルだけとします。
次に、LibraryモデルのbooksプロパティをRLMArrayに変えます。
同時にLibraryモデルをNSObjectからRLMObjectのサブクラスに変更します。
Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)
@interface Library : RLMObject
@property (nonatomic) RLMArray *books;
@end
そして、booksがbookモデルの集合だということを指定します。
Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)
@interface Library : RLMObject
@property (nonatomic) RLMArray<Book> *books;
@end
これでNSArrayの書き換えは完了です。
以下はイニシャライザでbooksにbookオブジェクトを生成して入れていくサンプルです。
Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)
@interface Library : RLMObject
-(instancetype)initWithTitlesArray:(NSArray*)titles;
@property (nonatomic) RLMArray<Book> *books;
@end
ヘッダーにイニシャライザを実装して…
Library.m
#import "Library.h"
@implementation Book
@end
@implementation Library
-(instancetype)initWithTitlesArray:(NSArray*)titles{
self = [super init];
if (self) {
for (NSString*title in titles) {
Book*book = [Book new];
book.title = title
[_books addObject:book];
}
}
return self;
}
@end
これで完了です。