2016-05-13 9 views
2

ユーザーがログアウトすると、realm.deleteAll()でレルムを消去します。この後、Resultsオブジェクトからの読み込みの結果、多くの通知が得られ、その結果、realm::Results::InvalidatedExceptionという例外が発生し、「RLMResultsが無効になりました」。私はRLMResultsが無効になっていることを確認する方法は?

  • チェック直接無効化Resultsオブジェクトへの道を見つけることができません。

  • チェックa Results 'realm無効のオブジェクト。または

  • ListResultsは、無効化状態を確認するために派生したものです。

私は他の何かを探すことは考えられません。その場所全体に例外をもたらさないデータベースをクリアする良い方法があれば、それについても聞いて嬉しいです。

追加情報:オブジェクトにアクセスするだけでなく、Resultsオブジェクトでcountを呼び出すと例外がスローされます。第1の目的はスウィフトドキュメントから、存在する場合は、チェックすることができ

+0

私は、これは 'Results'のAPIが不十分であることの場合だと思います。あなたは[GitHubの問題を提出してください](https:// github。com/realm/realm-cocoa/issues/new)この不足について言及していますか? – bdash

+0

提出https://github.com/realm/realm-cocoa/issues/3579。ありがとう、@bdash –

答えて

0

:空の場合

public var first: T? { return rlmResults.firstObject() as! T? } 

は、最初の結果内のオブジェクト、またはnilを返します。 Java用のレルムのドキュメント(スウィフトドキュメントで同じ文言を見つけることができなかった)から

:RealmResultsも、それは何のオブジェクトが含まれていない場合にはNOT NULLされることはありませんことを

注意してください。 RealmResultsが空であるかどうかを確認するには、常にsize()メソッドを使用する必要があります。

短くても、最初のオブジェクトが存在するかどうかを確認したり、要素を数えようとしたりしてください。

出典:

Java - Class RealmResults

Swift - Results Class Reference

編集:ここではコードサンプルがあり、それはレルムの例から取られて、私のニーズに変更され、彼らはかどうかを検出するために、通知のトークンを使用配列が空です

class Record: Object { 
    dynamic var workoutName = "" 
    dynamic var totalTime = "" 
    dynamic var date   = "" 
} 
    let realm = try! Realm() 
    let array = try! Realm().objects(Record).sorted("date") 

    var notificationToken: NotificationToken? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    setupUI() 

    // Set results notification block 

    notificationToken = array.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in 
     guard let tableView = self?.tableView else { return } 
     switch changes { 
     case .Initial: 
     // Results are now populated and can be accessed without blocking the UI 
     tableView.reloadData() 
     break 
     case .Update(_, let deletions, let insertions, let modifications): 
     // Query results have changed, so apply them to the UITableView 
     tableView.beginUpdates() 
     tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
      withRowAnimation: .Automatic) 
     tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
      withRowAnimation: .Automatic) 
     tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) }, 
      withRowAnimation: .Automatic) 
     tableView.endUpdates() 
     break 
     case .Error(let error): 
     // An error occurred while opening the Realm file on the background worker thread 
     fatalError("\(error)") 
     break 
     } 
    } 
    } 

また、テーブルu DELETEALL()を歌う:

func clearTable() { 
    try! realm.write { 
     realm.deleteAll() 
    } 
    } 
+0

'Results'オブジェクトで' count'を呼び出すと例外が発生するので、それはそれだとは思いません。 –

+0

もう一度、私は空を探していない、私は無効に探しています。通知が発生すると、テーブルビューに何が含まれているかに関係なくテーブルビューがリロードされます。 'count'をチェックすると例外がスローされます。 –

関連する問題