CoreData,我的实体是空的..为什么?

时间:2012-04-30 09:19:21

标签: objective-c core-data entity

你可以帮帮我,告诉我为什么我的实体是空的吗?

我用我的JSON填充我的实体,我的实体的属性与我的JSON中的名称相同

这是我填充我的实体的代码:

  NSManagedObjectContext *cxt = [self managedObjectContext];
    NSManagedObject *newBoxes = [NSEntityDescription insertNewObjectForEntityForName:@"Boxes" inManagedObjectContext:cxt];
    NSDictionary *parsedFeed = [[newBoxes entity] attributesByName];
    for (NSString *key in parsedFeed) {
        id value = [parsedFeed objectForKey:key];
        // Don't assign NSNull, it will break assignments to NSString, etc.
        if (value && [value isKindOfClass:[NSNull class]])
            value = nil;

        @try {
            [Boxes setValue:value forKey:key];
        } @catch (NSException *exception) {
            // Exception means such attribute is not defined in the class or some other error.
        }
    }

    NSError *err;
    if (![cxt save:&err]) {
        NSLog(@"An error has occured: %@", [err localizedDescription]);
    }



NSLog(@"ENTITY  %@", newBoxes);

这是我的NSLOG的结果:

2012-04-30 11:16:23.352 Wonder[9987:fb03] ENTITY  <Boxes: 0x6d87330> (entity: Boxes; id: 0x6d8b010 <x-coredata://EFDCC0BA-644D-42AC-8DE8-452F02B7C680/Boxes/p26> ; data: {
    codeArticle = nil;
    descriptionBox = nil;
    dlu = 0;
    kindBox = nil;
    nameBox = nil;
    nbActivities = 0;
    note = 0;
    priceBox = 0;
    texteMarketing = nil;
    typeBox = nil;
})

这是我的JSON:

{
    "totalBox":{
        "boxes":[
        {
         "codeArticle": "WPCDE01C412L",
         "nameBox": "boxName",
         "texteMarketing": "boxTextMarketing",
         "descriptionBox" : "boxDescritpion",
         "nbActivities": 1650,
         "kindBox": "boxKind",
         "typeBox": "boxType",
         "priceBox": 20,
         "dlu": 2014,
         "note": 3
        },
        {
         "codeArticle": "BOOYAKA!!",
         "nameBox": "boxNameName",
         "texteMarketing": "boxTextMarketing",
         "descriptionBox" : "boxDescritpion",
         "nbActivities": 1650,
         "kindBox": "boxKind",
         "typeBox": "boxType",
         "priceBox": 39,
         "dlu": 2014,
         "note": 3
         }
        ]
            }
}

这是我的实体:

enter image description here

编辑:我给了我的JSON,所以我应该“告诉”我的coredata应该读什么来填充我的实体,对吧?

dataToDisplay = [[NSMutableArray alloc] init];

//récupération du chemin vers le fichier contenant le JSON
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"JSON" ofType:@"txt"];

//création d'un string avec le contenu du JSON
NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];   

//Parsage du JSON à l'aide du framework importé
NSDictionary *json    = [myJSON JSONValue];

//récupération  du total des Boxes
NSDictionary *resultats    = [json objectForKey:@"totalBox"];

2 个答案:

答案 0 :(得分:2)

  

我用我的JSON填充我的实体,我的实体的属性与我的JSON中的名称相同

不在您在问题中发布的任何代码中。

这一行:

NSManagedObject *newBoxes = [NSEntityDescription insertNewObjectForEntityForName:@"Boxes" inManagedObjectContext:cxt];

创建一个新的托管对象。没有数据。

此代码:

NSDictionary *parsedFeed = [[newBoxes entity] attributesByName];

获取托管对象的所有属性名称和属性描述的字典。这是模型的一部分。我不知道你为什么还要打扰它。

此代码

for (NSString *key in parsedFeed) {
    id value = [parsedFeed objectForKey:key];
    // Don't assign NSNull, it will break assignments to NSString, etc.
    if (value && [value isKindOfClass:[NSNull class]])
        value = nil;

    @try {
        [Boxes setValue:value forKey:key];
    } @catch (NSException *exception) {
        // Exception means such attribute is not defined in the class or some other error.
    }
}

非常离奇。您可以访问属性描述(告诉Core Data,例如属性是字符串,数字等),然后在Boxes中将该键设置为该值。我猜Boxes是您为模型框创建的NSManagedObject的子类。如果你还没有决定捕获异常,我猜你的代码会因为“不响应选择器”而崩溃。

基本上,你在代码中所做的一切都没有任何意义。您需要做的是获取JSON的NSDictionary,请参阅NSJSONSerialization,并使用您当前使用parsedFeed的地方。然后您的代码会或多或少地起作用(将Boxes替换为newBoxes。但是,我会建议进行一些修改:

NSDictionary *parsedFeed = [NSJSONSerialization JSONObjectWith....]; // can use an NSData or a stream
for (NSString *key in parsedFeed) {
    id value = [parsedFeed objectForKey:key];
    // Don't assign NSNull, it will break assignments to NSString, etc.
    if ([value isEqual:[NSNull null]]) // nil is already handled OK
        value = nil;

    if ([legalKeys containsObject: key]) // see comment below
    {
        [newBoxes setValue: value forKey: key];
    } 
    else
    {
        // report bad data
    }       
}

legalKeys是您在源代码中创建的一个集合,用于说明可以从JSON合法设置哪些密钥,这可能来自外部。这是一种验证形式,可防止不应​​设置的密钥由错误数据设置。例如,NSObject有一个名为scriptingProperties的属性。您可能不希望传入的JSON设置它。

答案 1 :(得分:1)

在上面的代码中,您尝试在非对象上设置值。

[Boxes setValue:value forKey:key];

应该是

[newBoxes setValue:value forKey:key];

我建议您查看http://rentzsch.github.com/mogenerator/这篇关于JSON和CoreData的超级实用文章http://www.cimgf.com/2012/01/11/handling-incoming-json-redux/

干杯 mbogh