7

双方向のドロップボックス同期アプリを作成しています。コアデータからオブジェクトをロードし、JSONに変換して、ドロップボックスに送信します。ただし、同期するときは、ローカルJSONファイルのセットをドロップボックスJSONファイルと比較します。競合が検出されると、同期ロジックが適用されます。同期ロジックの結果として、リモートJSONファイルがダウンロードされ、ローカルJSONファイルに置き換わる場合があります。

そのため、ローカルドキュメントディレクトリに大量のJSONファイルが作成されます。

RestKitを使用して、定義したマッピングを使用してローカルJSONファイルをオブジェクトに逆シリアル化するにはどうすればよいですか?RKTwitterCoreDataは、WebベースのJSONからコアデータエンティティを作成します。ローカルのJSONファイルでも同じことをしようとしています。

loadObjectsメソッドはたくさんありますが、それらはすべてWeb呼び出しで機能するようです。

- (RKObjectLoader*)loadObjectsAtResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate;

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

4

3 に答える 3

6

これはRest-Kitのドキュメントからのものです。まだ試していませんが、JSON文字列を使用しているため、最初のようです。

ここで見つけることができます: ページの下部を見てください

NSString* JSONString = @"{ \"name\": \"The name\", \"number\": 12345}";
NSString* MIMEType = @"application/json";
NSError* error = nil;
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:MIMEType];
id parsedData = [parser objectFromString:JSONString error:&error];
if (parsedData == nil && error) {
    // Parser error...
}


RKObjectMappingProvider* mappingProvider = [RKObjectManager sharedManager].mappingProvider;
RKObjectMapper* mapper = [RKObjectMapper mapperWithObject:parsedData mappingProvider:mappingProvider];
RKObjectMappingResult* result = [mapper performMapping];
if (result) {
    // Yay! Mapping finished successfully
}

EDIT コンテキストの保存に関するrob5408のメモを参照してください:

 [[RKObjectManager sharedManager].objectStore.managedObjectContext save:&error];
于 2012-05-21T14:12:21.343 に答える
1

「デフォルト」の Restkit 関数とまったく同じ動作をさせたい場合は、- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects それを使用して貴重なobjectsNSArrayを取得できます。

RKObjectMappingResult* result = [mapper performMapping];
NSArray* objects = [result asCollection];
于 2012-10-03T15:54:36.083 に答える
0

これが、CoreDataからJSON、CoreDataへの変換に使用しているものです。

  -(void)deserializeFileAtPath:(NSString*)filePath
{
    DLog(@"Deserialize file: %@",filePath);
    NSError* error = nil;
    NSString *stringJSON = [NSString stringWithContentsOfFile:filePath usedEncoding:nil error:&error];
    if(error)
    {
        NSLog(@"Error reading from file: %@", filePath);
    }

    //restore the dictionary, as it was serialized
    NSDictionary* serializationDictionary =  [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:filePath] options:NSJSONReadingMutableContainers error:&error];

    //Here you must ensure that your object mapping exists
    [CoreDataWrapper setupCoreDataObjectMapping];

//top level object within JSON it will have one entity that you really want to deserialize. Without a wrapper, the mapper would not know what the top level entity really is
    CoreDataWrapper* wrapper = [CoreDataWrapper object];

    RKObjectMapper* mapper;
    error = nil;

//this performs deserialization. if you get errors about designated initializer not being called, you have setup a wrong object mapping. You need to define RKManagedObjectMapping for your core data classes
    mapper = [RKObjectMapper mapperWithObject:serializationDictionary 
                              mappingProvider:[RKObjectManager sharedManager].mappingProvider];
    RKObjectMappingResult* result = [mapper performMapping];

    //top level object within wrapper that holds the real payload
    RealCoreDataEntity* realCoreData = [result asObject];
    realCoreData.wrapper = wrapper;

//just in case
    [[wrapper managedObjectContext]save:nil];

//prints what we got back
    DLog(@"%@", realCoreData);

//prints any nested relationships
    for(NestedRelationshipObject* relationshipEntity in realCoreData.relationship)
    {
        DLog(@"Nested entity:%@", relationshipEntity);
    }

}

ネストされたRestKitオブジェクトモデルを定義する方法は次のとおりです。この構造のJSONファイルが逆シリアル化されると、ネストされたすべての関係が自動的に作成され、管理対象オブジェクトのコンテキストもマージされます。

+(void)setupCoreDataObjectMapping
{

RKObjectManager *objectManager = [RKObjectManager sharedManager ] ;

// Setup our object mappings    
/*!
 Mapping by entity. Here we are configuring a mapping by targetting a Core Data entity with a specific
 name. This allows us to map back Twitter user objects directly onto NSManagedObject instances --
 there is no backing model class!
 */
//********************************    
RKManagedObjectMapping* nestedRelationshipMapping = [RKManagedObjectMapping mappingForEntityWithName:@"NestedRelationshipObject"];
//UUID determines which objects get updated and which ones get created during the mapping process
nestedRelationshipMapping.primaryKeyAttribute = @"uuid";
[nestedRelationshipMapping mapKeyPathsToAttributes:
 @"IKeepTheseTheSame", @"IKeepTheseTheSame",
 @"AnotherValue",@"AnotherValue",
 //keep adding your attributes
 nil];
[objectManager.mappingProvider addObjectMapping:nestedRelationshipMapping];




//********************************    

RKManagedObjectMapping* mainPayloadMapping = [RKManagedObjectMapping mappingForEntityWithName:@"RealCoreDataEntity"];
mainPayloadMapping.primaryKeyAttribute = @"uuid";
[mainPayloadMapping mapKeyPathsToAttributes:
 @"companyName",@"companyName",
 //keep adding your attributes
 nil];


//this is the main payload. I create all of it's relationships before, and then add them to the mapping.
[mainPayloadMapping mapRelationship:@"relationshipName" withMapping:nestedRelationshipMapping];
[objectManager.mappingProvider addObjectMapping:mainPayloadMapping];


[objectManager.mappingProvider setSerializationMapping:[mainPayloadMapping inverseMapping] forClass:[YourNSManagedObjectSubclass class]];


[objectManager.mappingProvider setMapping:nestedRelationshipMapping forKeyPath:@"mainPayloadToNestedDataRelationshipName"];
[objectManager.mappingProvider setMapping:mainPayloadMapping forKeyPath:@"wrapperToMainPayloadRelationshipName"];


//this is a top level JSON object. It's name will not be identified within the object, but it's relationshipName will be. The result of deserializing this object would be an object that is being wrapped.
RKManagedObjectMapping* wrapperMapping = [RKManagedObjectMapping mappingForClass:[IconFileWrapper class]];
iconWrapperMapping.primaryKeyAttribute = @"uuid";
//    keyPath and attribute names. must be even
[iconWrapperMapping mapKeyPathsToAttributes:@"uuid",@"uuid",nil];
//keep adding your attributes
[iconWrapperMapping mapRelationship:@"relationshipName" withMapping:mainPayloadMapping];

[objectManager.mappingProvider addObjectMapping:wrapperMapping];
[objectManager.mappingProvider setSerializationMapping:[wrapperMapping inverseMapping] forClass:[YourWrapperNSManagedObjectSubclass class]];


}
于 2012-05-21T13:00:18.630 に答える