0

我正在使用核心数据来存储一些细节。但是当我第二次运行我的应用程序时,实体中的内容会翻倍。每次我运行我的应用程序时都会继续这种情况。我尝试删除对象,然后再添加这个问题Core Data: Quickest way to delete all instances of an entity但随后删除成功而不是添加部分,因此我在代码中退出(从我所在的其他部分正在访问数据库)

我使用了下面的代码

-(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

实际上我在我的代码中犯了一个错误。上面的代码在循环中运行。所以当我删除它时,插入没有执行。所以我做了另一种方法来删除数据库并在调用这个方法之前调用了那个方法。因此让它工作。

于 2012-07-02T10:56:26.513 回答
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

如果您执行 fetch,您将检索一个或零个对象(如果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 回答