0

我有一个使用 CoreData 数据库的 TableViewController。我有另一个 UIviewController,我想从中读取 TableViewController 的数据库。我所做的如下。

//In UIviewController
-(NSArray *)fetchRecordedDatainsqldatabase
{
    // construct a fetch request

    NSError *error;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    //[fetchRequest setFetchBatchSize:20];
    // Create the sort descriptors array.
    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"descript" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:descriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    // return the result of executing the fetch request
    return [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];}

我有一个财产

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

But managedObjectContext is always nil, at the line
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:self.managedObjectContext];

因此,当程序到达该行时,它总是崩溃。可能是什么问题呢?

4

2 回答 2

0

Managed Object Context需要使用Persistent Store Coordinator进行初始化,并且需要Managed Object Model。XCode 用于为 AppDelegate 中的所有这些实现提供样板代码。

作为替代解决方案,您可以尝试使用MagicalRecord

您可以通过以下方式设置核心数据

[MagicalRecord setupCoreDataStackWithStoreNamed:@"Database.sqlite"];

您可以通过以下方式获取上下文中的所有跟踪列表值

NSManagedObjectContext *context = [NSManagedObjectContext defaultContext];
[TrackerList findAllSortedBy:@"descript" ascending:YES inContext:context];

以下链接将更好地指导您 如何使 Core Data 中的编程愉快

于 2013-03-03T09:04:07.227 回答
0

一般你可以使用managedObjectContext提供给你的 stub 代码中的AppDelegate. 如果是这种情况,您可以使用:

AppDelegate *appD = [[UIApplication sharedApplication] delegate];

然后代替该行:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:self.managedObjectContext];

利用:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:appD.managedObjectContext];

您应该将 return 语句替换为:

return [appD.managedObjectContext executeFetchRequest:fetchRequest error:&error];

如果您正在创建自己的NSManagedObjectContext对象,那么您应该设置它persistentStoreCoordinator(这又需要托管对象模型并设置持久存储类型)。

AppDelegate.m如果您在创建项目时选中了“使用核心数据”,您可以在 中查看如何执行所有这些操作。

无论如何,在您的情况下,您已经在第一个视图控制器中成功使用了 managedObjectContext 。所以你只需要在第二个视图控制器中获取相同的对象。

为了使您的方法起作用,您只需在您提供的代码块顶部添加一行:

self.managedObjectContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
于 2013-03-03T08:54:14.133 回答