从TableViewController的CoreData数据库中获取数据

时间:2013-03-03 07:00:50

标签: ios objective-c core-data

我有一个使用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];

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

2 个答案:

答案 0 :(得分:0)

通常,您可以使用managedObjectContext中存根代码中提供给您的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];

答案 1 :(得分:0)

托管对象上下文需要使用持久性商店协调员初始化,并且需要托管对象模型。 XCode用于为AppDelegate中的所有这些实现提供锅炉板代码。

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

您可以按

设置核心数据

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

您可以通过

获取上下文中的所有跟踪列表值
NSManagedObjectContext *context = [NSManagedObjectContext defaultContext];
[TrackerList findAllSortedBy:@"descript" ascending:YES inContext:context];

以下链接可以更好地指导您  How to make programming in Core Data pleasant