fetchRequest 是返回空数组

Posted

技术标签:

【中文标题】fetchRequest 是返回空数组【英文标题】:fetchRequest is return empty array 【发布时间】:2014-07-27 15:43:05 【问题描述】:

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

    1234563 (假设我保存了孩子和父母,我可以看到数据库上的变化)

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

    我可以在后台线程上获取数据还是我必须在主线程上获取?

    Main线程和NSMainQueueConcurrencyType有什么联系

    Background 线程和 NSPrivateQueueConcurrencyType 有什么联系 谢谢,

更新:

问题是我获取一些实体并将一些标志更改为 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】:

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

    是的。与 #1 相同。

    只要您使用与此 MOC 关联的线程/队列,您就可以在您希望的任何线程上获取。您可以通过使用performBlock 或确保您运行NSMainQueueConcurrencyType 并从主线程调用获取来做到这一点。

    NSMainQueueConcurrencyType 应该只在主线程上运行。

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

【讨论】:

嘿,谢谢!!!关于 1. 你的意思是我用 MOC1 保存了一些东西(也用 Master MOC 保存,它在 DB 上)我需要通知另一个 MOC,MOC2,需要获取?

以上是关于fetchRequest 是返回空数组的主要内容,如果未能解决你的问题,请参考以下文章

带有多个 sortDescriptor 和 Bool 过滤器的 Swift fetchRequest

NSArray 作为核心数据 fetchRequest 中的参数

FetchRequest 在后续执行中返回重复的结果

带有 NSPredicate 的 Fetchrequest 不返回正确的值

从 Apache 返回空响应

CoreData - 如何创建 fetchrequest 以获取随机属性值数组