[英]How to update transformable attribute in core data
我處於一種需要在核心數據中更新實體中的transformable屬性的情況下,直到現在我已經嘗試過Google的所有可能答案和堆棧溢出,但沒有實現任何目的。
這是我在核心數據中保存對象的方法,而我要保存的對象是NSMutablDictionary類型的對象。
-(void)didSaveToCoreData :(NSMutableDictionary *)newDict
{
@try {
AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext ;
DataModelSupport *entity = [NSEntityDescription insertNewObjectForEntityForName:@"CPIEntity" inManagedObjectContext:context];
if (newDict != nil) {
[entity.fixed_Model removeAllObjects];
entity.fixed_Model = newDict;
}
NSError *error ;
[context save:&error];
if(error)
{
NSLog(@"Error in Saving Data");
}
else
{
[self didFetchFromCoreDataModel];
NSLog(@"Successfully saved");
}
}
@catch (NSException *exception) {
[self spareMeFromTheCrash:exception];
}
@finally {
}
}
在這種方法中,我第一次保存一個19鍵/值的字典對象,並在didFetchFromCoreDataModel方法中正確獲取它,但是當我刷新數據並獲取18鍵/值的字典時,我將該字典保存在核心數據中使用相同的方法didSaveToCoreData並以相同的方式從didFetchFromCoreDataModel獲取它,但它仍顯示19鍵/值
DataModelSupport是NSManagedObject的子類。 在DataModelSupport.h中:
@property (nonatomic,weak) NSMutableDictionary *fixed_Model;
在DataModelSupport.m中:
@dynamic fixed_Model;
這就是DataModelSupport類。
現在,在此方法中,我正在從核心數據中獲取相同的對象
-(void)didFetchFromCoreDataModel
{
@try {
AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext ;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CPIEntity" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setReturnsDistinctResults:YES];
[request setReturnsObjectsAsFaults:NO];
[request setResultType:NSDictionaryResultType];
[request setEntity:entity];
NSError *error ;
NSArray *arr = [context executeFetchRequest:request error:&error];
updatedfinalArr = [arr valueForKey:@"fixed_Model"];
if(error)
{
NSLog(@"Error");
}
else
{
}
}
@catch (NSException *exception) {
[self spareMeFromTheCrash:exception];
}
@finally {
}
}
任何幫助表示贊賞。
編輯
我現在使用didSaveToCoreData方法在代碼中實現了一些更改,我正在使用此行代碼按名稱獲取Entity
NSEntityDescription *descriptor = [NSEntityDescription entityForName:@"CPIEntity" inManagedObjectContext:context];
因此,我不會在每次調用didSaveToCoreData方法時創建新實體。
這就是我保存NSMutlableDictionary對象的方式
DataModelSupport *entity = [[DataModelSupport alloc]initWithEntity:descriptor insertIntoManagedObjectContext:context];
[entity.fixed_Model removeAllObjects]
entity.fixed_Model = newDict;
但是我仍然沒有得到正確的結果。 現在,當我刷新數據並使用“編輯”部分中說明的上述過程將其保存並獲取時,我獲取了更新的數據,但它增加了對象數,就像第一次嘗試獲取數組中有1個對象時一樣,並且在第二次嘗試中,我得到了2個對象,並且它是這樣的,所以當添加新數據時,它不會更新它,而是將其添加到實體的fixed_Model屬性中,並增加了對象數。
最后,現在我使用這一行代碼從didFetchFromCoreDataModel方法中的數組中獲取最后一個並更新對象
NSDictionary *ddd = [[arr valueForKey:@"fixed_Model"]lastObject];
updatedfinalArr = [NSMutableArray arrayWithObject:ddd];
您的save方法每次都會創建一個新的CPIEntity對象。 因此,除非您在代碼中的其他位置刪除了舊對象,否則我懷疑您的訪fixed_Model
將返回幾個對象,其中第一個對象在fixed_Model
屬性中具有包含19個鍵/值對的fixed_Model
,第二個/后續對象包含18個鍵/值對。
保存時,應首先嘗試獲取現有對象,如果結果為零,則創建一個新對象。 然后將新對象/現有對象的fixed_Model
屬性設置為新字典。
編輯
每次仍在插入新對象( DataModelSupport *entity = [[DataModelSupport alloc]initWithEntity:descriptor insertIntoManagedObjectContext:context];
)。 請參閱下面的“獲取或創建”示例:
AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext ;
NSEntityDescription *descriptor = [NSEntityDescription entityForName:@"CPIEntity" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
request.entity = descriptor;
NSError *error;
NSArray *results = [context executeFetchRequest:request error:&error];
if (results == nil) {
// This implies an error has occurred.
NSLog(@"Error from Core Data: %@", error);
} else {
if (results.count == 0) {
// No objects saved, create a new one...
DataModelSupport *entity = [[DataModelSupport alloc]initWithEntity:descriptor insertIntoManagedObjectContext:context];
entity.fixed_Model = newDict;
} else {
// At least one object saved. There should be only one
// so use the first...
DataModelSupport *entity = [results firstObject];
entity.fixed_Model = newDict;
}
}
為簡單起見,我假設newDict不為nil; 進行適當修改以處理這種情況。
您可以縮小問題范圍嗎?
IE瀏覽器。 您可以比較兩個Dictionary ..原始的19個值和新的18個值嗎?
是否有沒有被“刪除”的特定條目? 這可能意味着“刪除”(或缺少)的挑戰。
或者,如果您完全替換了內容,則獲取時會得到什么結果?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.