2013-03-06 6 views
5

मैं कोर डेटा में ऑब्जेक्ट्स जोड़ने की कोशिश कर रहा हूं। इसलिए, मैं चाहता हूं कि इसे कोर डेटा स्टोर में डुप्लिकेट प्रविष्टियों की अनुमति न दें। उसको कैसे करे? यह मेरा कोड डेटा सहेजने से संबंधित है।क्या कोई तरीका है कि हम मूल डेटा में डुप्लिकेट प्रविष्टियों को प्रतिबंधित कर सकते हैं?

-(IBAction)save:(id)sender 
    { 

     if([name.text isEqualToString:@""] && [address.text isEqualToString:@""] && [phone.text isEqualToString:@""]) 
     { 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!" 
                 message:@"Data Not Saved" 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
      [alert show]; 
     } 
    else 
    { 
     coreDataAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

     NSManagedObjectContext *context = [appDelegate managedObjectContext]; 


     NSManagedObject *newContact; 
     newContact = [NSEntityDescription 
         insertNewObjectForEntityForName:@"Contacts" 
         inManagedObjectContext:context]; 


     [newContact setValue:name.text forKey:@"name"]; 
     [newContact setValue:address.text forKey:@"address"]; 
     [newContact setValue:phone.text forKey:@"phone"]; 


     name.text = @""; 
     address.text = @""; 
     phone.text = @""; 

     NSError *error; 
     [context save:&error]; 

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!" 
                message:@"Data Saved" 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
     [alert show]; 

     NSLog(@"Object Saved\n"); 

    } 


} 
+0

तुम्हें बचा है, तो देखें कि क्या प्रवेश या मौजूदा नहीं है। अगर मौजूदा बस अद्यतन है। यदि कोई नई प्रविष्टि नहीं बनाती है और फिर इसे डीबी – Meera

उत्तर

6

को अनुकूलित कर सकते हैं वहाँ के रूप में कोई विधि में बनाया उपलब्ध, आप परिणामों को लाने और जाँच परिणाम आपत्ति आप दोहराया नहीं करना चाहते हैं कि क्या करने की जरूरत है कोड देता है।

-(void)checkForDuplicates 
{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Students" 
              inManagedObjectContext:managedObjectContext]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"students" 
                   ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

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

    NSError *Fetcherror; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext 
             executeFetchRequest:request error:&Fetcherror] mutableCopy]; 

    if (!mutableFetchResults) { 
     // error handling code. 
    } 

    if ([[mutableFetchResults valueForKey:@"users"] 
     containsObject:name.text]) { 
     //notify duplicates 
     return; 
    } 
    else 
    { 
     //write your code to add data 
    } 
} 

आशा यह आप मदद कर सकते हैं:

यहाँ कोड का टुकड़ा है!

+0

धन्यवाद। :) यह इस त्वरित कामकाज और भविष्यवाणियों का उपयोग करने के बीच था। –

+0

यदि आप हर बार ताजा डेटा चाहते हैं तो बस इकाई से सामग्री हटाएं और ताजा डेटा डालें। –

2

नहीं, CoreData है कोई अंतर्निहित uniquing में के रूप में यह एक डीबी नहीं है।


आपको अपने प्रोग्राम तर्क में विशिष्टता सुनिश्चित करना है।

उदा अक्सर, कोई प्रविष्टि के लिए एक लाता है जो अद्वितीय होना चाहिए और यदि उस fetch में 1 प्रविष्टि है, तो कोई और जोड़ें, अन्यथा इसे जोड़ें!

==> इस धारावाहिक सीडी पहुँच के लिए अच्छी तरह से काम करता है, लेकिन कोर के रूप में कई संदर्भों है कि एक बहु-क्रम env

1

कोर डाटा में डुप्लिकेट प्रविष्टियों जैसी कोई चीज नहीं है में चलाने के साथ जटिल हो सकता है, के रूप में कम से कम जहाँ तक डेटा चिंतित है। डेटाबेस बिंदु से इसे देखने की भावना में नहीं। जो समझ में आता है क्योंकि कोर डेटा डेटाबेस नहीं है यह एक ऑब्जेक्ट ग्राफ़ प्रबंधन प्रणाली है।

तो डुप्लिकेट को रोकने के लिए आपको पहले एक खोज करने की आवश्यकता है, यदि खोज NULL केवल तब सहेजती है, तो कुछ भी नहीं करें।

This article आप जो आप अपनी आवश्यकताओं

+0

पर सहेजते हैं तो आपको सभी सुझावों के लिए धन्यवाद। –

+0

@ShailendraKrGangwar मदद करने में खुश! कृपया स्वीकार किए गए उत्तर के रूप में ऊपर उठाना या चिह्नित करें किसी भी उत्तर ने आपकी मदद की है ... –

+0

@ श्रीकर, वह लिंक नीचे है। मैं इस लेख का भी उपयोग कर सकता था। क्या आपके पास इसका दूसरा स्रोत है? धन्यवाद! –

1

मुझे लगता है कि countForFetchRequest विधि को यह अनुमान लगाने के लिए सबसे अच्छा तरीका होगा कि आपके स्टोर में मिलान करने वाली वस्तु है या नहीं। चूंकि इस प्रकार का अनुरोध किसी ऑब्जेक्ट को वापस नहीं खींचता है, इसलिए यह अन्य समाधानों की तुलना में अधिक प्रदर्शनकारी होना चाहिए। यहां एक स्विफ्ट 2.0 कार्यान्वयन एक एनएसएमएनेज्ड ऑब्जेक्ट उपclass में जोड़ा गया है।

func tokenExists (aToken:String) -> Bool { 
     let request: NSFetchRequest = NSFetchRequest(entityName: self.className!) 

     let predicate = NSPredicate(format: "token == %@", argumentArray: [aToken]) 

     request.predicate = predicate 

     let error: NSErrorPointer = nil 

     let count = self.managedObjectContext!.countForFetchRequest(request, error: error) 

     if count == NSNotFound { 
      return false 
     } 
     return true 
    } 

एनबी - (एक किसी भी समानता मापदंड आप विधेय के लिए चाहते स्थानापन्न लेकिन यह है कि अगर एक सर्वश्रेष्ठ प्रदर्शन के लिए उपलब्ध ~ है यदि संभव हो तो आप एक संख्यात्मक पहचानकर्ता का उपयोग करना चाहिए ध्यान में रखना सकता है)

उपयोग:

एक हो सकता है तो प्रविष्टि के दौरान ऊपर समारोह का उपयोग करें:

func insertToken (value:String) { 

     if !tokenExists(value) { 
      self.token = value 
      saveState() 
     } 

    } 
0

मुझे ऐप्पल नमूना कोड से सबसे अच्छा तरीका रखने दें। अधिक जानकारी के लिए कृपया नमूना कोड "थ्रेडेडकोरडाटा" देखें।

https://developer.apple.com/library/content/samplecode/ThreadedCoreData/Introduction/Intro.html

// before adding the earthquake, first check if there's a duplicate in the backing store 
    NSError *error = nil; 
    Earthquake *earthquake = nil; 
    for (earthquake in earthquakes) { 
     fetchRequest.predicate = [NSPredicate predicateWithFormat:@"location = %@ AND date = %@", earthquake.location, earthquake.date]; 

     NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
     if (fetchedItems.count == 0) { 
      // we found no duplicate earthquakes, so insert this new one 
      [self.managedObjectContext insertObject:earthquake]; 
     } 
    } 
+0

यह बहु थ्रेडेड पर्यावरण पर काम नहीं करेगा –

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