【发布时间】:2014-12-02 21:20:03
【问题描述】:
到目前为止,我已经在 iphone 上使用核心数据几个月了,没有任何问题。我创建了一个新表,并将其他类中的一些基本代码复制到我的新类中,该类从表中删除所有条目,然后再次加载表。
我正在使用以下方法从表中删除:
-(void) deleteFromEntity
{
NSError *error = nil;
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MCCountry" inManagedObjectContext:context];
[request setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:request error:&error];
for (NSManagedObject *object in fetchedObjects) {
[context deleteObject:object];
}
if (![context save:&error]) {
NSLog(@"ERROR: %@", [error localizedDescription]);
}
}
现在的问题是加载过程加载了 271 行。当我调试这个删除方法时,fetchedObjects 对象包含 271 行,然后它循环 271 次删除它。
问题是该表当前包含 1084 行。所以我从 zmccountry 运行了 select count(*),它给了我 271 行。 1084/271 是 4,所以我运行了这个脚本 4 次,它似乎没有删除任何东西。
所以问题是:
- 为什么 count(*) 返回不同的行数来选择 *
- 这种方法有什么明显的问题吗(它在其他地方很高兴,但如果有人发现任何问题,请告诉我。
编辑***
我尝试了以下方法:
- 重新创建同名表。 - 用不同的名称重新创建表。 -重写加载过程以更紧密地匹配我的其他文件之一 -重写加载过程以进行单个实体加载而不是列表
似乎只有最后一个有效,其他都没有。仍然让我与其他实体一起加载但正在取得进展
编辑 我已经为这个问题与苹果提出了一个错误,我不确定数据库是否以某种方式损坏,但即使从头开始重写类,它也是完全可重复的。太离奇了。
【问题讨论】:
-
方法看起来很可靠。您说 select * 和 count(*) 会返回不同的结果,但您是说加载过程加载 271 行 AND count(*) 返回 271?你能澄清一下吗?
-
表加载方法每次运行时加载 271 条记录。当我从表中运行 select count(*) 时;它返回 271 条记录。当我运行 select * from table 时;我在输出中得到 1084 条记录
-
你能在你的 delete 方法中do a count 看看它正在拾取多少吗?
-
如何检查总行数?你是直接用 sql 编辑器扫描 .sqlite 文件吗?如果是这样,我猜核心数据不会删除 sqlite 表中的行,而是会在其支持文件中将它们标记为已删除。
-
NSLog(@" 删除的国家/地区计数 %lu",(unsigned long)[fetchedObjects count]);给我删除了国家 271 的计数。选择计数(*)仍然是 271,而选择 * 现在是 813(我做了重置只是为了继续工作)
标签: objective-c xcode core-data