2012-03-11 17 views
9

मैंने एक समस्या में भाग लिया है।आईओएस 5 में कोर डेटा बनाने डुप्लिकेट को कैसे रोकें?

सप्ताहांत में मैं एक परियोजना पर काम कर रहा हूं जहां मैं एक webservice से एक बड़ा एक्सएमएल खींच रहा हूं।

मूल रूप से इसमें 3 स्तर होते हैं - ग्राहक, प्रबंधक, स्टाफ सभी पदानुक्रमिक। तो पहली बार ऐप चलता है, यह इस एक्सएमएल को खींचता है और इसे पार करता है और 3 रिलीज इकाइयों - ग्राहकों, प्रबंधकों और कर्मचारियों में सभी प्रविष्टियां बनाता है।

हर बार ऐप लॉन्च होने पर मुझे उसी एक्सएमएल को नीचे खींचने की ज़रूरत होती है, लेकिन इस बार, मुझे केवल मौजूदा रिकॉर्डों में से किसी एक को 'अपडेट' करने की ज़रूरत है, या नए क्लाइंट, प्रबंधकों या कर्मचारियों के लिए नए जोड़ें आखिरी बार से दिखाई दिया है।

तो - फिलहाल, जैसा कि मैंने कहा था, यह सब इसे खींच रहा है, इसे सही ढंग से पार्स कर रहा है और सही इकाइयों को बना रहा है और सभी विशेषताओं को भर रहा है।

हालांकि, कोई डेटा परिवर्तन के साथ, 2 लांच पर यह डेटा के सभी डुप्लिकेट है - तो बजाय 15 ग्राहकों (सही संख्या) मैं 30 है और इतने पर ...

मैं वास्तव में करने के लिए है एक नया NSManagedObject बनाने के बजाय, यह जांचने के लिए मेरे पार्सिंग में बहुत सारे कोड जोड़ें, मैं जांचता हूं कि यह पहले से मौजूद है या नहीं?

और यदि यह है - तो मुझे मैन्युअल रूप से प्रत्येक विशेषता की जांच करनी होगी?

यह बहुत दर्दनाक और लम्बाई वाला है - क्या कोर डेटा को मेरे लिए इस तरह की चीजें करने का कोई तरीका नहीं है - स्वचालित रूप से?

किसी भी मदद या सुझाव के लिए धन्यवाद।

उत्तर

3

एप्पल डॉक्स में कहा गया है https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

आप डेटा मॉडल पाश की जरूरत है और इस

उदाहरण की तरह वहाँ से इसे संभाल :

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

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 

व्यक्तिगत रूप से मैं ली नहीं के इस विधि और मैंने कोड के इस स्निपेट को लिखा है जो इसे प्रो-कुशल मनोर में संभालता है और जो सीधे आगे है! मैंने एप्पल विधि के साथ देखा कि मैं कैपिटल अक्षरों और रिक्त स्थान जैसे विभिन्न पात्रों वाले तारों के साथ मुद्दों में भाग गया। नीचे कोड का परीक्षण और काम किया जाता है यदि आप अपने सभी संबंधित वस्तुओं का सही नाम बदलते हैं तो मैं ईमानदारी से मानता हूं कि कोर डेटा में डुप्लीकेट जोड़ने को पूरा करने का यह सबसे प्रभावी तरीका है।

-(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

क्यों fetch परिणामों के लिए mutable प्रतिलिपि? – dmur

12

मुझे डर है कि आपको अपने डीबी को अपने आप से साफ रखना होगा ... सबसे आसान तरीका NSFetchRequest का उपयोग करेगा: अपने अपडेट किए गए डेटा को आयात करते समय आप मौजूदा डेटा के खिलाफ एक क्वेरी चला सकते हैं और तय कर सकते हैं कि आप क्या करना चाहते हैं।

मार्कस एस Zarra के रूप में another thread में उल्लेख किया है इस विषय के बारे में:

जब आप एक नई पंक्ति आप अगर यह जगह में पहले से ही है यह देखने के लिए मौजूदा पंक्तियों के खिलाफ एक प्रश्न चला सकते हैं आयात कर रहे हैं। ऐसा करने के लिए आप अपने इकाई के खिलाफ एक NSFetchRequest बनाने के लिए, के लिए GUID संपत्ति देखने के लिए और स्थापित करने के लिए विधेय सेट की गई अधिकतम पंक्तियों 1.

में लौटे मैं अपने आयात के दौरान चारों ओर इस NSFetchRequest रखने की सलाह देते हैं तो आप कर सकते हैं कि आयात के माध्यम से जाकर इसका पुन: उपयोग करें। यदि NSFetchRequest एक पंक्ति देता है तो आप उस पंक्ति को अपडेट कर सकते हैं। यदि यह कोई पंक्ति नहीं देता है तो आप एक नई पंक्ति डाल सकते हैं।

सही तरीके से किए जाने पर आपको स्वीकार्य प्रदर्शन अधिक मिलेगा।

अच्छी जानकारी के लिए एक और स्रोत हैं सेब प्रोग्रामिंग गाइड: Core Data Programming Guide

+0

हाँ, मुझे लगा। – iOSProgrammingIsFun

+0

@iOSProgrammingIsFun अगर मेरी पोस्ट सहायक थी तो आप इसे स्वीकार कर सकते हैं :) – dom

+1

लिंक मर चुका है – Besi

संबंधित मुद्दे