ios - fetchRequest 返回空数组

标签 ios objective-c core-data

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

  1. 如果我在特定的 MOC 中保存一些数据,我们将其称为 MOC1,然后我想获取我刚刚保存的数据..我可以使用任何 MOC 吗? (假设我保存了 child 和 parent ,我可以看到数据库上的变化)

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

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

  4. Main线程和NSMainQueueConcurrencyType之间有什么联系

  5. 后台线程和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 合并更改来实现。在任何情况下,您都必须保存才能传播更改。

  2. 是的。与 #1 相同。

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

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

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

关于ios - fetchRequest 返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24982562/

相关文章:

表格 View 单元格图像中的 ios 故障

iOS Internet 可达性被调用两次

objective-c - iOS 5 - 标签内的图像?

iphone - 如何使用 for 循环将对象添加到 NSArray?

ios - 存储 600 个声音文件,每个 5-20kb,内部核心数据

ios - 如何使用 Alamofire 4.0 发出 NTML 请求?

iphone - 如何单独识别facebook中的请求?

objective-c - 尽管有 ARC,但内存使用量很大

objective-c - 核心数据委托(delegate)保存模式

ios - 使用 Core Data 创建一个新的 iOS 项目,但我在 AppDelegate 中找不到 ManagedObjectModel 变量