問題タブ [uimanageddocument]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1662 参照

iphone - 異なるオブジェクト間で 1 つの UIManagedDocument を共有するにはどうすればよいですか?

ブロックを使用してアプリケーション全体で共有されるディスク上のドキュメントごとにグローバル UIManagedDocument インスタンスを作成するにはどうすればよいですか? しかし、私は本当にそれを理解していません。

私が達成したいのは、アプリ全体に対して 1 つの UIManagedDocument (コア データ データベース) のみが存在することです。異なるオブジェクトがメソッドを呼び出して、唯一の UIManagedDocument を取得する必要があります。

クラス メソッドでヘルパー クラスを使用します。

疑問符でわかるように、既存のファイルを取得する方法がわかりません。UIManagedDocument クラス リファレンスを確認しましたが、見つかりませんでした。

助けてくれませんか?よろしくお願いします。

編集 私は疑問に思っていました...次のようなシングルトンメソッドはどうですか:

0 投票する
2 に答える
1897 参照

core-data - Core Data 管理対象オブジェクトは、シミュレータを再起動するまで関連オブジェクトを認識しません

スタンパーを手に入れました(少なくとも私にとっては)。

ARC 付きの iOS 5.0 と、UIManagedDocument 内の Core Data を使用しています。

エンティティ (人) に対して対多の関係 (人と呼ばれる) を持つエンティティ (グループ) があります。新しいグループを追加してから新しい人物を追加すると (人物の .group 関係を新しいグループに設定する)、Person エンティティの述語を使用して関連する人物を取得できません ("group == %@", myGroup )。グループの addPerson セッターも使用してみました。

XCode シミュレーターをシャットダウンして再実行すると、前回の実行で作成された関係が認識され、既存の Group オブジェクトに新しい人を追加することもできます。関係を確認するために、新しいグループを追加してから、シミュレーター (デバイスで実行している場合はデバイス) をシャットダウンせずに人を追加することはできません。

[group.people count] を実行すると、新しいグループと関連する人物を追加した直後に、正しい数が得られます。しかし、述語を使用したフェッチは、アプリを再起動するまで機能しません。

UIManagedDocument の managedObjectContext が関係を認識していないようです。コンテキストを保存し、context.parentContext を保存し、Document を保存しようとしました。どれも役に立ちませんでした。

どんなアイデアでも大歓迎です!

0 投票する
3 に答える
1520 参照

core-data - UIManagedDocument で NSFileWrappers を使用する必要がありますか?

UIManagedDocument の一部として、plist といくつかのバイナリ ファイル (画像としましょう) を保存しようとしています。バイナリ ファイルの名前は Core Data の属性であり、それらを列挙する必要はありません。関連するエンティティを表示するときに適切なファイルにアクセスするだけです。

私が持ちたいファイル構造は次のとおりです。

これまでのところ、UIManagedDocument ファイル パッケージに追加のコンテンツを保存するにはどうすればよいですか?の指示に従って問題なく実行できました。、しかし、バイナリファイルを追加しようとすると、方法がわからないことがいくつかあります。

  1. URL /the/path/File yyyyMMdd-HHmmss.extdoc/ AdditionalContent (readAdditionalContentFromURL:error: で提供されるデフォルトの URL) を NSFileWrapperとして扱うべきですか? URL のみを使用する場合と比較して、利点/欠点はありますか? plist はファイル ラッパー アクセサーと NSCoder (推測) を使用して読み取る必要があるため、ファイル ラッパーを使用するのはより複雑だと思います。 objectForKey を持つノード (私は推測します)。しかし、Apple の Document-Based Apps Programming Guide for iOS では、NSData または NSFileWrapper の代わりにカスタム フォーマットに関して、「コードは UIDocument が行うことを複製する必要があることに注意してください。そのため、より複雑になり、エラーの可能性が高くなることに対処する必要があります。「私はこれを誤解していますか?
  2. ドキュメントごとのデフォルトはプロパティとして宣言されます。セッターは、plist をマップしてドキュメントを更新済みとしてマークする NSDictionary を変更し、ゲッターは適切なキーを使用して辞書にアクセスします。バイナリ ファイルの読み取り/書き込み機能を公開するにはどうすればよいですか? UIManagedDocument のサブクラスにメソッドを追加する必要がありますか? - (void)writeImage:(NSString*)uuid; および -(UIImage *)readImage:(NSString *)uuid; ドキュメントが保存されるまで、このデータをメモリに保持する必要がありますか? どのように?
  3. NSFileWrapper を使用すると仮定すると、iCloud でこのドキュメントを使用する場合、ファイル コーディネーターをファイル ラッパーで使用する必要がありますか? もしそうなら、どのように?

