gpt4 book ai didi

ios - 是否可以将 group_concat 与 coredata 一起使用?

转载 作者:行者123 更新时间:2023-11-29 03:24:28 29 4
gpt4 key购买 nike

我真的很努力在新的 IOS 应用程序中使用 coredata。

真正的挑战是,由于我的背景是 SQL,所以我一直在思考 SQLite 而不是 coredata。我已经解决了大多数障碍,但这个难倒了我——我真的想创建一个返回 group_concat 的 SQLite View 。

我是否需要通过在 objective-c 中对结果进行编码来重新创建它,或者是否可以使用 coredata 对象创建 View 或直接发出 SQL?

编辑:添加数据模型和所需结果

表_A; columns -- key, name (注意 -- key 不唯一)

示例数据:
K1、N1
K1、N2
K1、N3
K2、N1
K2、N2

期望的结果:
K1,N1;N2;N3
K2,N1;N2

在 SQLite 中,这将是 SELECT 键,来自 Table_A GROUP BY 键的 GROUP_CONCAT(name)

最佳答案

如果您将提取请求设置为以字典形式返回结果,则您可以对分组进行很多控制。

http://mattconnolly.wordpress.com/2012/06/21/ios-core-data-group-by-and-count-results/Core Data Fetching Properties with Group By Count两者都包含很好的例子。第二个链接显示了如何沿着关系的关键路径进行分组。

编辑:

在看到修改后的问题后,我对此进行了一些修改。源代码在 Github 上:https://github.com/halmueller/CoreDataGroupFetch

我无法找到适用于单个查询的解决方案。这是我能想到的最好的。它获取“键”字段的所有唯一值,然后遍历这些键并获取与该“键”匹配的所有对象。在第二次获取中,您可能希望获取 NSManagedObjects 而不是字典,具体取决于您要执行的操作。

NSFetchRequest* uniqueKeysFetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"KeyedName"];

uniqueKeysFetchRequest.propertiesToFetch = @[@"key"];
uniqueKeysFetchRequest.resultType = NSDictionaryResultType;
uniqueKeysFetchRequest.returnsDistinctResults = YES;

NSError* error = nil;
NSArray *results = [self.managedObjectContext executeFetchRequest:uniqueKeysFetchRequest
error:&error];
NSLog(@"uniqueKeysFetchRequest: %@", results);

NSLog(@"distinct values for \"key\": %@", [results valueForKeyPath:@"@distinctUnionOfObjects.key"]);

for (NSString *thisKey in [results valueForKey:@"key"]) {
NSFetchRequest *oneKeyFetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"KeyedName"];
NSString *predicateString = [NSString stringWithFormat:@"key LIKE '%@'", thisKey];
oneKeyFetchRequest.predicate = [NSPredicate predicateWithFormat:predicateString];
oneKeyFetchRequest.resultType = NSDictionaryResultType;
oneKeyFetchRequest.propertiesToFetch = @[@"name"];
NSLog(@"%@: %@", thisKey, [self.managedObjectContext executeFetchRequest:oneKeyFetchRequest error:&error]);
}

这产生

results from uniqueKeysFetchRequest: (
{
key = K1;
},
{
key = K2;
}
)
distinct values for "key": (
K1,
K2
)
K1: (
{
name = N2;
},
{
name = N1;
},
{
name = N3;
}
)
K2: (
{
name = N2;
},
{
name = N1;
}
)

我也试过

NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"KeyedName"];

fetchRequest.propertiesToFetch = @[@"key", @"name"];
fetchRequest.propertiesToGroupBy = @[@"key", @"name"];
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.returnsDistinctResults = YES;

NSError* error = nil;
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest
error:&error];
NSLog(@"withKeypathStrings: %@", results);

NSLog(@"distinct values for \"key\": %@", [results valueForKeyPath:@"@distinctUnionOfObjects.key"]);

这可能更接近你想要的:

withKeypathStrings: (
{
key = K1;
name = N1;
},
{
key = K1;
name = N2;
},
{
key = K1;
name = N3;
},
{
key = K2;
name = N1;
},
{
key = K2;
name = N2;
}
)
distinct values for "key": (
K2,
K1
)

关于ios - 是否可以将 group_concat 与 coredata 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20637440/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com