【问题标题】:core data select count(*) from table differs from select * from table核心数据 select count(*) from table 与 select * from table 不同
【发布时间】: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 次,它似乎没有删除任何东西。

所以问题是:

  1. 为什么 count(*) 返回不同的行数来选择 *
  2. 这种方法有什么明显的问题吗(它在其他地方很高兴,但如果有人发现任何问题,请告诉我。

编辑***

我尝试了以下方法:

- 重新创建同名表。 - 用不同的名称重新创建表。 -重写加载过程以更紧密地匹配我的其他文件之一 -重写加载过程以进行单个实体加载而不是列表

似乎只有最后一个有效,其他都没有。仍然让我与其他实体一起加载但正在取得进展

编辑 我已经为这个问题与苹果提出了一个错误,我不确定数据库是否以某种方式损坏,但即使从头开始重写类,它也是完全可重复的。太离奇了。

【问题讨论】:

  • 方法看起来很可靠。您说 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


【解决方案1】:

你所描述的根本不合逻辑。如果您从表中选择所有记录,您应该返回记录数。它们不可能与计数方法不同。

我怀疑您的数据以某种方式损坏(您可能已经运行了 4 次初始化例程或类似的东西)。我建议您从模拟器中删除应用程序(或重置模拟器),然后从头开始重试。监控您在此表中插入的时间和频率。

您也可以先尝试使用delete from zmccountry; 手动清理表。

【讨论】:

  • 我完全同意你的说法。我从事数据库工作多年,但最近才研究核心数据和 sqlite。我试过重建和重置模拟器。事实上,目前唯一的工作方法是在测试运行之间执行此操作,否则数据会损坏。我想我会尝试重建
猜你喜欢
  • 2014-12-12
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2011-04-06
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多