我正在尝试更新名为“HomeViewController”的视图中的UITableView
,以显示我添加的新对象。但是在我创建新的NSFetchedResultsController
后,- (void)saveNewShindyToDatabaseForName:(NSString *)name
details:(NSString *)details
dateAndTime:(NSDate *)dateAndTime
location:(CLLocation *)location
timePosted:(NSDate *)postedTime
{
if (!self.shindysDatabase) {
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
self.shindysDatabase = [[UIManagedDocument alloc] initWithFileURL:url];
}
dispatch_queue_t saveQ = dispatch_queue_create("Shindy Creator", nil);
dispatch_async(saveQ, ^{
[self.shindysDatabase.managedObjectContext performBlock:^{
[Shindy setupShindyForSaveToDatabaseForName:name
details:details
dateAndTime:dateAndTime
location:location
timePosted:postedTime
inManagedObjectcontext:self.shindysDatabase.managedObjectContext];
}];
});
NSError *error = nil;
if (![self.shindysDatabase.managedObjectContext save:&error]) {
NSLog(@"%@", error.userInfo);
}
}
- (void)setupFetchedResultsController
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shindy"];
NSSortDescriptor *nameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSSortDescriptor *photoSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"photo" ascending:YES];
NSSortDescriptor *detailSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"details" ascending:YES];
NSSortDescriptor *dateAndTimeSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateAndTime" ascending:YES];
NSSortDescriptor *timePostedSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"timePosted" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:nameSortDescriptor, photoSortDescriptor, detailSortDescriptor, dateAndTimeSortDescriptor, timePostedSortDescriptor, nil];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.shindysDatabase.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
}
没有更新。我在各种文档中都有以下代码:
HomeViewController.h
NSManagedObject
Shindy + SQL.m(实体的+ (Shindy *)setupShindyForSaveToDatabaseForName:(NSString *)name
details:(NSString *)details
dateAndTime:(NSDate *)dateAndTime
location:(CLLocation *)location
timePosted:(NSDate *)postedTime
inManagedObjectcontext:(NSManagedObjectContext *)context
{
Shindy *shindy = [NSEntityDescription insertNewObjectForEntityForName:@"Shindy" inManagedObjectContext:context];
__block NSString *nameString = name;
__block FBProfilePictureView *profileImage = nil;
if (FBSession.activeSession.isOpen) {
[[FBRequest requestForMe] startWithCompletionHandler:
^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
nameString = user.name;
profileImage.profileID = user.id;
}
}];
}
NSData *imageData = nil;
for (NSObject *obj in [profileImage subviews]) {
if ([obj isMemberOfClass:[UIImageView class]]) {
UIImageView *objImg = (UIImageView *)obj;
imageData = UIImagePNGRepresentation(objImg.image);;
break;
}
}
shindy.name = name;
shindy.dateAndTime = dateAndTime;
shindy.timePosted = postedTime;
shindy.details = details;
shindy.photo = imageData;
return shindy;
}
子类,“Shindy”)
- (void)setupFetchedResultsController:
最初加载视图时调用方法viewDidLoad
(但不在viewWillAppear
或- (void)saveNewShindyToDatabaseForName:
方法中)。一旦用户输入完数据,我的NSManagedObjectContext
函数就会在一个单独的视图控制器中调用。换句话说,它是公共API,但HomeViewController
仍然在NSLog
内用于委派。代表们和&amp;我的代码的数据源设置正确。
我试图逼迫各种取物;是通过managedObjectContext还是fetchedResultsController。我还在代码的不同位置设置了HomeViewController
,以确保数据通过NSLog
。我还设置了另一个nil
以确保fetchedResultsController和amp; managedObjectContext不是NSSortDescriptor
。
似乎所有内容都已检出,我的代码中的其他默认错误也没有出现任何错误。
我担心这必须对我- (void)setupFetchedResultsController:
方法中的- (void)saveNewShindyToDatabaseForName:
做一些事情,但我也尝试以各种方式配置它们无济于事。与我的managedObjectContext&amp;有明确的联系。我的fetchedResultsController也是如此,所以这不是问题所在。
我已经完成了一些尝试。也许,这里有人有一些见解。
对于jrturton ......
我已经在- (void)saveNewShindyToDatabaseForName:(NSString *)name
details:(NSString *)details
dateAndTime:(NSDate *)dateAndTime
location:(CLLocation *)location
timePosted:(NSDate *)postedTime
{
// All of the code originally in this method is here...
if ([self.fetchedResultsController managedObjectContext] == self.shindysDatabase.managedObjectContext) {
NSLog(@"MOC's are the same.");
}
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shindy"];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"details" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *detailsArray = [self.shindysDatabase.managedObjectContext executeFetchRequest:request error:&error];
if (error) {
NSLog(@"error: %@", error.userInfo);
}
NSLog(@"details: %@", detailsArray);
}
方法中在最初的所有代码之后实现了以下代码。它看起来像这样:
{{1}}
所有这一切回归的是,为了回答你的第二个可能答案,MOC肯定是一样的。但是,似乎新对象实际上并未保存到Core Data中。或者我不会把它们拉回来。
我能想到记录核心数据内部而不会出现无法识别的选择器错误的唯一方法是为正确的实体创建新请求,然后执行获取,然后记录该获取的结果,在这种情况下,什么也没有返回。
我将假设我的问题出在我的代码中,而不是将新对象保存到Core Data。有了这个说,你可以识别我没有正确地将这些对象保存到我的上下文的任何地方,以便它可以放入我的核心数据模型以便以后检索吗?或者我是否需要设置一个不同的方法,而不是请求记录保存到我的核心数据中的内容?
答案 0 :(得分:2)
可能的问题:
您没有提及新对象是否曾进入数据库 - 如果您保存,关闭并重新打开应用程序,它们是否存在?我们是在处理未能发送或接收更改通知,还是未能进行更改?