LoginSignup
10
9

More than 5 years have passed since last update.

RealmでNSArrayをプロパティに指定する

Last updated at Posted at 2015-05-02

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

これで完了です。

10
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9