我似乎无法获取NSManagedObjectContext的countForFetchRequest方法来正确计算不同的实例。关于计算不同实例的一些问题已经在这里被问过了,但它们似乎没有解决这个问题,所以请耐心等待。
例如,我使用单个属性“data”定义实体“MyEntity”,然后以编程方式创建几个实例。
var error: NSError?
for i in 1 ... 10
{
for j in 1 ... 3
{
var entity = NSEntityDescription.insertNewObjectForEntityForName("MyEntity",
inManagedObjectContext: managedObjectContext!) as MyEntity
entity.data = i
}
}
managedObjectContext!.save(&error)
这将创建30个实例,其中包含10个不同的属性值。我希望有一个不同的计数返回10,就像查询sqlite数据库时一样。
sqlite> select count(*) from zmyentity;
30
sqlite> select count(distinct(zdata)) from zmyentity;
10
实际上,在执行相应的提取操作时,我得到10个结果。
let request = NSFetchRequest()
let entityDescription = NSEntityDescription.entityForName("MyEntity", inManagedObjectContext: managedObjectContext!)
request.entity = entityDescription
let property = entityDescription!.propertiesByName["data"] as NSPropertyDescription
request.propertiesToFetch = [property]
request.returnsDistinctResults = true
request.resultType = NSFetchRequestResultType.DictionaryResultType
let result = managedObjectContext!.executeFetchRequest(request, error: &error)
println("Count \(result!.count)")
但是,如果不是实际检索并计算这些结果,而只想使用countForFetchRequest计算它们,则计数结果为30。
let request = NSFetchRequest()
let entityDescription = NSEntityDescription.entityForName("MyEntity", inManagedObjectContext: managedObjectContext!)
request.entity = entityDescription
let property = entityDescription!.propertiesByName["data"] as NSPropertyDescription
request.propertiesToFetch = [property]
request.returnsDistinctResults = true
request.resultType = NSFetchRequestResultType.DictionaryResultType
let count = managedObjectContext!.countForFetchRequest(request, error: &error)
println("Count \(count)")
该方法记录如下:
返回给定获取请求所具有的对象数 如果它已传递给executeFetchRequest,则返回:error:。
所以我不希望结果有所不同。顺便说一下,当底层数据存储是XML而不是sqlite时,上述两种计算方式都不起作用,而原则上,根据文档,数据存储类型应该是透明的。
现在我的问题是:这种行为是否可以预期?它在某处记录了吗?我忽略了什么,有什么我可以配置使countForFetchRequest工作?这个例子只有30个实例,但在我的实际代码中它更像是几十万个,所以将它们全部加载到内存中的大字典中以便计算它们的想法并不适合我。如果可以使用Core Data API完成类似SQL SELECT DISTINCT的操作,那将更为可取。