2

メッセージを管理するアプリを開発しています。アプリをサーバーに接続し、メッセージを取得してデータベース (coredata) に保存します。メッセージが既に存在する場合は何もせず、存在しない場合はデータベースに追加します。

いろいろと考えているのですが、具体的にどうすればいいのかわかりません。何か助けはありますか?前もって感謝します

4

3 に答える 3

2

Restkit フレームワークhttp://restkit.org
を使用することをお勧めし ます。Reskit は Core Data との統合を提供します。

Restkit を使用する利点:
- HTTP 要求/応答 API と、オブジェクト マッピング、コア データによるオフライン/キャッシュ サポートをすべて 1 つのフレームワークに結合します
- オブジェクト マッピングとは、クリーンなコードを記述し、クラスとそのマッピング方法を定義することを意味しますJSON 属性に追加し、その後数行のコードで GET/POST/DELETE を実行します
- コア データのサポートは、プロジェクトがオフラインで作業できることを意味します。データはオンラインで作業するときに同期されますが、オフラインで必要な場合は永続的です
- フレームワークは適切です

短所:
- JSON REST API でのみ動作します-
一部の側面については、急な学習曲線が存在する可能性があります
- 完全に「標準」ではない REST API を使用する場合、困難になる可能性があります

于 2012-11-10T17:01:42.657 に答える
1

これは簡単です。これを学ぶのに少し時間がかかりました。ほとんどのアプリで使用しています。

まず、取得したアイテムの 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];
    }
于 2012-11-10T17:29:08.930 に答える
1

最も簡単な方法は、関心のあるエンティティにguid属性 (NSStringたとえば、 type の識別子)を追加し、データをインポートするときにその guid を確認することです。

ここでは、サーバーに GUID を生成させる方法と、クライアント側 (iPhone、iPad など) に独自のアルゴリズムを実装させる方法の 2 つがあります。どちらの場合も、GUID がメッセージごとに一意であることを確認する必要があります。

たとえば、サーバーがメッセージを生成するとします (各メッセージには独自の GUID があります)。データをインポートすると、各メッセージ オブジェクトの GUID も保存されます。特定の GUID を持つメッセージが既にある場合は追加しません。それ以外の場合は追加します。これは、 Find-or-Createパターンを使用して実行できます ( Implementing Find-or-Create Efficiently を参照)。

それが役立つことを願っています。

于 2012-11-10T17:13:21.153 に答える