核心数据:获取

时间:2013-02-11 03:21:58

标签: ios uitableview core-data nsfetchrequest nsfetchedresultscontroller

我有5个屏幕。每个屏幕都有用户选择的选项,即通过Time&日期选择器,以及用户将键入的一些UIField。所以我创建了一个实体并添加了所有属性(25)。我创建了一个名为LM

的NSObjectSubClass

在每个场景中我都在做以下事情:

@property (nonatomic, strong) LM *lMData;

NSString *date = [[NSString alloc] initWithFormat:@"%@", [dateFormatter stringFromDate:selectedDate]];
            DateLabel.text = date;
            self.lMData.dateLabel = date;

self.lmData.nameField5 = UITextFieldName5.text;

在用户观看下一个屏幕之前,我有:

NSError *error;
NSManagedObjectContext *context = self.managedObjectContext;

 if (![context save:&error])
      {
           NSLog(@"There was an error in Save:%@",error);
      }

现在要获取,我想要做的就是在自定义的UITableViewController中显示数据。这有12个部分,每个部分将显示2个单元格。我真的不需要排序。我只想让细胞出现在正确的部分。

要获取,我有以下方法:

-(NSFetchedResultsController *) fetchResultsController
{
    if (_fetchResultsController !=nil)
{
    return _fetchResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"LM"
                                          inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"startTimeLabel" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

_fetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

return _fetchResultsController;

}

从我读到的内容来看,为了让我获取,我必须排序,因此,以下一行:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"startTimeLabel"

我的实体中有一个名为“startTimeLabel”的属性。但我在那里有它,因为我被迫排序。但是,我真的不需要排序。

现在显示,此时没有显示任何内容:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

  return [[self.fetchResultsController sections] count];   //I need 10 sections here;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    id<NSFetchedResultsSectionInfo> secInfo = [[self.fetchResultsController   sections]objectAtIndex:section];
    return [secInfo numberOfObjects]; //I need 2 rows in each section here
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    LM *letsMeetData = [self.fetchResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = letsMeetData.dateLabel;

    return cell;
}

问题:

  1. 我的代码是保存和获取正确吗?

  2. 我可以做些什么来摆脱排序?我不需要排序。

  3. 我知道我在UITableView中显示获取数据的代码是错误的。请指教。

  4. 最后,我还需要将每个表单保存为对象,以便用户以后可以将它们拉出来。我是否需要创建另一个实体来存储LM对象?

  5. 由于

1 个答案:

答案 0 :(得分:0)

嘿,要使用coredata,您需要从NSManagedObject创建一个Entity类。

(1)您可以使用实体类保存和检索数据。

LM_Entity *lm = [NSEntityDescription insertNewObjectForEntityForName:@"LM_Entity" inManagedObjectContext:self.managedObjectContext];
//Your code
lm.nameField5 = UITextFieldName5.text;
//Now save
[self.managedObjectContext save:&error];

检索使用时

NSEntityDescription *entity = [NSEntityDescription entityForName:@"LM_Entity"
                                      inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

(2)需要在使用 NSFetchedResultsController 时指定排序描述符。

(3)您的代码对于显示提取的数据是正确的

(4)是的,你需要创建一个Entity类来保存和检索数据。(见1)。

关注此tutorial,了解有关coredata的更多信息。