2012-03-11 25 views
9

Tôi đã gặp sự cố.Làm thế nào để ngăn chặn Core Data làm bản sao trong iOS 5?

Cuối tuần qua tôi đã làm việc trên một dự án mà tôi đang kéo một xml lớn từ một dịch vụ web.

Về cơ bản, nó có 3 tầng - Khách hàng, Người quản lý, Nhân viên đều phân cấp. Vì vậy, lần đầu tiên các ứng dụng chạy, nó kéo xml này và phân tích nó và tạo ra tất cả các mục trong 3 thực thể releated - Khách hàng, người quản lý và nhân viên. Mỗi khi ứng dụng khởi chạy, tôi cần phải kéo cùng một XML xuống, nhưng lần này, tôi chỉ cần 'cập nhật' bất kỳ bản ghi hiện có nào đã thay đổi hoặc thêm bản ghi mới cho khách hàng mới, người quản lý hoặc nhân viên đã xuất hiện kể từ lần trước.

Vì vậy, tại thời điểm này, như tôi đã nói, nó kéo tất cả, phân tích cú pháp chính xác và tạo các thực thể chính xác và điền vào tất cả các thuộc tính.

Tuy nhiên, không có sự thay đổi dữ liệu, về sự ra mắt thứ 2 nó sao chép tất cả dữ liệu - vì vậy thay vì 15 khách hàng (con số chính xác) Tôi có 30 và vân vân ...

Tôi thực sự phải thêm rất nhiều mã trong phân tích cú pháp của tôi để kiểm tra xem thay vì tạo một NSManagedObject mới, tôi kiểm tra xem nó đã có sẵn chưa?

Và nếu có - tôi phải kiểm tra thủ công từng thuộc tính?

Thật là đau đớn và kinh khủng - không có cách nào để làm cho Dữ liệu cốt lõi thực hiện công cụ này cho tôi - tự động?

Cảm ơn bạn đã được trợ giúp hoặc gợi ý.

Trả lời

3

Như đã trình bày trong Apple Documents https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

Bạn cần vòng lặp mô hình dữ liệu và xử lý nó từ đó như

Ví dụ này :

// loop over employeeIDs 
// anID = ... each employeeID in turn 
// within body of loop 

NSString *predicateString = [NSString stringWithFormat: @"employeeID == %@", anID]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 

Cá nhân tôi không li ke phương pháp này và tôi đã viết đoạn mã này xử lý điều này trong một trang viên hiệu quả và thẳng về phía trước! Tôi nhận thấy với phương pháp Apples tôi gặp phải các vấn đề với các chuỗi có các ký tự khác nhau như chữ cái và không gian của thủ đô. Dưới đây mã được kiểm tra và làm việc nếu bạn đổi tên tất cả các đối tượng tương ứng của bạn một cách chính xác Tôi thành thật tin rằng đây là cách hiệu quả nhất để thực hiện không thêm bản sao trong dữ liệu cốt lõi.

-(void)AvoidDuplicatesinDataModel 
{ 
    // Define our table/entity to use 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" 
               inManagedObjectContext:managedObjectContext]; 

    // Setup the fetch request 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    // Define how we will sort the records 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"users" 
                    ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 

    // Fetch the records and handle an error 
    NSError *Fetcherror; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext 
              executeFetchRequest:request error:&Fetcherror] mutableCopy]; 

    if (!mutableFetchResults) { 
     // Handle the error. 
     // This is a serious error 
    } 

    //here usersNameTextField.text can be any (id) string that you are searching for 
    if ([[mutableFetchResults valueForKey:@"users"] 
     containsObject:usernameTextField.text]) { 
     //Alert user or handle your duplicate methods from here 
     return; 
    } 
} 
+0

lý do sao chép có thể thay đổi cho kết quả tìm nạp? – dmur

12

Tôi sợ bạn phải tự mình làm sạch DB ... Cách dễ nhất là sử dụng NSFetchRequest: Khi nhập dữ liệu đã cập nhật, bạn có thể chạy truy vấn đối với dữ liệu hiện có và quyết định bạn muốn làm gì.

Như Marcus S. Zarra nêu tại another thread về chủ đề này:

Khi bạn đang nhập một hàng mới bạn có thể chạy một truy vấn đối với hàng hiện có để xem nếu nó đã được tại chỗ. Để làm điều này bạn tạo một NSFetchRequest chống lại tổ chức của bạn, thiết lập vị ngữ để tìm kiếm tài sản guid và thiết lập các hàng max trở lại 1.

tôi sẽ khuyên bạn nên giữ NSFetchRequest này xung quanh trong nhập khẩu của bạn để bạn có thể sử dụng lại nó trong khi thực hiện quá trình nhập. Nếu NSFetchRequest trả về một hàng, bạn có thể cập nhật hàng đó. Nếu nó không trả về một hàng thì bạn có thể chèn một hàng mới.

Khi thực hiện đúng, bạn sẽ thấy hiệu suất hơn có thể chấp nhận được.

Một nguồn cung cấp thông tin tốt là Táo Lập trình Hướng dẫn viên: Core Data Programming Guide

+0

Vâng, tôi đã đoán. – iOSProgrammingIsFun

+0

@iOSProgrammingIsFun Nếu bài đăng của tôi hữu ích, bạn có thể chấp nhận nó :) – dom

+1

Liên kết đã chết – Besi

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