簡體   English   中英

排序核心數據實體的最佳方法是什么?

[英]What is the best way to sort a Core Data Entity?

我有一個完全工作的核心數據模型,但是當我使用獲取請求返回數據時,它看起來是一個看似隨機的順序。 排序此數據的最佳方法是什么? 是在Core Data模型中使用另一個表,還是'查詢'第一個? 或者是將數據下拉到數組中,然后按這種方式排序?

我不太確定如何做其中任何一個,這就是我問這個問題的原因。

你的問題很普遍,但我會試着給你一些提示。

使用NSFetchRequest類時,可以指定排序描述符。

來自Apple doc:

一組排序描述符( NSSortDescriptor實例),用於指定返回對象的排序方式,例如按姓氏,然后按名字排序。

在這里,您可以在Core Data Snippets doc中找到一個簡單的示例

NSManagedObjectContext *context = <#Get the context#>;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
    inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error
}

// release allocated objects if you don't use ARC

哪里

<#Entity name#>是您要檢索的實體的名稱,例如Manager

<#Sort key#>是請求將用於訂購的密鑰的name ,例如, nameManager實體的屬性。

所以,在我的例子中:

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

由於setSortDescriptors:設置了一個排序描述符數組,因此您可以指定要排序的多個鍵。 例如,指定對namesalary進行排序。 排序描述符按它們在sortDescriptors數組中出現的順序應用。 所以,在我的例子中,首先是name ,然后是salary

所以,在我的例子中,它可能成為

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
    ascending:YES];
NSSortDescriptor *sortBySalary = [[NSSortDescriptor alloc] initWithKey:@"salary"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, sortBySalary, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

希望有所幫助。

編輯

由於fetchedObjects包含NSManagedObject (我想你沒有更改請求的結果類型),你需要像下面這樣迭代:

for(NSManagedObject* currentObj in fetchedObjects) {

    NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]);
}

因此,您需要通過鍵值編碼訪問屬性或關系。 為了讓您的生活更輕松,您可以考慮為您創建的實體創建NSManagedObject子類,例如組織core-data-for-ios

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM