0

コアデータを使用して詳細を保存しています。しかし、アプリを2回実行すると、エンティティのコンテンツが2倍になります。これは、アプリを実行するたびに続きます。この質問のように追加する前にオブジェクトを削除しようとしましたコアデータ:エンティティのすべてのインスタンスを削除する最も簡単な方法ですが、削除は追加部分ではなく正常に機能するため、コード内で終了します(他の部分からデータベースにアクセスしています)

以下のコードを使用しました

-(void)synDBFavSpecies:(NSString *)speciesName:(NSString *)speciesId:(NSString *)Imagename
{ 
    NSManagedObjectContext *context=app.managedObjectContext; 
    NSError *err;

    NSFetchRequest *request1=[[NSFetchRequest alloc]init];
    NSEntityDescription *entity1=[NSEntityDescription entityForName:@"FavoriteSpecies" inManagedObjectContext:context];
    [request1 setEntity:entity1];
    NSArray *result1=[context executeFetchRequest:request1 error:&err];
    NSManagedObject *ph1;
    for(ph1 in result1 )
    {
        [context deleteObject:ph1];
        NSString *sid= [ph1 valueForKey:@"ID"]; 
        NSLog(@"Sp.ID:%@",sid);

        if(sid)
        {

            [context deleteObject:ph1];
            if(![context save:&err])
            {
                NSLog(@"error");
            }
        }
    }

    NSManagedObject *SetDB=[NSEntityDescription insertNewObjectForEntityForName:@"FavoriteSpecies" inManagedObjectContext:context];

    [SetDB setValue:speciesName forKey:@"favspecies"];
    [SetDB setValue:speciesId forKey:@"ID"];
    [SetDB setValue:Imagename forKey:@"speciesimage"];

    if(![context save:&err])
    {
         NSLog(@"error");
    }
}

誰か助けてもらえますか?

4

2 に答える 2

0

プリヤ、

まず、私は変更します

NSLog(@"error");

次のようなエラーの詳細な説明があります。

NSLog(@"My save failed: %@\n%@", [error localizedDescription], [error userInfo]);

それでは、あなたのFavoriteSpeciesエンティティは他のエンティティと他の関係を持っていますか?

重複を防ぎたい場合は、別の方法で処理する必要があります。たとえば、IDがエンティティの識別子である場合FavoriteSpecies、述語を使用してフェッチリクエストを設定し、それが何を返すかを確認できます。例えば:

NSFetchRequest *request1 = [[NSFetchRequest alloc]init];
[request1 setEntity:[NSEntityDescription entityForName:@"FavoriteSpecies" inManagedObjectContext:context]];
[request1 setPredicate:[NSPredicate predicateWithFormat:@"ID == %@", speciesID]];
[request1 setFetchLimit:1]; // it's not necessary to do it since the ID is unique

フェッチを実行すると、1つまたは0のオブジェクトを取得します(ID一意の場合)

NSArray *result1 = [context executeFetchRequest:request1 error:&err];
if([result1 count] == 0) {
    // insert here since you haven't that object
} else { 
    // do what you want, for example updating
}

述語を設定することは、ステートメントにWHERE句を追加することと同じです。SELECT

お役に立てば幸いです。

于 2012-06-29T10:38:26.063 に答える
0

実際、コードを間違えました。上記のコードはaloopで実行されていました。だから私がそれを削除したとき、挿入は実行されていませんでした。そこで、データベースを削除する別のメソッドを作成し、このメソッドを呼び出す前にそのメソッドを呼び出しました。したがって、それを機能させました。

于 2012-07-02T10:56:26.513 に答える