ios - 我需要完全废弃我的应用程序来添加核心数据吗?
<p><p>我是一个初学者,当我第一次制作这个应用程序(简单的待办事项列表应用程序)时,我并不了解 Core Data。现在我正在尝试实现 Core Data,但似乎如果我想这样做,我基本上必须完全改变我的应用程序。例如,我使用 Core Data 创建了一个新的 Master Detail 应用程序,并将其与我当前的应用程序进行比较,基本上没有一个是相同的。</p>
<p>一个特别令人困惑的部分是,在我当前的 TableView 中,我有两个部分从两个不同的数组中获取它们的对象。如果我要添加 Core Data,我不知道该怎么做。我是否必须完全消除数组并且只使用 NSFetchedResultsController?此外,在我的应用程序中,我有模态视图 Controller 。在 Master Detail 应用程序中,Core Data 似乎只在 MasterView 中工作。我不知道如何在模态视图 Controller (定义任务对象的值)中实现核心数据。我是否必须在模态视图 controller.h 中再次声明所有 managedObjectContext、managedObject、entityDescription、fetchRequest 等的属性?</p>
<p>如果您愿意,这是我的一些代码:</p>
<p>TableViewController.m</p>
<pre><code>-(NSMutableArray *)taskArray {
if (!taskArray) {
taskArray = ;
}
return taskArray;
}
-(NSMutableArray *)completedArray {
if (!completedArray) {
completedArray = ;
}
return completedArray;
}
-(IBAction)changeSettings:(id)sender{
SettingsViewController *svc = [initWithColor:baseColor];
;
;
;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
cellSubclassCell *cell = ;
if (!cell)
cell = [initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
if( == 0){
cell.textLabel.text = [[] taskName] uppercaseString];
cell.imageView.image = ;
cell.imageView.highlightedImage = ;
;
];
cell.textLabel.textColor = baseColor;
NSString *detailText = [] timeIntervalString];
cell.detailTextLabel.text = detailText;
[ setFont:];
[ setFont:];
;
} else if ( == 1) {
cell.textLabel.text = [[] taskName] uppercaseString];
cell.imageView.image = ;
;
];
cell.textLabel.textColor = baseColor;
NSString *detailText = [] timeIntervalString];
cell.detailTextLabel.text = detailText;
[ setFont:];
[ setFont:];
;
}
UITapGestureRecognizer *tap = [initWithTarget:self action:@selector(handlechecking:)];
//cell.contentView
;
cell.imageView.userInteractionEnabled = YES;
return cell;
}
-(void)handlechecking:(UITapGestureRecognizer *)t{
CGPoint tapLocation = ;
NSIndexPath *tappedIndexPath = ;
NSIndexPath *newIndexPath = nil;
if (tappedIndexPath.section == 0) {
NSUInteger newRowIndex = self.completedArray.count;
];
];
newIndexPath = ;
} else {
NSUInteger newRowIndex = self.taskArray.count;
];
];
newIndexPath = ;
}
;
withRowAnimation:UITableViewRowAnimationAutomatic];
withRowAnimation:UITableViewRowAnimationAutomatic];
;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSInteger num = 0;
if (section == 0) {
num = self.taskArray.count;
} else {
num = self.completedArray.count;
}
return num;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
-(void)buttonPressed:(id)sender{
for(UIView *v in holdViewsArray){
if(button == sender){
;
}
}
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
if (completedArray == nil){
headerView2.hidden = YES;
;
} else {
headerView2.hidden = NO;
;
}
switch (section) {
case 0:
return ;
break;
case 1:
return ;
break;
}
return 0;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
switch (section) {
case 0:
return 60.0;
break;
case 1:
return 43.0;
break;
}
return 0;
}
-(IBAction)addCell:(id)sender{
Properties2ViewController *pvc = [init];
;
;
;
}
-(void)viewWillAppear:(BOOL)animated{
;
[ reloadData];
}
-(void)properties2ViewControllerDidEnterPropertiesSuccesfully:(Tasks *)t{
if (![ isEqual: @""]) {
;
}
;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
Tasks *task = [init];
if (indexPath.section == 0){
task.taskName = [] taskName];
task.timeInterval = [] timeInterval];
task.dateCreated = [] dateCreated];
} else if (indexPath.section == 1){
task.taskName = [] taskName];
task.timeInterval = [] timeInterval];
task.dateCreated = [] dateCreated];
}
DetailViewController *dvc = [init];
;
[ pushViewController:dvc animated:YES];
}
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
if (sourceIndexPath.section == 0){
Tasks *taskToMove = ];
if (sourceIndexPath.row > destinationIndexPath.row) {
;
;
}
else if (sourceIndexPath.row < destinationIndexPath.row) {
;
;
}
} else if (sourceIndexPath.section == 1){
Tasks *completedTaskToMove = ];
if (sourceIndexPath.row > destinationIndexPath.row) {
;
;
}
else if (sourceIndexPath.row < destinationIndexPath.row) {
;
;
}
}
}
-(void)setEditing:(BOOL)editing animated:(BOOL)animated{
;
if (){
for(UIView *v in holdViewsArray){
button.hidden = YES;
}
} else {
button.hidden = NO;
}
}
-(void)loadView{
;
}
-(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{
if (proposedDestinationIndexPath.section != sourceIndexPath.section)
{
return sourceIndexPath;
}
return proposedDestinationIndexPath;
}
-(void)changeBackgroundColor:(UIColor *)c{
baseColor = c;
;
;
button.fillColor = c;
;
}
@end
</code></pre>
<p>基本上,我需要做的就是保存用户添加的对象,并保存用户指定的时间间隔,因为我想为每个对象添加一个计时器(这样如果应用程序关闭,对象是还在那里)。我需要一个完整的核心数据实现来做到这一点吗?我什至需要核心数据吗?我真的很感激一些指导,因为我现在不知道该怎么做。</p>
<p>---编辑---
另一个问题。在添加核心数据之前,我有自定义委托(delegate)将属性从我的模态视图 Controller 发送到我的 TableViewController 。有了核心数据,我还需要这些吗?我想我没有,但有没有办法将属性从一个 ViewController 发送到下一个 ViewController ?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>不,您不必废弃您的申请。然而,Core Data 的学习曲线相当陡峭,对于初学者来说,将其改造成现有的应用程序可能相当困难。</p>
<p>基本上,您需要设置所谓的核心数据堆栈。这只是意味着你有合适的类来使用 Core Data。</p>
<p>我建议在您的 App Delegate(或类似地方)中设置一个 <code>NSPersistentStoreCoordinator</code>、一个 <code>NSPersistentStore</code> 和一个 <code>NSManagedObjectContext</code>。在 Core Data 术语中,持久存储本质上是您的数据库文件。托管对象上下文是您访问该文件中的对象的方式:它的功能类似于暂存器,因此您可以对对象进行更改,并且在您调用 <code>save:</code> 在托管对象上下文中。</p>
<p>让您的 App Delegate 在应用启动时设置这些对象。 (Core Data Xcode 项目模板将为您提供帮助。)然后,访问 Core Data 对象的每个 ViewController 都需要了解您的托管对象上下文。我建议您在每个这样的 ViewController 上定义一个属性。然后,每当您创建 ViewController 时,传入托管对象上下文(因此 App Delegate 将其传递给 Root ViewController ,然后该 ViewController 将其传递给下一个 ViewController ,等等)。</p>
<blockquote>
<p>One especially confusing part is that in my current Table View, I have two sections which get their objects from two different arrays. If I were to add Core Data, I would have no idea how to do so. Would I have to eliminate the arrays completely and only use NSFetchedResultsController?</p>
</blockquote>
<p>您不必这样做,这只是一种不同的模式,您可以根据需要使用。</p>
<p>从本质上讲,<code>NSFetchedResultsController</code> 是一种将 Core Data 查询映射到 TableView 的便捷方式。它做了一些聪明的事情,比如当你的 Core Data 对象改变时让表格自动刷新。 </p>
<p>另一种方法是运行您自己的查询(大概在 <code>viewDidLoad:</code> 或 <code>viewWillAppear:</code> 或类似中)。然后,您将拥有一个对象数组,您可以将其提供给您现有的代码。查看 <code>NSFetchRequest</code> 以进行查询,并查看 <code>NSManagedObjectContext</code> 上的方法 <code>executeFetchRequest:error:</code> 以实际运行它们。</p>
<blockquote>
<p>Another question. Before adding Core Data I had custom delegation to send properties from my modal view controller to my table view controller. With core data do I still need these? I'm thinking that I don't but is there a way to send properties from one view controller to the next with core data?</p>
</blockquote>
<p>有很多方法可以解决这个问题。</p>
<p>如果您的每个 ViewController 都在同一数据库中编辑 Core Data 对象,那么您可以让每个 ViewController 在其 View 出现时刷新其数据(即再次执行获取)。</p>
<p>或者您仍然可以使用您的委托(delegate)模式,但委托(delegate)方法仅用于触发提取:它不传递属性,它只是说“某些内容已更改,您可能想要重新加载,好吗?”。</p>
<p>或者您可以使用 NSFetchedResultsController,它应该会自动获取更改。</p></p>
<p style="font-size: 20px;">关于ios - 我需要完全废弃我的应用程序来添加核心数据吗?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/17865038/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/17865038/
</a>
</p>
页:
[1]