メッセージを管理するアプリを開発しています。アプリをサーバーに接続し、メッセージを取得してデータベース (coredata) に保存します。メッセージが既に存在する場合は何もせず、存在しない場合はデータベースに追加します。
いろいろと考えているのですが、具体的にどうすればいいのかわかりません。何か助けはありますか?前もって感謝します
メッセージを管理するアプリを開発しています。アプリをサーバーに接続し、メッセージを取得してデータベース (coredata) に保存します。メッセージが既に存在する場合は何もせず、存在しない場合はデータベースに追加します。
いろいろと考えているのですが、具体的にどうすればいいのかわかりません。何か助けはありますか?前もって感謝します
Restkit フレームワークhttp://restkit.org
を使用することをお勧めし
ます。Reskit は Core Data との統合を提供します。
Restkit を使用する利点:
- HTTP 要求/応答 API と、オブジェクト マッピング、コア データによるオフライン/キャッシュ サポートをすべて 1 つのフレームワークに結合します
- オブジェクト マッピングとは、クリーンなコードを記述し、クラスとそのマッピング方法を定義することを意味しますJSON 属性に追加し、その後数行のコードで GET/POST/DELETE を実行します
- コア データのサポートは、プロジェクトがオフラインで作業できることを意味します。データはオンラインで作業するときに同期されますが、オフラインで必要な場合は永続的です
- フレームワークは適切です
短所:
- JSON REST API でのみ動作します-
一部の側面については、急な学習曲線が存在する可能性があります
- 完全に「標準」ではない REST API を使用する場合、困難になる可能性があります
これは簡単です。これを学ぶのに少し時間がかかりました。ほとんどのアプリで使用しています。
まず、取得したアイテムの ID (messageID など) が必要です。AFNetworking などを使用して、すべての項目を含む JSON をフェッチすると、NSDictionaries 内のオブジェクトの配列を受け取ることになります。
アイテムを解析する前に、格納されているアイテムのすべての ID を NSMutableDictionary にロードします (キー => メッセージ ID、値 objectID、これは Core Data 障害に関連しています)。
どこかで NSMutableArray を初期化することを忘れないでください:
_dictionaryOfEventIDAndObjectID = [NSMutableDictionary dictionary];
- (void)prepareDictionaryOfMessageIDs
{
[self.dictionaryOfEventIDAndObjectID removeAllObjects];
NSError *error = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Message"];
[fetchRequest setResultType:NSDictionaryResultType];
NSExpressionDescription *objectIDDescription = [[NSExpressionDescription alloc] init];
objectIDDescription.name = @"objectID";
objectIDDescription.expression = [NSExpression expressionForEvaluatedObject];
objectIDDescription.expressionResultType = NSObjectIDAttributeType;
[fetchRequest setPropertiesToFetch:@[objectIDDescription, @"messageID"]];
NSArray *objectsDict = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (NSDictionary *objectDict in objectsDict) {
[self.dictionaryOfMessageIDAndObjectID setObject:[objectDict valueForKeyPath:@"objectID"] forKey:[objectDict valueForKeyPath:@"messageID"]];
}
}
次に、フェッチされたデータ補完ブロックに次のようなものを追加します。
for (NSDictionary *objectDict in objectsDict) {
NSString *fetchedID = [objectDict objectForKey:@"id"];
if ([self.dictionaryOfMessageIDAndObjectID objectForKey:fetchedID]) {
continue;
}
[self parseMessageFromDictionary:objectDict];
}
最も簡単な方法は、関心のあるエンティティにguid属性 (NSString
たとえば、 type の識別子)を追加し、データをインポートするときにその guid を確認することです。
ここでは、サーバーに GUID を生成させる方法と、クライアント側 (iPhone、iPad など) に独自のアルゴリズムを実装させる方法の 2 つがあります。どちらの場合も、GUID がメッセージごとに一意であることを確認する必要があります。
たとえば、サーバーがメッセージを生成するとします (各メッセージには独自の GUID があります)。データをインポートすると、各メッセージ オブジェクトの GUID も保存されます。特定の GUID を持つメッセージが既にある場合は追加しません。それ以外の場合は追加します。これは、 Find-or-Createパターンを使用して実行できます ( Implementing Find-or-Create Efficiently を参照)。
それが役立つことを願っています。