簡體   English   中英

如何更新核心數據中的可變形屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM