swift 2核心数据谓词不一致

时间:2016-01-17 17:14:55

标签: ios core-data swift2 xcode7

我遇到核心数据谓词方法的问题,因为它返回的结果似乎有点不一致。我有一个“用户”实体,它是从Web API填充的,而不是删除所有条目然后下载和添加用户,我更喜欢为所有用户“isModified”设置为false,然后通过API下载用户并根据用户是否在商店中更新或添加用户,在添加/更新时设置“isModified”标志。最后,代码删除没有设置“isModified”标志的任何用户。我是这样做的,因为如果Web API不可用,我不会丢失所有用户,应用程序可以继续工作。

我遇到的问题是删除未设置“isModified”标志的用户的方法是删除已更新的用户!

以下是方法:

func deleteUsersNotUpdated() -> Bool {
  // default result
  var result = false

  // setup the fetch request
  let fetchRequest = NSFetchRequest(entityName: "Users")

  // set a predicate that filters only records with updated set to false
  fetchRequest.predicate = NSPredicate(format: "isModified == %@", false)

  do {
    let fetchResults = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
    for user in fetchResults {
      print("Deleting \(user)")
      self.managedObjectContext.deleteObject(user)
      try self.managedObjectContext.save()
    }
    result = true
  } catch let error as NSError {
    print("\(error)")
  }
  return result
}

该方法主要起作用,但间歇性地删除用户是没有充分理由的,即即使它设置了“isModified”标志,例如这是行的输出:print(“Deleting(user)”)

Deleting <NSManagedObject: 0x7b6d6ec0> (entity: Users; id: 0x7b64abd0 <x-coredata://1A7606EB-3539-4E85-BE1C-15C722AD7125/Users/p14> ; data: {
    created = "2016-01-17 16:54:21 +0000";
    familyName = Doe;
    givenName = John;
    isModified = 1;
    pin = 3932;
    type = STAFF;
})

正如您所看到的,“isModified”标志设置非常明确,但谓词只能选择标记重置(false)的记录。

上面的方法是我创建的类的一部分,它基本上是Users实体的CRUD类。

在这里抓我的头! 如果需要,我可以提供其余的代码。

2 个答案:

答案 0 :(得分:2)

我认为你的代码看起来非常好(尽管你应该在循环之外保存)。在大多数情况下,Swift布尔值会自动转换为NSNumber并返回。编写此谓词有许多有效的方法。

唯一可能的解释是,另一个类正在使用相同的托管对象上下文来修改提取的对象。如果您有一个上下文应用程序,这是一个可以想象的场景。

避免这种情况的标准方法是在背景上下文中进行更改。

答案 1 :(得分:0)

使用布尔文字而不是对象占位符%@获取布尔值

NSPredicate(format: "isModified == FALSE")

并且不要在重复循环的每次迭代中调用context.save(),在重复循环后调用一次。