2016-10-05 11 views
0

私はプライマリキーを定義していない複数のオブジェクトを持っています(私たちのサーバはプライマリキーを扱い、オフラインモードではプライマリキーを提供できません)私は、データを変更した場合updateメソッドを使用するので、私は次のことを試してみました:レルム:オブジェクトの削除と追加:オブジェクトが削除または無効にされました

func updateTest() { 
    let myObjects = realm.objects(MyObject.self).filter("id = 1"); // id is NOT the primary key from realm! 

    var myObject: MyObject!; 

    if (myObjects.count > 0) { 
     myObject = myObjects[0]; 
    } 

    if (myObject != nil) { 
     try! self.realm.write() { 
      self.realm.delete(self.myObject); 
     } 

     // modify 
     self.myObject.status = "waiting"; 

     try! self.realm.write() { 
      self.realm.add(self.myObject); // crash 
     } 
    } 
} 

しかし、私は今、オブジェクトを追加したいとき、私は得る:

Terminating app due to uncaught exception: 'RLMException', reason: 'Object has been deleted or invalidated.' 

ここだから、いくつかの質問:

1つの結果だけを選択する可能性はありますか?

プライマリキーではないフィールド名を指定してオブジェクトを更新する可能性はありますか?

このエラーを発生させずにオブジェクトを削除して読み取るにはどうすればよいですか?

ダミーのプライマリキーを実装することは理にかなっていますか?あなたが何をしようとして

答えて

1

は次のように行うことができます。

func updateTest() { 
    guard let myObject = realm.objects(MyObject.self).filter("id = 1").first else { 
     return 
    } 

    try! realm.write { 
     myObject.status = "waiting" 
    } 
} 

は、1つの結果だけを選択するための任意の可能性はありますか?オブジェクトが見つからない場合

あなたのフォールバックelse句を使用して、1が存在する場合は、変数に結果セットの最初の要素をバインドするためにスウィフトのguard letを使用することができます。この場合、私は単に関数から復帰します。

プライマリキーではないフィールド名を指定してオブジェクトを更新する可能性はありますか?

はい。問題のオブジェクトを見つけるためにクエリを実行し、必要に応じてプロパティを変更します。

このエラーを発生させずにオブジェクトを削除して読み込むにはどうすればよいですか?

オブジェクトを削除して再追加することはできません。削除されたオブジェクトを復活させる方法はありません。あなたの後ろの行動を得るためにこれを行う必要はありません。

ダミーのプライマリキーを実装することは理にかなっていますか?

あなたが行っている動作を取得する必要はありません。

+0

ありがとうございました。 – Mulgard

関連する問題