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控制器没有更新其