Objective c deleteObject删除sqlite3数据库中的行,但保留空行?

Objective c deleteObject删除sqlite3数据库中的行,但保留空行?,objective-c,object,core-data,sqlite,managed,Objective C,Object,Core Data,Sqlite,Managed,我需要删除updatePick中显示的数据库的选定行,但似乎无法获取managedObject中应该存在的[context deleteObject:managedObject]行正确。以下是deleteUpdate方法: -(void)deleteUpdate { NSLog(@"35-Delete pressed."); NSManagedObjectContext *context = [self managedObjectContext]; NSEntityDes

我需要删除
updatePick
中显示的数据库的选定行,但似乎无法获取
managedObject
中应该存在的
[context deleteObject:managedObject]行正确。以下是deleteUpdate方法:

-(void)deleteUpdate {
    NSLog(@"35-Delete pressed.");
    NSManagedObjectContext *context = [self managedObjectContext];
    NSEntityDescription *updateEntity = [NSEntityDescription entityForName:@"Updates" inManagedObjectContext:context];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:updateEntity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(dateGains = %@)", [arrayNSDateGains objectAtIndex:updatePick]];
    [fetchRequest setPredicate:predicate];

    NSArray *gains = [context executeFetchRequest:fetchRequest error:nil];

    for (updateGains in gains) {
        [context deleteObject:updateGains];
    }
    [self saveContext];
}

这将设法删除数据库中行的内容(是的),除了留下一个空行和三个剩余元素:主键(Z_PK)和两个整数(Z_ENT)和(Z_OPT)。空行会在其他地方导致错误。我在这里遗漏了什么?

您忘了获取实体。这样做:

NSArray *results = [context executeFetchRequest:request error:nil];
if (results) {
   for (NSManagedObject *updateGains in results) {
      [context deleteObject:updateGains];
   }
[context save:nil];
}

[自我保护背景]

您忘记获取实体。这样做:

NSArray *results = [context executeFetchRequest:request error:nil];
if (results) {
   for (NSManagedObject *updateGains in results) {
      [context deleteObject:updateGains];
   }
[context save:nil];
}

[自我保护背景]

删除后,核心数据通常会在sqlite存储中留下空行。文档明确指出,删除后存储文件不会变小,直到在某个任意点持久存储对象决定压缩存储

一般来说,查看sqlite存储本身是浪费时间。核心数据不是SQL。实体不是表。对象不是行。属性不是列。关系不是连接。核心数据是一个对象图管理系统,它可以持久化对象图,也可以不持久化对象图,还可以在后台使用SQL来持久化对象图。试图用SQL术语来理解核心数据会导致您完全误解核心数据,并导致很多悲伤和浪费时间

核心数据只具有将对象序列化(冻干)到sqlite存储中的选项。但是,它是如何做到这一点的还没有文档记录,因此直接查看sqlite存储不会告诉您多少

确认对象已被删除的唯一方法是获取并保存其永久
managedObjectID
。删除后,请persistentStoreCoordinator使用
objectWithID:
获取id的对象。如果对象已被删除,它将找不到它

删除对象后,对象可以保留的方式只有两种。撤消管理器可以回滚明显的删除,但这里不是这样。如果将托管对象保留在其他位置,则删除后该对象将保留在内存中(尽管它不会显示在核心数据操作中,如提取)

我怀疑你遇到的任何问题都是由商店的问题引起的。这样的问题非常罕见

更新: 保存后,我执行[自我设置需要显示];这引发了一场战争 根据数据库中的数据重新绘制条形图。这个 第一个可变数组尝试插入一个nil对象,该对象 导致崩溃… 我插入了一个if(dategovern==nil)continue;在 下一个错误发生了,它工作得很好

这里的问题是,在上下文删除一些托管对象后,UI控制器没有更新其托管对象的计数

例如:您有一个表,其中每行显示一个
Update
对象。在开始时,UI控制器获取所有现有的
Update
对象。它告诉表它有
[fetchObjects count]
。然后删除一些
Update
对象,但不告诉表现在行数减少了。该表将尝试访问数组中超过最后一个导致崩溃的元素的对象

这里的解决方案是为上下文通知注册控制器:

NSManagedObjectContextObjectsIDChangeNotification

…然后在调用
[self-setNeedsDisplay]
之前更新数组和表的行数。然后,表将了解它应该有多少行


任何依赖于获取对象计数的UI元素都需要和对象图中的更改保持同步,尤其是删除

删除后,核心数据通常会在sqlite存储中留下空行。文档明确指出,删除后存储文件不会变小,直到在某个任意点持久存储对象决定压缩存储

一般来说,查看sqlite存储本身是浪费时间。核心数据不是SQL。实体不是表。对象不是行。属性不是列。关系不是连接。核心数据是一个对象图管理系统,它可以持久化对象图,也可以不持久化对象图,还可以在后台使用SQL来持久化对象图。试图用SQL术语来理解核心数据会导致您完全误解核心数据,并导致很多悲伤和浪费时间

核心数据只具有将对象序列化(冻干)到sqlite存储中的选项。但是,它是如何做到这一点的还没有文档记录,因此直接查看sqlite存储不会告诉您多少

确认对象已被删除的唯一方法是获取并保存其永久
managedObjectID
。删除后,请persistentStoreCoordinator使用
objectWithID:
获取id的对象。如果对象已被删除,它将找不到它

删除对象后,对象可以保留的方式只有两种。撤消管理器可以回滚明显的删除,但这里不是这样。如果将托管对象保留在其他位置,则删除后该对象将保留在内存中(尽管它不会显示在核心数据操作中,如提取)

我怀疑你遇到的任何问题都是由商店的问题引起的。这样的问题非常罕见

更新: 保存后,我执行[自我设置需要显示];这引发了一场战争 根据数据库中的数据重新绘制条形图。这个 第一个可变数组尝试插入一个nil对象,该对象 导致崩溃… 我插入了一个if(dategovern==nil)continue;在 下一个错误发生了,它工作得很好

这里的问题是您的UI控制器没有更新其