【问题标题】:Core data how update a record?核心数据如何更新一条记录?
【发布时间】:2013-10-31 11:34:19
【问题描述】:

我有一些对象是与对象用户mani-to-one相关的图像,例如图像用户。现在我想做,当用户登录时,我会为每个图像显示一个按钮以添加到收藏夹,当我单击此按钮时运行此代码:

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];
}

为什么如果我回来并返回代码工作,否则就像我没有调用服务器刷新数组一样?

【问题讨论】:

    标签: ios iphone objective-c xcode core-data


    【解决方案1】:

    试试这个代码:

    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 个链接很有帮助:

    http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

    https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/NSFetchRequest.html

    【讨论】:

      【解决方案2】:

      如果我没有误解你,问题是当你刷新数组时,你的数据没有更新。

      如果您从数据库重新加载并且尚未保存更改,那么您将获得数据库中的值。你应该这样做:

      NSError *saveError = nil;
      [user.managedObjectContext save:&saveError];
      
      if (error) {
        //Do whatever
      }
      

      您应该在再次调用函数以从数据库重新加载数组之前使用此代码。位置由你决定,但如果你只在加载 viewcontroller 时调用从 DB 刷新数组,则可以在离开 viewController 时保存数据。

      【讨论】:

      • 是的,您需要始终保存您的更改。您可以在每次更改后保存更改,但我不建议您这样做。我建议在离开视图控制器之前保存上下文。
      • 让我们检查一下我需要 2 分钟
      • 它不工作,我现在检查我的代码,这个问题不是我同一个控制器,而是在控制器之前,因为我所做的是将图像的拇指加载到集合视图中(并且在这个控制器从数据库中加载所有数据)然后当我按下拇指时,我进入另一个控制器,显示大图像和添加收藏夹的按钮,当我按下它然后回到 viewDidAppear 中的旧控制器旧控制器我每次从数据库中重新加载数据但我看不到任何更改,如果我更改部分(控制器)并且我回来查看我看到数据更新
      • 从数据库重新加载数组后,尝试调用 reloadData 到您的 collectionView:[self.collectionView reloadData];此外,将所有内容从 viewDidAppear 移动到 viewWillAppear;
      • 是的,我这样做,如果用断点检查我从数据库接收的数组并且缺少关系,我更改控制器并返回存在关系
      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多