fetchRequest返回空数组

时间:2014-07-27 15:43:06

标签: ios objective-c core-data

我正在尝试从我的数据库中获取请求。但我的回答是零。提取是可以的,因为当我使用这种方法时,我得到“有时”的值。 (我知道我在数据库中有数据)。我认为这与线程问题有关,或者因为我使用的是Multi-Context。所以我的问题基本上是通用的。

  1. 如果我在特定MOC中保存一些数据,我们称之为MOC1然后我想获取我刚才保存的数据..我可以使用任何MOC吗? (假设我保存了孩子和父母,我可以看到DB上的变化)

  2. 如果我使用MOC保存使用NSPrivateQueueConcurrencyType的数据,我可以使用MOC NSMainQueueConcurrencyType获取吗?和相反的方式..?

  3. 我可以在后台线程上获取数据,或者我必须在主线程上获取?

  4. 主线程和NSMainQueueConcurrencyType之间的连接是什么

  5. 后台线程和NSPrivateQueueConcurrencyType之间的连接是什么 谢谢,

  6. 更新

    问题是我获取一些实体并将一些标志更改为isSync = YES当我想保存它时我使用我的保存方法:

    -(void)saveDataToDBWithCompletionWithManagedObjectContext:(NSManagedObjectContext*)managedObjectContext withCompletion:(void (^)(BOOL succeeded ,NSError *error))completion {
    if (managedObjectContext != nil) {
        [managedObjectContext performBlockAndWait:^{
            NSError *errorMsg = nil;
            if ([managedObjectContext hasChanges] && ![managedObjectContext save:&errorMsg]) {
                // do some real error handling
                NSLog(@"couldn't save Background Context, error %@, %@", errorMsg, [errorMsg userInfo]);
                if (completion) {
                    completion(NO, errorMsg);
                }
            } else {
                if (completion) {
                    completion(YES, nil);
                }
            }
        }];
    } else {
        if (completion) {
            completion(NO, nil);
        }
    }
    

    }

    此方法获取NSManagedObjectContext,并将其保存到相关的NSManagedObjectContext中。然后我运行我的主保存:

    -(void)saveMasterDataToDBWithSync:(BOOL)toDoSync WithCompletion:(void (^)(BOOL succeeded ,NSError *error))completion {
    NSError *errorMsg = nil;
    if (self.masterManagedObjectContext != nil) {
        if ([self.masterManagedObjectContext hasChanges] && ![self.masterManagedObjectContext save:&errorMsg]) {
            if (completion) {
                completion(NO, errorMsg);
            }
        } else {
            if (toDoSync) {
              // DO sync with Parse
            }
    
            if (completion) {
                completion(YES, nil);
            }
        }
    } else {
        if (completion) {
            completion(NO, nil);
        }
    }
    

    }

    当我检查我的数据库时,数据就在那里!但是当我试图去取它时我看不到任何东西。

1 个答案:

答案 0 :(得分:1)

  1. 是。但是您需要找到一种方法来通知MOC您所做的更改。您可以使用子/父上下文(parentContext),保存到persistentStoreCoordinator或使用mergeChangesFromContextDidSaveNotification合并更改来执行此操作。在任何情况下,您都必须save才能传播更改。

  2. 是。与#1相同。

  3. 只要您使用与此MOC关联的线程/队列,就可以获取您希望的任何线程。您可以使用performBlock或仅确保运行NSMainQueueConcurrencyType并从主线程调用fetch来执行此操作。

  4. NSMainQueueConcurrencyType应仅在主线程上运行。

  5. NSPrivateQueueConcurrencyType有自己的私人队列。使用performBlock在该队列上运行提取。