Realm Blog

Realm Objective-C & Swift 0.96

このバージョン(0.96)で読み書きを行ったRealmファイルは以前のバージョンで開くことができなくなります。既存アプリケーションに対して更新を適用する場合は特に注意してください。

Realm Objective-CおよびRealm Swift 0.96.0をリリースしました。

このバージョンにはNULLプロパティのサポート、コレクションに対する集計関数(count/min/max/sum/avg)のサポート、SwiftにおいてRealmCollectionTypeの導入とエラーハンドリングの改善、および不具合の修正が含まれます。

NULLサポート

このバージョンではすべてのプロパティの型に対して、NULL値を格納できるようになりました。

Objective-C

NSStringNSDateNSData、型のプロパティは、デフォルトでnilが代入可になります。もしnilの代入を禁止する場合は、モデルの+requiredPropertiesのクラスメソッドをオーバーライドし、nilの代入を禁止するプロパティの名前を返すようにします。 旧バージョンで作成されたファイルにアクセスした時に、+requiredPropertiesで指定したプロパティ以外は、自動的にはnil可に変換されます。

数値型のプロパティについてはNSNumberを利用することでnil可を示します。NSNumber<RLMInt>NSNumber<RLMBool>NSNumber<RLMFloat>NSNumber<RLMDouble>のように実際の数値の型を指定することができます。

@interface OptionalTypes : RLMObject
@property NSString *optionalString;
@property NSString *requiredString;
@property NSData *optionalData;
@property NSDate *optionalDate;
@property NSNumber<RLMInt> *optionalInt;
@property NSNumber<RLMBool> *optionalBool;
@property NSNumber<RLMFloat> *optionalFloat;
@property NSNumber<RLMDouble> *optionalDouble;
@end
@implementation OptionalTypes
+ (NSArray *)requiredProperties {
    return @[@"requiredString"];
}
@end

Swift

StringNSDateNSData型のプロパティは一般の型と同様にOptionalまたは非Optionalのどちらかを指定することができます。残念ながら、数値型の各種については直接Optionalを指定することをサポートすることができませんでした。(詳しくはこちら #2147)をご覧ください。そのため、数値型でnilを扱うにはRealmOptionalでラップする必要があります。

(例)

class OptionalTypes: Object {
    dynamic var string: String? = "B"
    dynamic var data: NSData? = "C".dataUsingEncoding(NSUTF8StringEncoding)
    dynamic var date: NSDate? = NSDate(timeIntervalSince1970: 10)
    let int = RealmOptional<Int>(1)
    let float = RealmOptional<Float>(2.2)
    let double = RealmOptional<Double>(3.3)
    let bool = RealmOptional<Bool>(true)
    let boolWithNilDefault = RealmOptional<Bool>(nil)
}

List型のプロパティと同様に、RealmOptional型のプロパティはletで宣言する必要があり、dynamicを付けてはいけません。RealmOptionalでラップした実際の値を取得・設定するにはvalueプロパティを使用します。

ファイルフォーマットの自動変換

このバージョンでRealmファイルを開くと、自動的に新しいファイルフォーマットに変換されます。読み込みだけで書き込みを行わなかったとしても変換は行われますので注意してください。この自動変換では下記の操作が行われます。

  1. すべてのインデックスが作り直されます。(IntとStringの型にのみ適用されます)
  2. すべてのNSStringNSDateNSData型のプロパティは+requiredPropertiesを指定しない限り、NULL代入可に変換されます。
  3. 新しいフォーマットのバージョン番号がファイルに書き込まれます。

逆に旧バージョンのRealmで作成されたファイルは新しいバージョンで読み込むことができません。この変換はファイルの書き込みを必要とするため、もしアプリケーションにRealmファイルをバンドルして読み込み専用で利用している場合は、新しいファイルフォーマットに更新して置き換える必要があります。

注意:このファイルフォーマットの変換を元に戻すことはできません。

キーパス・コレクション・クエリ(Keypath Collection Queries)

コレクションオブジェクト(RLMArray/List)に対する集計関数@count@min@max@sum@avgがサポートされました。詳しい使い方はRealmのWebサイトで公開しているNSPredicateチートシートをご覧ください。

RealmCollectionType

Realm Objective-Cでは長らくRLMArrayRLMResultsは共通のプロトコル(RLMCollection)の機能を利用することができました。このバージョンから、Swiftでも同様の機能が利用できるように拡張されました。

ListResultsクラスは共にRealmCollectionTypeプロトコルに準拠するように宣言されています。type-erased wrapperが提供されているので、Swiftであっても異なるレイアウトのオブジェクトを同じコレクションに格納することができます。

class ViewController: UIViewController {
    var collection: AnyRealmCollection

    init(collection: RealmCollectionType) {
        super.init()
        self.collection = AnyRealmCollection(collection)
    }
}

エラーハンドリングの改善

現在のRealmではトランザクションをコミットした際に、ディスクの空き状況が不足している場合、クラッシュを引き起こすことがあります。それによってデータが破損することがありませんが、ユーザ体験としては非常に良くありません。

この変更によって、commitWritecommitWriteTransactionwritetransactionWithBlockがディスクの空き容量が不足している際には、エラーを返すようになりました。

細かな改善

  • RLMRealmRealmisEmptyプロパティを追加しました。Realmに1つでもオブジェクトが保存されているかどうかを示します。

不具合の修正

  • 8MB以上16MB以下のサイズのNSDataを保存した時にアサーションに失敗することがある問題を修正しました。
  • 1対1または1対多の関連のプロパティが削除されたマイグレーションをロールバックした際にアサーションに失敗することがある問題を修正しました。
  • ファイルのオープンに失敗した際のエラーオブジェクトにパスの情報を含めるようにしました。
  • モデルのサブセットを指定してRealmをオープンした後にサブセットを指定せずに開くとクラッシュする問題を修正しました。
  • Object型のプロパティのデフォルト値を持つモデルをObject(value: ...)で作成する際のエラーを修正しました。
  • モデルのサブセットとして与えられたクラスが関連を持つとき、その関連のクラスがサブセットに含まれていないときは例外が発生するようになりました。
  • 複数のスレッドから短期間にに何回も同じRealmファイルを開いたときにクラッシュすることがある不具合を修正しました。
  • いくつかのエラーメッセージで間違った関数名を表示していた問題を修正しました。


Realm Team

At Realm, our mission is to help developers build better apps faster. We provide a unique set of tools and platform technologies designed to make it easy for developers to build apps with sophisticated, powerful features — things like realtime collaboration, augmented reality, live data synchronization, offline experiences, messaging, and more.

Everything we build is developed with an eye toward enabling developers for what we believe the mobile internet evolves into — an open network of billions of users and trillions of devices, and realtime interactivity across them all.

記事の更新情報を受け取る