各質問のソース コードは大歓迎です。ありがとうございました。

PS: Core Data 内にバイナリ データを保存できることは知っていますが、その解決策には満足できません。他の理由の中でも特に、デスクトップ アプリを作成する場合は、NSImage と互換性のないシリアル化されたバージョンの UIImage である画像ファイルの PNG データを保存します。

0 投票する
1 に答える
1699 参照

ios5 - 宣言されていない識別子の使用'NSMigratePersistentStoresAutomaticallyOption'

以下のコードステートメントを宣言しているときに、なぜこのエラーが発生するのですか?

宣言されていない識別子の使用'NSMigratePersistentStoresAutomaticallyOption'

これでNSMigratePersistentStoresAutomaticallyOption定数を認識できるようにするために何が欠けていますか?

ありがとう、

マイク

0 投票する
3 に答える
1925 参照

core-data - UIManagedDocument の移行の問題

iOS 5 の新しいクラス UIManagedDocument の使用に関するスタンフォード CS193P のレッスンに従って、アプリケーションで CoreData の使用を開始しました。アプローチ自体は非常に簡単ですが、私が行っているモデルの変更を処理する方法がわかりません。これは、UIManagedDocument オブジェクトをインスタンス化する方法です (appDelegate 内で、他のすべてのクラスが使用できるようにします)。

私が抱えている問題は、.xcdatamodel を少しでも変更するたびに、以前にドキュメントに保存されたすべてのコンテンツを取得したり、新しいインスタンスを作成したりできないことです。実際、これを行うと次の例外が生成されます。

管理ドキュメントの「options」プロパティを設定すれば解決すると思っていたのですが、どうやらそれだけでは不十分のようです。誰でも助けることができますか?私の正確なニーズに実際に適合する他の質問を見つけることができませんでした.

0 投票する
3 に答える
1533 参照

ios - コア データ: NSManagedObjectContext、NSFetchResultsController、および UIManagedDocument

UIManagedDocumentバックグラウンド スレッドを使用して/内のデータを更新する際に問題が発生していますCore Data。具体的にはNSFetchResultsController、バックグラウンド スレッドからジオコーディングされたデータに基づいてマップ アノテーションを更新するために を使用していますが (メインの MOC にマージして戻した後)、マップは更新されませんUIManagedDocument。 (親子)。アプリを閉じて再度開くと、注釈が入力されるため、ある時点で永続ストアへのコミットが発生しますが、そのようなコミットを強制してNSFetchResultsController. ここにいくつかのコードがあります:

MOC を更新するバックグラウンド スレッド:

これらの保存が呼び出されると、次のようにメイン スレッド (アプリ デリゲート内) で通知を取得します。

そして、フェッチした結果コントローラーを次のように設定しました (述語は正しいです。データがストアにコミットされた後にアプリを再起動すると、結果は期待どおりになります)。

適切なMOCを更新して、フェッチされた結果コントローラーを希望どおりに動作させる方法についてのアイデアはありますか?

0 投票する
2 に答える
1102 参照

core-data - UIManagedDocument + iCloudの「全体像」?

私は最初の「iCloud アプリ」に取り組んでいます。Apple のドキュメントとスタンフォードのビデオに取り組みましたが、iCloud の「全体像」を理解するのにまだ苦労しています。

私の目標は、従業員の例のような「ライブラリ スタイル」アプリ (「単一の永続ストア コーディネーターと単一の永続ストアを備えた単一のコア データ スタック」を備えたアプリの Apple 用語) を作成することです。

スタンフォードのビデオに続いて、UIManagedDocument を使用してすべての Core Data をセットアップし、iCloud 機能を有効にしています。UIManagedDocument にはデータベースが含まれており、「クラウドに保存」されています。

これはすでに私が苦労している最初のことです: 「クラウドに保存される」とはどういう意味ですか?

