我需要多个持久性商店吗?

时间:2010-07-07 12:07:07

标签: iphone core-data save

我正在尝试创建一个支持核心数据的列表应用。第一页允许您创建任意数量的列表并命名它们。通过点击第一个视图中的名称,您将进入该实际列表,您可以在该列表中创建该列表中的项目。但是,如果我创建3个列表,它们每个都有相同的数据。每个第一个查看单元是否需要不同的商店?另外,如果我这样做,我如何使用添加的每个新单元创建一个新商店?谢谢你的帮助。!

alt text http://www.tckdeveloper.com/Tutorials/iPhone/Screen%20shot%202010-07-07%20at%208.11.52%20AM.png

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

//This is the second view that holds the list items
RootViewController *secondViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];

secondViewController.managedObjectContext = [self managedObjectContext];

[self.navigationController pushViewController:secondViewController animated:YES];
[secondViewController release];

}

Rootview.m

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[fetchedResultsController sections] count];
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell.
[self configureCell:cell atIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

return cell;
}


- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

// Configure the cell to show the book's title
Book *book = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = book.title;
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
// Display the authors' names as section headings.
return nil;
}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {

    // Delete the managed object.
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

    NSError *error;
    if (![context save:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }
}   
}

2 个答案:

答案 0 :(得分:3)

您不是根据数据的显示方式而是根据数据在逻辑上与自身的关系来设计数据模型。每个实体都应该模拟真实世界的对象,事件或条件,而不考虑数据最终如何显示。

在这种情况下,您正在将书籍和用户提供的这些书籍组织建模到列表中。您需要一个书籍实体来为书籍建模,并需要一个列表实体来为用户组织建模。 (它不一定是“列表”,它可以是“集合”,“架子”等,取决于你想要建模的东西。)

据推测,每本书可以在不同的列表中,每个列表可能包含很多书。

Book {
    author:string;
    copyright:sting/date;
    item:(?);
    title:sting;
    list<<-(optional,nullify)-->>list.books
}

List {
    name:string;
    books<<--(optional,nullify)-->>book.list;
}

在您的UI中,您将获取所获取的结果控制器(FRC)获取所有列表实体,然后在表视图中显示每个实体的名称。选择表行时,将推送下一个视图,并将与该行关联的列表对象的list.books返回的NSSet交给它。

在下一个表视图中,每个行都是从传递集中每个图书实体的一个或多个属性填充的。选择行时,您可以推送书籍详细信息视图,并将与所选行关联的书籍实体传递给它。

请注意,从数据模型的角度来看,UI是无关紧要的。您可以在Web视图中显示数据,甚至可以在基于文本的命令行中显示数据。所有关注的数据模型都是实体的内容以及它们之间的 逻辑 关系。

设计数据模型以处理数据中的逻辑关系。一旦这样做,无论格式如何,UI都变得非常简单,因为UI不负责维护数据模型的完整性,数据模型也不必担心UI的状态。

答案 1 :(得分:2)

对于每个添加的单元格,你绝对不需要单独的商店。

您需要一个符合您要求的Datamodel。 列表----- ListEntry。

第一页显示所有“列表”实体,选择列表后,将显示与“列表”相关的所有“ListEntries”。