DKM
DKM

Reputation: 270

Core data returns empty strings and content

I'm trying to populate my tableView with storaged data in CoreData. When tableView is trying to populate it's cells the name and also date of fields in cell are empty. Size of NSMutableArray created from NSArray like so:

-(void)copyArrayToTableMutableArray:(NSArray *)coreDataArray
{
    if(self.fetchedRecordsArray != nil)
    {

        modelArray = [NSMutableArray arrayWithArray:coreDataArray];
        NSLog(@"%d", [modelArray count]);
    }
}

shows that there are for example 3 items. When program goes to populate section it creates cell but they are empty. This is code for populating:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"SimpleTableItem";

    CustomTableCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    if([modelArray count] > 0)
    {

            Kwejki *tmpModel = [modelArray objectAtIndex:indexPath.row];
//Here it is empty NULL
            NSLog(@"%@",[tmpModel name]);
            cell.titleOfCell.text = [tmpModel name];
            cell.dateOfAddedCell.text = [[tmpModel date] stringValue];

    }
    return cell;
}

And I'm saving new item to the CoreData like this:

-(void)addNewPosition:(ScrollViewViewController *)ScrollController recentlyDownloadedItem:(KwejkModel *)modelTmp
{
    NSLog(@"DODAJE NOWA POZYCJE");
    NSLog(@"%@",[modelTmp description]);
    NSLog(@"%d", [modelArray count]);
    //[self.tableView reloadData];


    Kwejki * newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Kwejki" inManagedObjectContext:self.managedObjectContext];
    NSLog(@"%@", [modelTmp getNameOfItem]);

    newEntry.name = [[NSString alloc] initWithString:[modelTmp getNameOfItem]];
    newEntry.rating = [modelTmp getRateOfPosition];
    newEntry.urlMain = [modelTmp getUrlAdress];
    newEntry.contentUrl = [modelTmp getContentUrl];
    newEntry.coverUrl = [modelTmp getCoverImage];
    newEntry.date = [modelTmp getDateOfItem];



    NSError *error;
    if (![self.managedObjectContext save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }
    else{
        NSLog(@"UDALO SIE!!!");
    }


    [modelArray insertObject:newEntry atIndex:0];
    [self.tableView reloadData];
}

I've searched around but haven't founded why it is empty. Do you know why?

Upvotes: 0

Views: 62

Answers (2)

Mundi
Mundi

Reputation: 80265

For Core Data populated table views you should be using a NSFetchedResultsController. Then you can retrieve your object reliably with

Kwejki *item = [self.fetchedResultsController objectAtIndexPath:indexPath];

The following is not recommended:
If you really want to stick to your ill-advised array solution, it would help to make sure you have a property or instance variable. Clearly, in cellForRowAtIndexPath your array has already been deallocated.

@property (nonatomic, strong) NSMutableArray *modelArray; 

Upvotes: 1

turboc
turboc

Reputation: 153

It doesn't look like you are using UIManagedDocuments so you may need to put a [self.managedObjectContext save] in add new position after you populate your newentry fields. I know you shouldn't have to do this that the data is there in memory, but if you are using different contexts in your insert and in your fetches, you wouldn't see the data until a save was done on it. It may not help, but give it a try.

Upvotes: 1

Related Questions