【问题标题】:data: <fault> issue in another function after fetching data from core data数据:从核心数据中获取数据后,另一个函数中的 <fault> 问题
【发布时间】:2024-01-09 11:48:01
【问题描述】:

几天前我开始使用核心数据,我对 coredata 完全陌生。如果我以当前方法记录数据,我已经编写了一个谓词来从 coredata 获取数据,它工作正常。如果我用另一种方法记录数据,它会显示“数据:”

<Profile: 0x16451ba0> (entity: Profile; id: 0x1633c150 <x-coredata://41971DAD-4658-4C38-9D14-7FDFFA57E032/Profile/p6> ; data: <fault>)

-(void)populateCurrentUserData{

       self.blockListArray = [self dataForJid:[[DataManager sharedHandler]userToken]];
   Profile *profile = [self.blockListArray objectAtIndex:0];
          NSLog(@"Data is :%@",profile.userId);//prints nil
      NSLog(@"Data is :%@",self.blockListArray); //"<Profile: 0x17bb23f0> (entity: Profile; id: 0x17bb1fe0 <x-coredata://41971DAD-4658-4C38-9D14-7FDFFA57E032/Profile/p1> ; data: <fault>)"

 }

-(NSArray *)dataForJid:(NSString *)inJid{
   NSArray *data = [[NSArray alloc]init];
   NSError *error;
   self.dataArray = [[NSMutableArray alloc]init];
   MKAUserProfileCoreData *storage = [[MKAUserProfileCoreData alloc]init];
   NSManagedObjectContext *moc = [storage managedObjectContext];
   NSEntityDescription *entity = [NSEntityDescription   entityForName:@"Profile" inManagedObjectContext:moc];
   NSFetchRequest *request = [[NSFetchRequest alloc]init];
   NSPredicate *profilePredicate = [NSPredicate predicateWithFormat:@"userId = %@", inJid];
   [request setPredicate:profilePredicate];
   [request setEntity:entity];
   [request setReturnsObjectsAsFaults:NO];
   data = [moc executeFetchRequest:request error:&error];
   NSLog(@"Data is :%@",data); //This log works fine

return data;

}

/.h
#import <Foundation/Foundation.h>

 @interface MKAUserProfileCoreData : NSObject
{
 NSManagedObjectModel *managedObjectModel;
 NSManagedObjectContext *managedObjectContext;
 NSPersistentStoreCoordinator *persistentStoreCoordinator;
}
@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong, readonly) NSManagedObjectContext   *managedObjectContext;
@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@end

/.m


 #import "MKAUserProfileCoreData.h"
 #import <CoreData/CoreData.h>

 @implementation MKAUserProfileCoreData
- (NSManagedObjectContext *) managedObjectContext {

 if (managedObjectContext != nil) {
    return managedObjectContext;
 }

 NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
 if (coordinator != nil) {
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator: coordinator];
}
 return managedObjectContext;

}

   - (NSManagedObjectModel *)managedObjectModel {

   if (managedObjectModel != nil) {
    return managedObjectModel;
  }
   managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
   return managedObjectModel;
}





  - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

  if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
  }

 NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"splashUserProfile.sqlite"]];

NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                              initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                              configuration:nil URL:storeUrl options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error:&error]) {
    NSLog(@"Error is %@",error);
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should
     not use this function in a shipping application, although it may be useful during
     development. If it is not possible to recover from the error, display an alert panel that
     instructs the user to quit the application by pressing the Home button.

     Typical reasons for an error here include:
     * The persistent store is not accessible
     * The schema for the persistent store is incompatible with current managed object
     model
     Check the error message to determine what the actual problem was.
     */
    abort();
   }

   return persistentStoreCoordinator;
}

 - (NSString *)applicationDocumentsDirectory {
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES) lastObject];
//NSLog(@"Path is %@", path);
return path;
 }

 @end

【问题讨论】:

  • Coredata Error "data: <fault>" 的可能重复项
  • @Azat 但这个答案对我不起作用,尽管我是用户 [request setReturnsObjectsAsFaults:NO]
  • @Azat 开始问的问​​题与此重复,但由于核心数据错误不是问题,而且此代码存在某种问题,只要对其进行编辑以反映即,它将不再是重复的。
  • @WillM。但是我不能取消我的标志

标签: ios objective-c core-data ios8


【解决方案1】:

问题是storagemoc 都是在本地dataForJid: 中创建的。当该方法完成时,这两个变量都将被释放。因此 NSManagedObjects 变得无效。您需要保持对 CoreData 堆栈的强引用 - 例如,将 MKAUserProfileCoreData 设置为单例,或直接在视图控制器中构建堆栈。

【讨论】:

    【解决方案2】:

    您的代码工作正常还是运行有任何问题?核心数据故障还不错,它们是一种节省内存的方式。核心数据故障意味着整个对象尚未加载到内存中。但是,一旦对象被请求,它就会被加载到内存中。

    【讨论】:

    • 如果我请求对象返回 null
    • @user3252627 请编辑您的问题以包含您的实际问题和更多详细信息