2017-05-17 4 views
0

私のアプリケーションでは、Webサービスからエンティティのコンテンツをリフレッシュするときに、自分のコアデータ内のすべてのレコードを削除し、新しいものをすべて挿入します。しかし、文脈が再び呼び出されたとしても、レコードは文脈から削除されないことが多い。だから私が保存するとき、古いものは残っていて、私はちょうど既存のものの上に積み重なり、重複をたくさん得てしまいます。どのように私は完全にコンテキストをクリアすることができますので、重複について心配する必要はありませんか?NSBatchDeleteRequestの後のコアデータの使用

var appDelegate = UIApplication.shared.delegate as! AppDelegate 
    var context = appDelegate.persistentContainer.viewContext 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "V_ServiceDetails") 

    // Clear all 
    let request = NSBatchDeleteRequest(fetchRequest: fetchRequest) 

    do { 
     let result = try context.execute(request) 
    } catch {} 

    appDelegate = UIApplication.shared.delegate as! AppDelegate 
    context = appDelegate.persistentContainer.viewContext 

    // Add new ones 
    for svc in self.svcs { 
     let result = NSEntityDescription.insertNewObject(forEntityName: "V_ServiceDetails", into: context) 

     result.setValue(svc.Car_VIN, forKey: "car_VIN") 
     result.setValue(svc.Cust_Veh_ID, forKey: "cust_Veh_ID") 

     do { try context.save() } catch {} 
    } 
+0

コンテキスト内のアイテムを削除した後。コンテキスト 'context.save()'を保存しようとすることができます – TheAppMentor

+0

@TheAppMentor私はそれを更新しました: 'do { } result = try context.execute(リクエスト) try context.save() } catch {}'それは何の違いもありませんでした。 –

答えて

0

以下、この機能を試してみてください:Apple docs on batch deleteから

func deleteAll() { 

    // Managed Object Context 
    let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

    // Save the changes of the Managed Object Context before executing the Batch Delete Request 
    if managedObjectContext.hasChanges { 
     do { 
      try managedObjectContext.save() 
     } catch { 
      // Error 
     } 
    } 

    // Craete a Fetch Request 
    let fetchRequest: NSFetchRequest<ManagedObject> = ManagedObject.fetchRequest() 

    // Initiliaze the Batch Delete Request 
    let batchDeleteRequest = NSBatchDeleteRequest.init(fetchRequest: fetchRequest as! NSFetchRequest<NSFetchRequestResult>) 

    // Configure the Batch Delete Request 
    batchDeleteRequest.resultType = .resultTypeCount 

    do { 

     // Execute the Batch Delete Request 
     try managedObjectContext.execute(batchDeleteRequest) 

     // Reset the Managed Object Context 
     managedObjectContext.reset() 

     // try self.fetchedResultsController.performFetch() 
     // If you have a Table View? Use this function 
     // self.tableView.reloadData() 

    } catch { 
     // Error 
    } 
} 
0

を、それが削除は、SQLレベルで直接実行されていることを述べています。削除したものはであり、メモリ内にあるオブジェクトには反映されませんですので、削除後にアプリケーションを更新する必要があります。リンクされたページの実行後のアプリケーションの更新のセクションを参照してください。

関連する問題