核心数据返回空字符串和内容

Posted

技术标签:

【中文标题】核心数据返回空字符串和内容【英文标题】:Core data returns empty strings and content 【发布时间】:2014-07-19 23:07:41 【问题描述】:

我正在尝试使用 CoreData 中存储的数据填充我的 tableView。当 tableView 试图填充它的单元格时,单元格中字段的名称和日期都是空的。从 NSArray 创建的 NSMutableArray 的大小如下:

-(void)copyArrayToTableMutableArray:(NSArray *)coreDataArray

    if(self.fetchedRecordsArray != nil)
    

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

显示例如有 3 个项目。当程序进入填充部分时,它会创建单元格,但它们是空的。这是填充代码:

-(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;

我正在像这样将新项目保存到 CoreData:

-(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];

我已经四处搜索,但没有找到为什么它是空的。你知道为什么吗?

【问题讨论】:

你能粘贴modelArray = [NSMutableArray arrayWithArray:coreDataArray]; NSLog(@"%d", [modelArray count]);的输出吗 您的newEntry 属性是否在addNewPosition 中正确填充?您是否尝试在设置后记录它们? 是的,我已经记录了它们并设置了属性。 @codester NSLog 显示项目数 = 5。总是比以前多一个。 tmpModel 不是nil tmpModel 不为空 【参考方案1】:

对于核心数据填充表视图,您应该使用NSFetchedResultsController。然后您可以使用

可靠地检索您的对象
Kwejki *item = [self.fetchedResultsController objectAtIndexPath:indexPath];

以下不推荐: 如果你真的想坚持你不明智的数组解决方案,那么确保你有一个属性或实例变量会有所帮助。显然,在cellForRowAtIndexPath 中,您的数组已被释放。

@property (nonatomic, strong) NSMutableArray *modelArray; 

【讨论】:

我在这个类中有变量 NSMutable 数组,现在我已经为你的提议改变了它,它也没有帮助。当我保存项目时,它包含所有字符串等,但是当我尝试再次加载它时,它们是空的。 但在代码中执行上述提取后,我得到了 5 个项目,但没有字符串。哪里出错了? 你为什么不想使用NSFetchedResultsController 感谢您的关注。我已经解决了从头开始创建每个想法的问题。我不知道错误在哪里,但它现在正在工作。如果对帖子不感兴趣,请见谅。 好的,如果您不介意,请接受此答案,向其他用户展示解决此问题的首选方法。【参考方案2】:

您似乎没有使用 UIManagedDocuments,因此您可能需要在填充新条目字段后将 [self.managedObjectContext save] 放在添加新位置。我知道你不应该这样做,因为数据存在于内存中,但如果你在插入和提取中使用不同的上下文,在保存数据之前你不会看到数据。这可能没有帮助,但请尝试一下。

【讨论】:

以上是关于核心数据返回空字符串和内容的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库空字符串和空字符串比较的问题

区分空字符串和null

Oracle 11 PL/SQL:检查变量是不是为空、空字符串和无结果

数据结构与算法(C#)入门 --- 串和数组

如何合并空字符串和 NULL 值?

oracle存空字符串怎么会变成null