私はコア データのエンティティの変換可能な属性を更新する必要がある状況にあり、これまで 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 メソッドでコードにいくつかの変更を実装しました。このコード行を使用してエンティティを名前で取得しています
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回目の試行で2つのオブジェクトを取得し、このようになるため、新しいデータが追加されるたびに更新されず、代わりにエンティティの fixed_Model 属性に追加され、オブジェクトの数が増えます。
最後に、このコード行を使用して、didFetchFromCoreDataModel メソッドの配列から最後のオブジェクトと更新オブジェクトを取得しています
NSDictionary *ddd = [[arr valueForKey:@"fixed_Model"]lastObject];
updatedfinalArr = [NSMutableArray arrayWithObject:ddd];