2016-07-26 10 views
2

私のアプリはCloudKitを使用して、レルムデータをバックアップし、ユーザーが特定のボタンを押すたびにデータをフェッチします。 "default.realm"ファイルをドキュメントフォルダからiCloudに下のコードでアップロードするようにコーディングしました。 データがうまくアップロードされているようです。デフォルトのレルムをiCloudからダウンロードした別のレルムに置き換える方法

以下はダウンロード部分です。ダウンロードすることもできますが、レルムファイルが置き換えられないようです。

CKDatabase *privateDatabase = [[CKContainer defaultContainer] privateCloudDatabase]; 
CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:kRecordName]; 

// fetch realm from cloud 
[privateDatabase fetchRecordWithID:recordID completionHandler:^(CKRecord *record, NSError *error) { 
    if (!error) { 
     CKAsset *realmAsset = record[@"Realm"]; 
     NSData *realmData = [NSData dataWithContentsOfURL:realmAsset.fileURL]; 
     NSString* filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     NSString* fileName = @"default.realm"; 
     NSString* fileAtPath = [filePath stringByAppendingPathComponent:fileName]; 

     // delete existing default.realm file in documents 
     if ([[NSFileManager defaultManager] fileExistsAtPath:fileAtPath]) { 
      [[NSFileManager defaultManager] removeItemAtPath:fileAtPath error:&error]; 
     } 
     // create a new default.realm file with downloaded data 
     if([[NSFileManager defaultManager] createFileAtPath:fileAtPath contents:realmData attributes:nil]) { 
       // code goes thru here but nothing changes 
     } 
    } 
}]; 

レルムファイル全体を置き換えたいとします。私は間違って何をしていますか?どこから始めるべきですか? アドバイスをいただければ幸いです。

答えて

1

レルムファイルパスを変更するには、パスをRealm.Configuration.fileURLに設定します。

let fileURL = ... 
let config = Realm.Configuration(fileURL: fileURL) 

let realm = try! Realm(configuration: config) 

ファイルパスを毎回指定したくない場合は、設定オブジェクトをデフォルト設定として設定できます。

let fileURL = ... 
let config = Realm.Configuration(fileURL: fileURL) 

Realm.Configuration.defaultConfiguration = config 

let realm = try! Realm() 

は、実行時にレルムファイルを交換するために、これらに基づいて、またhttps://realm.io/docs/swift/latest/#realm-configuration

を参照してくださいすることは非常に危険です。これを実現するには、レルムの強い参照が全くないことを保証する必要があります。この代わりに、別のファイルを作成して使用することができます。

// fetch realm from cloud 
[privateDatabase fetchRecordWithID:recordID completionHandler:^(CKRecord *record, NSError *error) { 
    if (!error) { 
     CKAsset *realmAsset = record[@"Realm"]; 
     ... 

     // Do not delete existing default.realm file in documents 

     // create a new default.realm file with downloaded data 
     // as deferent file name 

     NSString* newFileName = @"default1.realm"; // default2.realm, default3.realm, ... 
     NSString* newfileAtPath = [filePath stringByAppendingPathComponent:newfileAtPath]; 
     if([[NSFileManager defaultManager] createFileAtPath:newfileAtPath contents:realmData attributes:nil]) { 
       // Switch to using new file to create Realm instance 
       // e.g. set new file path to de default configuration file URL 
       let config = Realm.Configuration(fileURL: NSURL(fileURLWithPath: newfileAtPath)!) 
       Realm.Configuration.defaultConfiguration = config 
       ... 
     } 
+0

ガイドに従って、名前を変更せずに領域ファイルをスワップできます。それが持っていた強い参照のように見えます。そんなにありがとう、あなたは私の一日を救った! –

関連する問題