2

SQLite ログを使用して iCloud で動作するようにコア データをセットアップしました。コア データ ログと SQLite ログの両方を有効にし、スキーマでレベル 3 に設定しました。ローカル ストアまたはクラウドからデータを取得または配置する際にエラーが発生するものはありません。お店。

私のローカル ストアはすべての SQLite データを格納しますが、クラウド ストアは 2 つのエンティティのみを移動するように構成されています。これは、すべてのローカル ストアを更新する必要がないためです。

永続ストアをログに記録すると、両方が表示されます。

developer.icloud.com には、データを保存するためのフォルダーがあり、2 つのサブフォルダー (iPad 用と iPhone 用) があります。これらの各フォルダーには、2 つのサブフォルダーと 1 つのreceipt.0.cdtファイルがあります。

すべてがセットアップされているように見えますが、アプリケーション内の 2 つのエンティティのいずれかを操作すると、NSPersistentStoreDidImportUbiquitousContentChangesNotification(どちらのデバイスでも) 起動されません。

ローカル データ ストア (すべてのエンティティのローカル コピーを保持する) が更新され、この変更が UI に反映されていても。

操作されているストアは次のとおりです (操作が発生している間にログに記録されます)

2013-03-03 22:02:49.826 Clueless[1168:907] MOC P-Stores: (
        "<NSSQLCore: 0x1d5b1180> (URL: file://localhost/private/var/mobile/Library/Mobile%20Documents/<id~com~company~appname>/Data.nosync/CategoryModel.sqlite)",
        "<NSSQLCore: 0x1d5ca280> (URL: file://localhost/var/mobile/Applications/EEBE0D5E-1AC0-4A11-AA4B-FB9A63A7F95A/Documents/CategoryModel.sqlite)"
    )

以下は、エンティティを操作した後に生成されたデータのログです。

2013-03-03 22:02:49.836 Clueless[1168:907] CoreData: sql: BEGIN EXCLUSIVE
2013-03-03 22:02:49.839 Clueless[1168:907] CoreData: sql: UPDATE ZIMAGEANSWERAVAILABILITY SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.842 Clueless[1168:907] CoreData: details: SQLite bind[0] = (int64)2
2013-03-03 22:02:49.844 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)18
2013-03-03 22:02:49.845 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)1
2013-03-03 22:02:49.851 Clueless[1168:907] CoreData: sql: UPDATE ZIMAGEANSWERAVAILABILITY SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.861 Clueless[1168:907] CoreData: details: SQLite bind[0] = (int64)2
2013-03-03 22:02:49.863 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)13
2013-03-03 22:02:49.865 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)1
2013-03-03 22:02:49.866 Clueless[1168:907] CoreData: sql: UPDATE ZSYMBOL SET ZANSWERSTATE = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.868 Clueless[1168:907] CoreData: details: SQLite bind[0] = 2
2013-03-03 22:02:49.870 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)2
2013-03-03 22:02:49.875 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)8
2013-03-03 22:02:49.878 Clueless[1168:907] CoreData: details: SQLite bind[3] = (int64)1
2013-03-03 22:02:49.880 Clueless[1168:907] CoreData: sql: COMMIT
2013-03-03 22:02:49.909 Clueless[1168:907] CoreData: sql: pragma page_count
2013-03-03 22:02:49.911 Clueless[1168:907] CoreData: annotation: sql execution time: 0.0026s
2013-03-03 22:02:49.913 Clueless[1168:907] CoreData: sql: pragma freelist_count
2013-03-03 22:02:49.915 Clueless[1168:907] CoreData: annotation: sql execution time: 0.0021s

データストアへのデータのロードまたは追加時にエラーが発生しないため、これは本当に困惑しているため、理論的には機能するはずです。

手伝ってくれてどうもありがとう!!

4

2 に答える 2

0

データベース ストアが iCloud 用に作成されているように見えますが、そこには何も入っていません。

Receipt.0.cdt ファイルは、iCloud を介してそのアプリを使用する各デバイスのトランザクション ログ フォルダーに表示されますが、最初 (ストアの作成時、または別のデバイスから既存のストアへの接続時) にのみ表示されます。実際にデータを含むトランザクション ログには、次のような名前が付けられます。

FFFE99DC-87D7-5CBE-BFD8-32E11-D3E934.1.cdt

そのトランザクションで挿入/更新/削除されたレコードの数などに比例するサイズです。これらのトランザクション ログは、それらのトランザクションを生成したデバイスに関連する iCloud デバイス フォルダに表示されます。

そのアプリの iCloud に接続しているが、独自のトランザクションを実行していないデバイスには、receipt.0.cdt ファイルが含まれているだけです。

recip.0.cdt を解凍すると、最終的にテキスト ファイルが作成されます。これには、これらのトランザクション ログが生成されたデバイスへの参照が含まれているように見えます (最初は空ですが)。

mobile.DEVICE_ID:NUMBER_OF_TRANSACTIONS

そして、これは次のように成長します。

mobile.DEVICE_TWO:2:mobile.DEVICE_ONE:4

したがって、recept.0.cdt は、iCloud 内のそのストアに接続された各デバイスに対して記録されたトランザクション数の単なるハウスキーピング リファレンスです。

実際にデータをiCloudストアに入れていること(正しいコンテキストを使用している、ローカル ストアのコンテキストと混同していないなど) を確認してから、実際に保存することに集中してください。

それでもうまくいかない場合は、iCloud コンテナー全体を吹き飛ばして、ユビキタス ストア内で何か問題が発生した場合に備えて、最初からやり直してください (ほぼすべての Core Data iCloud の難問に対する標準的な対応です!)。

于 2013-03-16T14:41:58.717 に答える