2010-10-18 22 views
33

Tôi có một số NSFetchRequest để trả lại các thuộc tính của đối tượng trong một số NSDictionaryResultType. Có thể lấy ObjectId của đối tượng trong từ điển này không? Nếu không, tôi sẽ cần phải chạy truy vấn với kiểu trả về là NSManagedObjectResultType, chậm hơn nhiều đối với một số lượng lớn các mục được trả về.Dữ liệu cốt lõi, cách lấy ObjectId của NSManagedObject khi NSFetchRequest trả về NSDictionaryResultType?

Trả lời

76

Có thể, bằng cách sử dụng lớp học NSExpressionDescription rất tiện lợi nhưng không được ghi nhận. Bạn cần thêm đối tượng NSExpressionDescription được định cấu hình đúng vào mảng của các đối tượng NSPropertyDescription bạn đặt qua setPropertiesToFetch: cho số NSFetchRequest của mình.

Ví dụ:

NSExpressionDescription* objectIdDesc = [[NSExpressionDescription new] autorelease]; 
objectIdDesc.name = @"objectID"; 
objectIdDesc.expression = [NSExpression expressionForEvaluatedObject]; 
objectIdDesc.expressionResultType = NSObjectIDAttributeType; 

myFetchRequest.propertiesToFetch = [NSArray arrayWithObjects:objectIdDesc, anotherPropertyDesc, yetAnotherPropertyDesc, nil]; 
NSArray* fetchResults = [myContext executeFetchRequest:myFetchRequest error:&fetchError]; 

Sau đó, bạn nên có một chìa khóa @"objectID" trong các từ điển bạn trở lại từ yêu cầu lấy bạn.

+2

đẹp tìm Nick, và ghi lại ví dụ của bạn được rất nhiều đánh giá cao –

+1

Đây là câu trả lời kỳ lạ của năm :) –

0

Giải pháp duy nhất tôi đã tìm thấy cho đến nay đang thực hiện một giây lấy yêu cầu, đó là tương tự như ban đầu lấy yêu cầu trừ những khác biệt sau:

[fetchRequest setReturnsObjectsAsFaults:YES]; 
[fetchRequest setPropertiesToFetch:nil]; 
[fetchRequest setFetchLimit:1]; 
[fetchRequest setFetchOffset:index]; // The index for which the objectID is needed 
[request setResultType:NSManagedObjectIDResultType]; 

này sẽ làm cho lấy yêu cầu phải trả lại một mảng với chính xác một đối tượng, đối tượng mong muốnID. Hiệu suất có vẻ tốt, ngay cả khi kết quả của yêu cầu tìm nạp ban đầu chứa 10.000 đối tượng.

Nếu có cách nào tốt hơn để xử lý việc này, tôi sẽ rất vui nếu ai đó có thể đăng chúng ở đây.

4
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    request.entity = [NSEntityDescription entityForName:@"yourEntity" inManagedObjectContext:context]; 
    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES], nil]; 
    request.predicate = nil; 
    request.fetchLimit = 20; 

    NSError *error = nil; 
    NSArray fetchedResults = [context executeFetchRequest:request error:&error]; 

    NSLog(@"%@", [fetchedResults valueForKey:@"objectID"]); 

Từ kết quả lấy bạn đã có trong một mảng tại sao không kéo chúng ra với valueForKey: @ "ObjectId"? Sạch sẽ, đơn giản chỉ cần một yêu cầu tìm nạp để bạn có thể kéo tất cả dữ liệu khác mà bạn cần.

+1

Jason muốn kết quả ở định dạng từ điển, trong khi cách tiếp cận của bạn trả về một đối tượng được quản lý bị lỗi – unixo

0

câu trả lời Nick Hutchinson ở Swift:

let idDescription = NSExpressionDescription() 
    idDescription.name = "objectID" 
    idDescription.expression = NSExpression.expressionForEvaluatedObject() 
    idDescription.expressionResultType = .objectIDAttributeType 

Tôi không thể bình luận về nó bởi vì tôi không có đủ diện :(

Các vấn đề liên quan