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

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

    1234563 (假设我保存了孩子和父母,我可以看到数据库上的变化)
  1. 如果我使用使用 NSPrivateQueueConcurrencyType 的 MOC 保存数据,我可以使用 MOC NSMainQueueConcurrencyType 获取数据吗?和相反的方式..?

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

  3. Main线程和NSMainQueueConcurrencyType有什么联系

  4. 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);
    }
}

}

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

【问题讨论】:

    标签: ios objective-c core-data


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

    2. 是的。与 #1 相同。

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

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

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

    【讨论】:

    • 嘿,谢谢!!!关于 1. 你的意思是我用 MOC1 保存了一些东西(也用 Master MOC 保存,它在 DB 上)我需要通知另一个 MOC,MOC2,需要获取?
    猜你喜欢
    • 2019-12-02
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2017-07-12
    • 1970-01-01
    • 2016-06-27
    • 2021-09-08
    相关资源
    最近更新 更多