2

JSON を Core Data に保存しようとしたときに発生した問題は、リスト ビューにデータを入力するのではなく、null オブジェクトを取得することです。これは私のJSON形式です:

[{"nid":"23","name":"JN01"},{"nid":"24","name":"JN02"}]

これは私のコードです

jsonToArray.h

#define JSON_NAME @"name"
#define JSON_NID @"nid"
@interface JSONToArray : NSObject
@property (nonatomic, copy) NSString *nid;
@property (nonatomic, copy) NSString *name;
+ (void)showNetworkError:(NSString *)theMessage;
+ (NSArray*)retrieveJSONItems;

jsonToArray.m

+ (NSArray*)retrieveJSONItems { //skipped a few boring lines
NSArray *json = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:url]
                                                options:kNilOptions
                                                  error:&err];
return json;}

Job+Json.h //Job- my entity

+ (Job *)appsWithJSONInfo:(NSDictionary *) nbJSONInfo
inManagedObjectContext:(NSManagedObjectContext *)context;
+ (Job *)appsWithID:(NSString *)newID inManagedObjectContext:(NSManagedObjectContext *)context;

Job+Json.m

#import "Apps+JSON.h"
#import "JSONToArray.h"

@implementation Job (JSON)

+ (Job *)appsWithJSONInfo:(NSDictionary *) nbJSONInfo
inManagedObjectContext:(NSManagedObjectContext *)context {

Job *apps = nil;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Job"];
request.predicate = [NSPredicate predicateWithFormat:@"nid=%@", [nbJSONInfo objectForKey:JSON_NID]];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];

if (!matches || ([matches count] > 1)) {
    [JSONToArray showNetworkError:@"There was an error retrieving the json Data."];
} else if ([matches count] == 0) {
    apps = [NSEntityDescription insertNewObjectForEntityForName:@"Job" inManagedObjectContext:context];
    apps.nid = NSLocalizedString([nbJSONInfo objectForKey:JSON_NID], nil);
    apps.name = NSLocalizedString([nbJSONInfo objectForKey:JSON_NAME], nil);



}else {
    apps = [matches lastObject];
}

return apps;
}

+ (Job *)appsWithID:(NSString *)newID
            inManagedObjectContext:(NSManagedObjectContext *)context
{
Job *app = nil;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Job"];
request.predicate = [NSPredicate predicateWithFormat:@"nid = %@", newID];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSError *error = nil;
NSArray *apps = [context executeFetchRequest:request error:&error];

if ([apps count] == 0) {
    app = [NSEntityDescription insertNewObjectForEntityForName:@"Job"
                                        inManagedObjectContext:context];
    app.nid = NSLocalizedString(newID, nil);
} else if ([apps count] >=1) {   
    app = [apps lastObject];
}
return app;
}

そして最後に私のリストビュー:

- (void)viewWillAppear:(BOOL)animated{
[self fetchJSONDataIntoDocument:self.managedObjectContext];}

- (void)fetchJSONDataIntoDocument:(NSManagedObjectContext *)managedObjectContext{    
NSArray * tempArray = [JSONToArray retrieveJSONItems];
for (NSDictionary *JSONInfo in tempArray) {
[Job appsWithJSONInfo:JSONInfo inManagedObjectContext:managedObjectContext];

}

NSError *error = nil;
if (![managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
}

したがって、この場合、リスト ビューに 2 つのオブジェクトが表示されますが、それらは null で値がありません。どうすれば修正できますか?

4

1 に答える 1

0
  • > IOS5.0 向けに開発していますか?

  • kNilOptionsの代わりにNSJSONReadingMutableLeavesを使用します

    [NSJSONSerialization JSONObjectWithData:returnData オプション:NSJSONReadingMutableLeaves エラー:&error];

于 2012-09-09T14:14:15.570 に答える