开发者

Core Data returning NSArrays instead of NSStrings

开发者 https://www.devze.com 2023-03-17 22:17 出处:网络
For some reason all of the NSString typed attributes are being returned as NSArrays in my Article object.Here\'s my function to retrieve them:- (NSArray *)getSavedArticles

For some reason all of the NSString typed attributes are being returned as NSArrays in my Article object. Here's my function to retrieve them:

- (NSArray *)getSavedArticles
{
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    NSError *error = nil;
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Article" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *dateSort = [NSSortDescriptor sortDescriptorWithKey:@"last_opened" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:dateSort]];
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    return fetchedObjects;
}
I have not created a NSManagedObjectModel for these, and instead I'm just accessing them using KVO.

//self.data has the array returned from getSavedArticles
NSManagedObject *object = [self.data objectAtIndex:indexPath.row]; 
NSString *path  = [object valueForKey:@"path"];
NSString* id      = [object valueForKey:@"id"];

When I look at this in the variables pane, on path and id I see (__NSArrayI *) ... Variable is not a CFString. Printing the description of either of these also prints out the parenthesis used when printing arrays.

I'm just wondering if this could be due to the sort descriptor? I have double checked that the data going into these objects is typed correctly, and the SQLite database that I'm using to backup everything is displaying strings.

I have tried re-installing the app in the simulator, and resetting it. I still get a NSArray instead of a NSString.

I really don't know what's going on here. Any help would be appreciated.

EDIT: I just found something else interesting. I do another check to see if an Article has been saved, and this time I don't get a NSArray for the article path:

- (NSString *)hasArticleSaved:(NSString *)id
{
    NSString *path = nil;
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", @"id", id]];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Article" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSError *error = nil;
    NSArray *fetchedObjects = [[self managedObjectCont开发者_如何学Cext] executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects.count > 0) {
       NSManagedObject *savedArticle = [fetchedObjects objectAtIndex:0];
        path = [savedArticle valueForKey:@"path"];
    }
    return path;
}

Now I'm really confused. Any takers?


Your problem is here:

[self.data objectForKey:indexPath.row]

...because objectForKey: is looking for a string key name e.g. "path" or "id". Giving it an integer will produce an error or a random return.

Instead, you want:

[self.data objectAtIndex:indexPath.row]

... which will return the managed object at the given index in the array.


I found the issue. I had changed the data structure for my table so self.data is an array of arrays...and with only 1 object it looked like I was getting a NSArray back when in fact I was just accessing the data wrong. I just needed to do [[self.data objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

0

精彩评论

暂无评论...
验证码 换一张
取 消