iCloud を使い始める前は、「ドキュメントをクラウドに保存する」とは「ドキュメントのコピーをクラウドに保存する」ことだと思っていました。私は、ドキュメントのローカル バージョンが通常のサンドボックス内にあり、ドキュメントのコピーがクラウドにあると考えていました。ローカル ドキュメントが変更されるたびに、これらの変更はクラウド バージョンにも転送されます。私が理解しているように、これは正しくありません (少なくとも完全には正しくありません)。私は正しいですか?

iCloud を使用するために最初にしなければならないことは、URLForUbiquityContainerIdentifier:を呼び出すことです。これにより、クラウド内のフォルダーの URL を意味する「iCloud URL」が返されます。このURLに保存されているファイルはすべて「クラウドに保存」されますよね?

私の最初の仮定 (ローカル ファイル + クラウド内のコピー) は完全に間違っているわけではありません。実際、クラウドに保存されているファイルには「ローカル バージョン」と「クラウド バージョン」があります。これは、デバイスが現在インターネットに接続されていない場合でも、iCloud URL にアクセスしてこの場所にファイルを保存できるためです。しかし、これは iCloud フレームワークの魔法の背後にあるだけであり、私が気にする必要はありません。私の観点からすると、クラウドは単純な特別なフォルダーであり、このフォルダー内のファイルまたはディレクトリはすべてクラウドに保存されます。iCloud がデバイス設定で無効になっている場合、iCloud URL は NIL になります。そうですか?

私が苦労している 2 番目のことは、iCloud がドキュメントへの変更を同期する方法です。デバイス A の「TheApp」が UIManagedDocument を作成し、クラウドに保存するとします。その後、デバイス A はオフラインになります。一方、ドキュメントはデバイス B の TheApp によってアクセスされ、一部のデータが追加されます (たとえば、一部の新しい従業員または部門が挿入されます)。デバイス B が再びオンラインになると、NSPersistentStoreDidImportUbiquitousContentChangesNotificationを受信し、ドキュメントの managedObjectContext ですべての呼び出しmergeChangesFromContextDidSaveNotification:をマージして、これらの変更をコピーできます。

変更をマージすることが本当に必要かどうかを確認できませんでした。上記のように、私の観点からは、ドキュメントは 1 つしかありません。それが本当なら、変更について通知されるのは素晴らしいことですが、「ローカル バージョン」などは存在しないため、これらの変更をドキュメントの「ローカル バージョン」にコピーする必要はありません。これにより、mergeChangesFromContextDidSaveNotification: が何に適しているのかという疑問が生じます。

別のシナリオは、以前と同じ状況 (デバイス A で作成されたドキュメント、デバイス B で変更された...) ですが、デバイス A は単にオフラインではなく、デバイス B で変更が行われている間に TheApp が完全にシャットダウンされました。その場合、TheAppデバイス A では、ドキュメントを再度起動した後、ドキュメントを再作成/再度開く必要があります。この場合、どうすればよいでしょうか?

いくつかのテストを実行しましたが、結果は常に同じではありませんでした。場合によっては、ドキュメントが「古い」バージョンで開始され、その後変更の通知を受け取りました。それ以外の場合、ドキュメントはすべての変更が反映された新しいバージョンで直接開始されました。私のアプリでは、最初のケース (古いバージョンで開始し、更新通知を受け取る) の方が適していますが、いずれかの動作を強制することはできませんでした。これは機能するはずでしたか?

どうもありがとうございました!

0 投票する
0 に答える
388 参照

ios5 - UIManagedDocument をサンドボックスから iCloud に移動する

私の全体的な質問はUIMangedDocument、ローカル サンドボックスから iCloud に既存の (コア データ SQL ストアを含む) を移動する方法です。

私がオンラインで読んでいるものはすべて、 を使用するように言っていNSFileManagerますsetUbiquitous:itemAtURL:destinationURL:error:。ただし、これを行うと、それがクラウドにコピーされることに気付きましたpersistantStoreが、これは間違っていると思います。このことを熟考した後、クラウドで新しいドキュメントを作成し、既存のレコードを手動で挿入する必要があると考え始めています (サンドボックス内の既存のデータベースにはトランザクション ログがないため)。

それで、私の考え方は正しいですか、それともpersistantStoreそこにコピーされた を出発点として使用しますか (別のデバイスが接続されている場合はpersistantStore、ベースとして をダウンロードし、その後に発生した新しいトランザクションを適用します)?

