2016-03-16 2 views
0

Это как NSManagedObject создаетсяполучить последний добавленный NSManagedObject из CoreData

NSEntityDescription *entity = [NSEntityDescription entityForName:strEntityName inManagedObjectContext:managedObjContext]; 
NSManagedObject * managedObject = (NSManagedObject *)[[NSClassFromString(strEntityName) alloc] initWithEntity:entity insertIntoManagedObjectContext:managedObjContext]; 
//values are mapped into this object 

Сохраним NSManagedObject в постоянное хранилище и загрузка в настоящее время вставленного объекта, как это:

NSError *error; 
BOOL isDone = [managedObjectContext save:&error]; 
//BOOL isDone = [managedObjectContext obtainPermanentIDsForObjects:[NSArray arrayWithObjects:tempManagedObject, nil] error:&error]; 
if (isDone && error == nil){ 

    //fetch last inserted object here 

    //make fetch request 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:strEntityName]; 
    //make query using fetch request in context  
    NSError *error; 
    NSArray *arrFetchRequest = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
    if (arrFetchRequest.count>0){ 
     //This is last inserted object 
     NSManagedObject *managedObject = [arrFetchRequest lastObject]; 
     return managedObject; 
    } 
} 

Я также refered Swift - How to get last insert id in Core Data, store it in NSUserDefault and predicate. Но у него не будет постоянного идентификатора объекта в NSManagedObject, поскольку мы сохраняем временный идентификатор и извлекаем его, и у нас нет постоянного идентификатора.

Canyone делит любые другие варианты?

+0

Есть много лучших вариантов. Этот запрос возвращает все объекты этого типа сущности, а не только последние вставленные. Самое простое - сохранить «objectID» и fetch с помощью этого. Обязательно вызывайте 'getPermanentIDsForObjects'. – Avi

+0

@Avi: Используя 'getPermanentIDsForObjects', он не получит NSManagedObject с постоянным идентификатором. Также мне придется использовать метод [NSManagedObjectContext save] 'после этого, чтобы сохранить записи в базе данных. –

+0

Подождите. Вы думаете, что метод, называемый 'getPermanentIDsForObjects' **, не будет ** получать постоянный' objectID 's? Объясните это, пожалуйста. – Avi

ответ

0

Вставляя NSManagedObject в контекст, он будет иметь временный идентификатор (это означает, что он не был сохранен в базе данных).

Так нужно получить permanentID (это означает, что он был сохранен в базе данных) для NSManagedObject в контексте использования obtainPermanentIDsForObjects и тот же NSManagedObject будет permanentID

if (insertManagedObject) 
{ 
    NSLog(@"Before %@ : %d",insertManagedObject.objectID,insertManagedObject.objectID.isTemporaryID); 
    //Obtain permanentID for object 
    NSError *error; 
    BOOL hasObtainedPermanentID = [managedObjectContext obtainPermanentIDsForObjects:[NSArray arrayWithObjects:insertManagedObject, nil] error:&error]; //; 
    //check if its done 
    if (hasObtainedPermanentID && error == nil){ 

     NSLog(@"After %@ : %d",insertManagedObject.objectID,insertManagedObject.objectID.isTemporaryID); 

     //check context has changes and is saved in context 
     if ([managedObjectContext hasChanges] && [managedObjectContext save:&error]) 
     { 
      return insertManagedObject; 
     } 

    } 

}