2015-05-13 20 views
0

我幾天前開始使用核心數據,我完全不熟悉coredata。我寫了一個謂詞從coredata中獲取數據,如果我在當前方法中記錄數據,它工作正常。如果我在另一種方法記錄數據顯示 「數據:」數據:<fault>在從核心數據中提取數據後在另一個函數中出現問題

<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 
+0

可能重複的[Coredata錯誤「數據:」](http://stackoverflow.com/questions/7304257/coredata-error-data-fault) – Azat

+0

@Azat但這答案不適用於我,雖然我用戶[請求setReturnsObjectsAsFaults:NO] – user3252627

+0

@Azat問題開始提出的問題是重複的,但由於核心數據錯誤不是問題,並且此代碼存在某種問題,只要它被編輯以反映那將不再是重複的。 –

回答

1

問題是storagemoc都是在dataForJid:本地創建的。當該方法完成時,這兩個變量都將被釋放。因此NSManagedObjects變得無效。您需要對CoreData堆棧保持強有力的引用 - 例如將MKAUserProfileCoreData設置爲單例,或者直接在視圖控制器中構建堆棧。

+0

This Works,thanks @pbasdf – user3252627

0

請問你的代碼工作罰款或運行任何問題?核心數據錯誤並不壞,它們是一種節省內存的方式。核心數據錯誤意味着整個對象尚未加載到內存中。但是,只要對象被請求,它就會被加載到內存中。

+0

如果我請求對象它返回null – user3252627

+0

@ user3252627請編輯您的問題,以包括您的實際問題和更多的細節 –

+0

包括一些更多的代碼檢查 – user3252627