2013-12-17 125 views
0

我真的很難用新的IOS應用程序使用coredata。是否可以使用coredata使用group_concat?

一個真正的挑戰是,由於我的背景是SQL,我一直在思考SQLite而不是coredata。我已經解決了大部分障礙,但是這個障礙讓我難以接受 - 我真的想創建一個返回一個group_concat的SQLite視圖。

我是否需要通過對objective-c中的結果進行編碼來重新創建它,或者是否有創建視圖或使用coredata對象發出直接SQL的方法?

編輯:添加數據模型和預期的結果

表-A;列 - 鍵,名稱(注意 - 關鍵不是唯一的)

的樣本數據:
K1,N1
K1,N2
K1,N3
K2,N1
K2,N2

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

SQLite中,這將是從表-A GR SELECT鍵,GROUP_CONCAT(名稱) OUP BY鍵

回答

1

如果您將提取請求設置爲以字典形式返回結果,那麼對分組有很多控制權。

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

我無法獲得可以在單個查詢中工作的解決方案。這是我能想到的最好的。它獲取「key」字段的所有唯一值,然後迭代這些鍵並獲取與該「key」匹配的所有對象。在第二次讀取中,您可能需要獲取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 
) 
+0

尼斯,對於計數工作。即「鍵」,「3」,但不是我想要的... group_concat給我的結果像「密鑰」,「data1,data2,data3」 – Noah