関連する二次的な質問 (仕組みの理解を確認するためUIManagedDocument) として、(クラウドで) ドキュメントを作成し、レコードを追加して同じレコードを 100,000 回更新し、このドキュメントを新しいデバイスで開いた場合、 100,001 件のトランザクションを新しいデータベースに適用する必要がありますか? 頻繁に使用されているドキュメントは、ドキュメントのデータが最小限で更新が多い場合でも、クラウド上のスペースを消費し続けるようです。

0 投票する
2 に答える
1562 参照

core-data - UIManagedDocument-UIDocumentStateSavingErrorを処理する方法は?

私は最初のiCloudアプリに取り組んでいます。しばらく作業した後、「UIDocumentStateSavingError」が原因で、アプリはUIManagedDocumentにアクセスできなくなります。発生したエラーを実際に確認する方法はありますか?

これは、UIManagedDocumentを作成するための私のコードです。

ドキュメントはすでに存在するため、openWithCompletionHandler:がドキュメントで呼び出されます。これは失敗し、UIDocumentStateChangedNotificationが発生して、5のドキュメント状態が表示されます:UIDocumentStateClosedおよびUIDocumentStateSavingError

この後、完了ブロックが呼び出されます。ここから先に進む正しい方法は何ですか?何がうまくいかず、どのようなエラーが発生したかを知る方法はありますか?

完了ブロックでドキュメントを再度開こうとしましたが、結果は同じです。

ファイルを削除して再作成するだけで問題は解決できると思います。しかし、アプリがストアに出たら、これは明らかにオプションではありません。何が問題になっているのかを知り、ユーザーに問題を処理するための適切な方法を提供したいと思います。

UIDocumentStateSavingErrorを処理する他の質問(多くはありません)をここですでに確認しましたが、ここでの問題には当てはまらないようです。

問題が何であるかをどのように見つけることができるか考えていますか?APIが「保存中に問題が発生しましたが、何を教えません!」と言っているとは信じられません。

0 投票する
2 に答える
1624 参照

core-data - iOS5でUIManagedDocumentと親/子コンテキストを使用してコアデータのバックグラウンドをインポートする

UITableViewiOS 5に、XMLからデータをダウンロードし、テーブルビューコントローラーを使用してそれらを表示するカタログアプリケーションがありますNSFetchedResultsController。データはCoreDataに保存されますUIManagedDocument。データのダウンロードとインポート時にメインキューをブロックしたくないため、データをダウンロードするためのバックグラウンドキューと、親としてデータをインポートするための新しい子NSManagedObjectContextを作成しました。データのインポートが完了すると、子コンテキストで変更が行われ、変更が親コンテキストに伝播されます。カタログを閲覧するとき、必要に応じて追加のデータをインポートします。が自動保存されるまで、すべてが正常に機能しています。NSPrivateQueueConcurrencyTypedocument.managedObjectContext-save:UIManagedDocument

-com.apple.CoreData.SQLDebug 1ドキュメントが自動保存されるタイミングを確認するために、コアデータのSQLデバッグをオンにしました。

重複するIDを持つドキュメントの自動保存オブジェクトが作成された後document.managedObjectContext(すべてのエンティティIDデータベースには一意のIDパラメーターがあります)。

私は何が間違っているのですか?


問題を再現するための簡単なサンプルコードを作成しました。
コードは次のとおりです。http: //dl.dropbox.com/u/20987346/ViewController.m
完全なXcodeプロジェクトは次のとおりです。http://dl.dropbox.com/u/20987346/CoreDataTest.zip

以下は、バックグラウンドでインポートを実行しているメソッドです。

このメソッドは2つのエンティティをインポートします。-entityWithID:指定されたID属性を持つエンティティをフェッチし、存在しない場合は、を使用してエンティティを作成しますNSEntityDescription -insertNewObjectForEntityForName:。ログに記録するすべての-dumpEntitiesInManagedObjectContext:エンティティをダンプします(インポートコンテキストで1回、ドキュメントのコンテキストで1回)。

問題は、ドキュメントが自動保存され、追加のインポートが行われると、ログに次のように表示されることです。

インポートコンテキストには10​​個のエンティティがありますが、メインコンテキストには11個のエンティティがあり、ID12のエンティティは重複しています。古いオブジェクトは親コンテキストで変更されていないようですが、代わりに追加されています。