2015-10-27 15 views
18

私は3つのプロパティ 'title'の名前が 'text'から名前が変更され、後で追加されたtextDescriptionとdateTimeプロパティを持つオブジェクトNotSureItemを持っています。今私は私がこれらのプロパティに何かを追加したいときにクラッシュする私のアプリを実行するつもりです。それは以下のステートメントを示しています。RLMException、オブジェクトタイプの移行が必要です

'オブジェクトタイプ' NotSureItem 'には、次のエラーが原因で移行が必要です。 - プロパティ' text 'が最新のオブジェクトモデルにありません。 - 'title'プロパティが最新のオブジェクトモデルに追加されました。 - プロパティ 'textDescription'が最新のオブジェクトモデルに追加されました。

ここではその私のコード:

import Foundation 
import Realm 

class NotSureItem: RLMObject { 
    dynamic var title = "" // renamed from 'text' 
    dynamic var textDescription = "" // added afterwards 
    dynamic var dateTime = NSDate() 
} 

答えて

74

ちょうどあなたのアプリを削除して再度実行してください。

Realmオブジェクトのプロパティを変更するたびに、既存のデータベースは新しいデータベースと互換性がなくなります。

開発段階にいる間は、シミュレータ/デバイスからアプリを削除してもう一度起動することができます。

アプリケーションが公開され、オブジェクトのプロパティを変更すると、新しいデータベースバージョンへの移行を実装する必要があります。コードの下

+0

なぜdownvote? – joern

+1

それは私のために働く@joern –

+2

正解です。誰かがそれを落とした。それがあなたのために働いた場合、答えを受け入れてください、これは正解とマークされていますか? – joern

5

は私

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; 
config.schemaVersion = 2; 
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) { 
    // The enumerateObjects:block: method iterates 
    // over every 'Person' object stored in the Realm file 
    [migration enumerateObjects:Person.className 
        block:^(RLMObject *oldObject, RLMObject *newObject) { 
    // Add the 'fullName' property only to Realms with a schema version of 0 
    if (oldSchemaVersion < 1) { 
     newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@", 
          oldObject[@"firstName"], 
          oldObject[@"lastName"]]; 
    } 

    // Add the 'email' property to Realms with a schema version of 0 or 1 
    if (oldSchemaVersion < 2) { 
    newObject[@"email"] = @""; 
    } 
    }]; 
}; 
[RLMRealmConfiguration setDefaultConfiguration:config]; 

// now that we have updated the schema version and provided a migration block, 
// opening an outdated Realm will automatically perform the migration and 
// opening the Realm will succeed 
[RLMRealm defaultRealm]; 

return YES; 
} 

のために働いている詳細情報:https://realm.io/docs/objc/latest/#getting-started

3

変更したデータベースは、もは​​や移行が必要な理由で保存されたデータベースと互換性があります。あなたのオプションは、古いデータベースファイルを削除して新しく起動することです(初期の開発フェーズではうまくいきます)。

これは、スキーマのバージョンを定義し、レルム構成内でデータベース移行 'スクリプト'を提供することで行います。全体のプロセスは、(コードサンプルと一緒に)ここに文書化されていますhere

2

あなたはこのように起動時にデータベースを消去することができます。アプリを削除し、再インストール

[[NSFileManager defaultManager] removeItemAtURL:[RLMRealmConfiguration defaultConfiguration].fileURL error:nil]; 
10

良い習慣ではありません。移行の必要性に初めて遭遇したときから、開発中にいくつかの移行手順を組み込む必要があります。 SilentDirgeによって与えられたリンクは良いです:realm migration document、これは異なる状況を扱う良い例を示しています。最小移行タスクについては

、上記のリンクから次のコードスニペットは、自動的に移行を行うと、AppDelegateのdisFinishLaunchWithOptions方法で使用することができます:

let config = Realm.Configuration(
 
    // Set the new schema version. This must be greater than the previously used 
 
    // version (if you've never set a schema version before, the version is 0). 
 
    schemaVersion: 1, 
 

 
    // Set the block which will be called automatically when opening a Realm with 
 
    // a schema version lower than the one set above 
 
    migrationBlock: { migration, oldSchemaVersion in 
 
    // We haven’t migrated anything yet, so oldSchemaVersion == 0 
 
    if (oldSchemaVersion < 1) { 
 
     // Nothing to do! 
 
     // Realm will automatically detect new properties and removed properties 
 
     // And will update the schema on disk automatically 
 
    } 
 
    }) 
 

 
// Tell Realm to use this new configuration object for the default Realm 
 
Realm.Configuration.defaultConfiguration = config 
 

 
// Now that we've told Realm how to handle the schema change, opening the file 
 
// will automatically perform the migration 
 
let _ = try! Realm()