6

私はコアデータにオブジェクトを追加しようとしています。だから、私はそれがコアデータストアで重複したエントリを許可しないようにしたいと思います。どうやってするか?これは、データの保存に関連する私のコードです。

  -(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");

    }


}
4

5 に答える 5

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

これがお役に立てば幸いです。

于 2013-03-06T10:35:20.800 に答える
2

いいえ、coredataはDBではないため、Uniquingに組み込まれていません。


プログラムロジックの一意性を保証する必要があります。

たとえば、多くの場合、一意である必要があるエントリに対してフェッチを実行し、そのフェッチに1つのエントリがある場合は、別のエントリを追加しないでください。それ以外の場合は追加してください。

==>これはシリアルCDアクセスには適していますが、マルチスレッド環境で実行される複数のコンテキストでは複雑になる可能性があります

于 2013-03-06T10:06:22.420 に答える
2

最良のアプローチは、述語を使用してcountForFetchRequestメソッドを呼び出し、ストアに一致するオブジェクトがあるかどうかを評価することだと思います。このタイプのリクエストはオブジェクトをプルバックしないため、他のソリューションよりもパフォーマンスが高いはずです。これは、NSManagedObjectサブクラスに追加されたSwift2.0の実装です。

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

    }
于 2015-09-14T02:18:25.267 に答える
1

Core Dataには、少なくともCore Dataに関する限り、重複するエントリなどはありません。データベースの観点からそれを見るという意味ではありません。Core Dataはデータベースではないため、オブジェクトグラフ管理システムであるため、これは理にかなっています。

したがって、重複を防ぐには、最初に検索を実行してから、検索が返された場合NULLのみ保存し、それ以外の場合は何もしない必要があります。

この記事では、ニーズに合わせてカスタマイズできるコードを提供します

于 2013-03-06T10:07:51.057 に答える
0

Appleサンプルコード自体からの最善のアプローチを紹介します。詳細については、サンプルコード「ThreadedCoreData」を参照してください。

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];
        }
    }
于 2017-05-25T12:06:01.920 に答える