2011-06-16 37 views
6

Tôi đang làm việc với một số loại NSManagedObject có nhiều mối quan hệ. Làm cách nào để tôi có thể cho Core Data tự động điền ID đối tượng cho tôi? Tôi đang tìm một cái gì đó giống như một khóa chỉ mục trong SQL, do đó không có hai trường hợp của một đối tượng nhất định được phép có cùng một ID.ID đối tượng tự động tăng trong dữ liệu lõi?

Edit:

Tôi muốn cho tất cả các đối tượng của tôi "Tài khoản" để có ID duy nhất trên chúng. Tôi chỉ thêm một vào `countForFetchRequest, nhưng tôi nhận ra rằng khi xóa đối tượng thứ hai đến đối tượng cuối cùng và sau đó thêm một đối tượng, hai đối tượng cuối cùng hiện có cùng các ID.

Làm cách nào để đảm bảo rằng giá trị đã cho có giá trị duy nhất cho tất cả các phiên bản của "Tài khoản" NSManagedObject của tôi?

EDIT2:

tôi cần phải có một ID riêng để phân loại các mục đích.

Trả lời

4

Cách tôi giải quyết vấn đề này là tập hợp dữ liệu cốt lõi. Tôi thực sự tự mình chỉ định ID.

Về cơ bản, tôi truy vấn Dữ liệu cốt lõi cho tất cả các ID thực thể của pháp nhân của tôi và sau đó lặp qua chúng. Nếu tôi tìm thấy một ID cao hơn giá trị tạm thời hiện tại, tôi sẽ tạo ID tạm thời cao hơn ID cao nhất. Khi tôi hoàn thành, tôi tự động có một ID cao hơn giá trị cao nhất trong danh sách. Lỗ hổng duy nhất tôi thấy với điều này là nếu có một ID bị thiếu. (Tôi tin rằng có một sửa chữa đơn giản cho điều này là tốt.)

// 
// Create a new entity description 
// 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext]; 

// 
// Set the fetch request 
// 

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setEntity:entity]; 

// 
// We need to figure out how many 
// existing groups there are so that 
// we can set the proper ID. 
// 
// To do so, we use an aggregated request. 
// 

[fetchRequest setResultType:NSDictionaryResultType]; 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"entityID"]]; 

NSError *error = nil; 

NSArray *existingIDs = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 


if (error != nil) { 

    // 
    // TODO: Handle error. 
    // 

    NSLog(@"Error: %@", [error localizedDescription]); 
} 

NSInteger newID = 0; 

for (NSDictionary *dict in existingIDs) { 
    NSInteger IDToCompare = [[dict valueForKey:@"entityID"] integerValue]; 

    if (IDToCompare >= newID) { 
     newID = IDToCompare + 1; 
    } 
} 

// 
// Create the actual entity 
// 

MyEntity *newEntity = [[MyEntity alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; 

// 
// Set the ID of the new entity 
// 

[newEntity setEntityID:[NSNumber numberWithInteger:newID]]; 

// 
// ... More Code ... 
// 
+0

Bạn không cần phải tìm nạp tất cả các hàng - chỉ sử dụng cuối cùng sắp xếp giảm dần theo vị từ id – HotJard

+2

nếu bạn sử dụng thực thể record.entityID = @ ([[Entity findFirstOrderedByAttribute: @ "entityID" tăng dần: NO] entityID] .intValue + 1); – Eldhose

10

Tất cả NSManagedObjects tự động có một số NSManagedObjectID duy nhất. Không có khái niệm về thuộc tính tăng tự động tùy chỉnh, nhưng chắc chắn dễ dàng viết một thuộc tính.

+0

Tôi có thể sử dụng NSManagedObjectID để lấy mục cụ thể đó từ kho dữ liệu cốt lõi không? – Moshe

+0

Có, hãy xem http://stackoverflow.com/questions/4720182/core-data-the-primary-key-id-of-a-row-in-the-database/4725959#4725959 – Jano

+0

Tôi thực sự đã kết thúc bằng văn bản tự động gia tăng sử dụng tổng hợp. Xem câu trả lời của tôi, nếu bạn muốn. 1 cho bạn. – Moshe

3

accroding để EDIT2 và Edit3 của bạn, sau câu trả lời sẽ giúp bạn .. Giả sử trường id của bạn như NSNumber có unsignedInt như ID.

1) Tìm nạp tất cả các bản ghi cho thực thể tương ứng.

NSError *error = nil; 
NSArray *array = [self fetchAllFileEntity:&error]; 

2) Tìm số tối đa thuộc về kết quả đó.

NSNumber *maxValue = nil; 
if (array) 
    maxValue = [array valueForKeyPath:@"@max.uniqueId.unsignedIntegerValue"]; 
else 
    maxValue = [NSNumber numberWithUnsignedInteger:0]; 

3) Gán maxvalue + 1 để tổ chức mới của bạn

entity.uniqueId = [NSNumber numberWithUnsignedInteger:maxValue.unsignedIntegerValue+1]; 
+2

điều gì xảy ra khi tôi xóa một số hàng (hàng có giá trị tối đa) – souvickcse

+1

giải thích bằng ví dụ: Giả sử bạn có 5 hàng nghĩa là @max count là 5. Bây giờ bạn muốn xóa hàng thứ 5, số lượng tối đa là 4 Vì vậy, khi bạn đang cố gắng để thêm mới, tự động gán 5 cho một cái mới, có nghĩa là, tất cả các hàng nếu tồn tại ở bảng phải có giá trị duy nhất (local db). – Mani

+0

Tôi đang đối mặt với cùng một vấn đề có thể bất kỳ ai có thể cung cấp giải pháp thích hợp. – Ayaz

1

tôi đã đưa ra giải pháp này cho vấn đề nói, hy vọng nó sẽ là hữu ích cho một số một.

AppDelegate *appdelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

NSManagedObjectContext *context = [appdelegate managedObjectContext]; 

NSError *error = nil; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

NSEntityDescription *chatHist = [NSEntityDescription 
            entityForName:@"ChatHistory" inManagedObjectContext:context]; 
[fetchRequest setEntity:chatHist]; 

int chatIdNumber = 0; 

NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 
if ([fetchedObjects count] > 0) { 
    ChatHistory *chatHistObj = [fetchedObjects objectAtIndex:[fetchedObjects count]-1]; 
    chatIdNumber = [chatHistObj.chatId intValue]; 
} 

chatIdNumber = chatIdNumber+1; 
ChatHistory *chat_History = [NSEntityDescription   insertNewObjectForEntityForName:@"ChatHistory" inManagedObjectContext:context]; 

chat_History.chatId = [NSString stringWithFormat:@"%d",chatIdNumber]; 
Các vấn đề liên quan