我有一些对象是与对象用户mani-to-one相关的图像,如Image<< --->用户。现在我想做,当用户登录时,我会在每个图像上显示一个按钮以添加到收藏夹,当我点击此按钮时运行此代码:
User * user = [[UserController sharedInstance] currentUser];
Image * image = (Image*)[user.managedObjectContext objectWithID:[self.yacht objectID]];
yacht.whoLiked = user
问题不是我在同一个控制器,而是在主控制器之前,因为我所做的是在图像的拇指中加载集合视图(并在此控制器中加载来自DB)然后当我按下拇指时,我进入另一个控制器,向我显示大图像和添加收藏夹的按钮,当我按下它然后回到旧控制器的viewDidAppear中的旧控制器我每次重新加载来自数据库的数据,但我看不到任何变化,如果我改变部分(控制器),我回来看看我看到数据更新
这就是我从主控制器:
调用Db的方式- (void)fetchImages
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Image"];
request.predicate = [NSPredicate predicateWithFormat:@"ANY whichCategories.name =[cd] %@", self.category.name];
NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"headline" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
request.sortDescriptors = [NSArray arrayWithObject:sortName];
NSError * error = nil;
self.images = [self.database.managedObjectContext executeFetchRequest:request error:&error];
[self.collectionView reloadData];
}
- (void)useDocument
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.database.fileURL path]]) {
// CREATE
[self.database saveToURL:self.database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
[self fetchImages];
}];
} else if (self.database.documentState == UIDocumentStateClosed) {
// OPEN
[self.database openWithCompletionHandler:^(BOOL success) {
[self fetchImages];
}];
} else if (self.database.documentState == UIDocumentStateNormal) {
// USE
[self fetchImages];
}
}
- (void)setDatabase:(UIManagedDocument *)database
{
if (_database != database) {
_database = database;
[self useDocument];
}
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self useDocument];
//[self.collectionView reloadData];
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.5];
self.collectionView.alpha = 1;
[UIView commitAnimations];
}
为什么我回来并返回代码工作,就像我没有调用服务器来刷新数组一样?
答案 0 :(得分:1)
使用此代码进行Triy:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Favorits" inManagedObjectContext:moc]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", @"Some Title"];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];
YourObject *object = [results objectAtIndex:0];
object.title = @"Bla bla bla";
//save changes
[moc save:&error];
if (error) {
//Do something
}
这2个链接很有帮助:
答案 1 :(得分:0)
如果我没有误解你,问题是当你刷新数组时,你的数据不会更新。
如果您从数据库重新加载并且尚未保存更改,那么您将获得数据库中的值。你应该这样做:
NSError *saveError = nil;
[user.managedObjectContext save:&saveError];
if (error) {
//Do whatever
}
在再次调用函数从DB重新加载数组之前,您应该使用此代码。这取决于你,但如果你只是在加载viewcontroller时调用从DB刷新数组,你可以在离开viewController时保存数据。