0

私はコア データを使用してそのオブジェクトをディスクに永続化する Mac OS アプリケーションを持っており、sqlite に支えられています。

すべての NSManagedObject サブクラスを検査できる tableView があります。これは、managedObjectContext 内のエンティティにバインドされている arrayController にバインドされています。

この arrayController のオブジェクトを使用して、tsv ファイルへのエクスポートに備えてオブジェクトを整理するために使用される別の tableView をサポートする別の arrayController を読み込みます。この tableView を使用すると、ドラッグ アンド ドロップで並べ替えたり、エントリを削除したりできますが、これは managedObjectContext には影響しません。

この 2 番目の arrayController の内容をディスクに永続化して、ドキュメントを再度開いたときに tableView が以前と同じ順序で同じオブジェクトを持つようにする最善の方法は何ですか?

これまでのところ、ドキュメントを閉じるときに設定される、セカンダリ arrayController からオブジェクトが削除された場合は nil に設定される、secondaryArrayOrder と呼ばれる属性を managedObjects に追加するだけです。これは機能しますが、アプローチする方法が間違っているようです。

編集 - その言語を使用して自分の質問に答えたので、MacRuby タグを追加しました。

4

1 に答える 1

0

私は今これを行う方法を考え出しました。

アプリケーションが MacRuby のものであることは関係ないので、質問の中で言及しませんでしたが、私のソリューションを完全に Objective-C に変換したかどうか自信がないので、MacRuby のままにします。 .

すべての NSManagedObject には、クラスNSManagedObjectIDの objectID があり、アプリケーション内で一意に識別されます。したがって、これらは簡単に照会して、たとえば plist ファイルの文字列としてディスクに保存できます。

theObjects = arrayController.arrangedObjects
               .map { |e| e.objectID.URIRepresentation.absoluteString }

# save theObjects to disk as a plist or json.

これを使用して、次にアプリケーションを起動するかドキュメントを開いたときに、アレイ コントローラの内容を同じ順序で再作成できます。

def loadArrayController(arrayOfIDStrings)
  objects = arrayOfIDStrings.map { |e|
    url = NSURL.URLWithString(e)
    moID = managedObjectContext.persistentStoreCoordinator.managedObjectIDForURIRepresentation(url)
    managedObjectContext.objectWithID(moID)
  }
  arrayController.addObjects(objects)
  arrayController.setSelectedObjects([])
end
于 2013-02-28T19:20:25.020 に答える