Realm Objective-C & Swift 0.96 Beta
このバージョン(0.96 Beta)で読み書きを行ったRealmファイルは以前のバージョンで開くことができなくなります。既存アプリケーションに対してテストを実施する場合は特に注意してください。
NULLサポートを有効にしたRealm Objective-CとSwiftの特別なベータ版として0.96.0-betaをリリースしました。このバージョンをインストールするにはZIPファイル(Objective-C / Swift)をダウンロード、展開してプロジェクトにコピーします。またはCocoaPod、Carthageを利用する場合は、Podfile
またはCartfile
のバージョンに0.96.0-beta2
を指定してインストールします。
このバージョンにはNULLプロパティのサポート、コレクションに対する集計関数(count/min/max/sum/avg)のサポート、SwiftにおいてRealmCollectionType
の導入とエラーハンドリングの改善、および不具合の修正が含まれます。
このバージョンはベータ版のため、テスト環境でのみ利用するようにしてください。新しいファイルフォーマットと自動変換の処理について、注意深く検証を行ってきましたが、 わずかな問題が潜んでいる可能性を排除するために、開発者の皆さまからのフィードバックを求めています。
ベータテストの期間が終了すると、これら機能は正式版としてリリースされます。
NULLサポート
このバージョンではすべてのプロパティの型に対して、NULL値を格納できるようになりました。
Objective-C
NSString
、NSDate
、NSData
、型のプロパティは、デフォルトで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
String
、NSDate
、NSData
型のプロパティは一般の型と同様に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ファイルを開くと、自動的に新しいファイルフォーマットに変換されます。読み込みだけで書き込みを行わなかったとしても変換は行われますので注意してください。この自動変換では下記の操作が行われます。
- すべてのインデックスが作り直されます。(IntとStringの型にのみ適用されます)
- すべての
NSString
、NSDate
、NSData
型のプロパティは+requiredProperties
を指定しない限り、NULL代入可に変換されます。 - 新しいフォーマットのバージョン番号がファイルに書き込まれます。
逆に旧バージョンのRealmで作成されたファイルは新しいバージョンで読み込むことができません。この変換はファイルの書き込みを必要とするため、もしアプリケーションにRealmファイルをバンドルして読み込み専用で利用している場合は、新しいファイルフォーマットに更新して置き換える必要があります。
注意:このファイルフォーマットの変換を元に戻すことはできません。
キーパス・コレクション・クエリ(Keypath Collection Queries)
コレクションオブジェクト(RLMArray
/List
)に対する集計関数@count
、@min
、@max
、@sum
、@avg
がサポートされました。詳しい使い方はRealmのWebサイトで公開しているNSPredicateチートシートをご覧ください。
RealmCollectionType
Realm Objective-Cでは長らくRLMArray
とRLMResults
は共通のプロトコル(RLMCollection
)の機能を利用することができました。このバージョンから、Swiftでも同様の機能が利用できるように拡張されました。
List
とResults
クラスは共にRealmCollectionType
プロトコルに準拠するように宣言されています。type-erased wrapperが提供されているので、Swiftであっても異なるレイアウトのオブジェクトを同じコレクションに格納することができます。
class ViewController: UIViewController {
var collection: AnyRealmCollection
init(collection: RealmCollectionType) {
super.init()
self.collection = AnyRealmCollection(collection)
}
}
エラーハンドリングの改善
現在のRealmではトランザクションをコミットした際に、ディスクの空き状況が不足している場合、クラッシュを引き起こすことがあります。それによってデータが破損することがありませんが、ユーザ体験としては非常に良くありません。
この変更によって、commitWrite
、commitWriteTransaction
、write
、transactionWithBlock
がディスクの空き容量が不足している際には、エラーを返すようになりました。
細かな改善
-
RLMRealm
とRealm
にisEmpty
プロパティを追加しました。Realmに1つでもオブジェクトが保存されているかどうかを示します。
不具合の修正
- 8MB以上16MB以下のサイズのNSDataを保存した時にアサーションに失敗することがある問題を修正しました。
- 1対1または1対多の関連のプロパティが削除されたマイグレーションをロールバックした際にアサーションに失敗することがある問題を修正しました。
- ファイルのオープンに失敗した際のエラーオブジェクトにパスの情報を含めるようにしました。
- モデルのサブセットを指定してRealmをオープンした後にサブセットを指定せずに開くとクラッシュする問題を修正しました。
-
Object
型のプロパティのデフォルト値を持つモデルをObject(value: ...)
で作成する際のエラーを修正しました。 - モデルのサブセットとして与えられたクラスが関連を持つとき、その関連のクラスがサブセットに含まれていないときは例外が発生するようになりました。
最後にもう一度、このバージョン(0.96 Beta)で読み書きを行ったRealmファイルは以前のバージョンで開くことができなくなります。既存アプリケーションに対してテストを実施する場合は特に注意してください。新しいファイルフォーマットと自動変換の処理について、注意深く検証を行ってきましたが、 わずかな問題が潜んでいる可能性を排除するために、開発者の皆さまからのフィードバックを求めています。