Neden bağlamı aramamız gerekiyor?delete NSManagedObject dizisinden bir öğeyi silmek için?

0

Soru

Sanırım var ;

var itemArray = [Item]()

ve Öğe bir NSManagedObject. Öğenin iki özniteliği vardır: "Title": String ve "Done": Boolean. İşte veri modelimin resmi.

enter image description here

//  Item+CoreDataClass.swift

//  This file was automatically generated and should not be edited.
//

 import Foundation
 import CoreData

 public class Item: NSManagedObject {

 }

Bitti değerini değiştirdiğimde ve bağlamı çağırdığımda.kaydet, otomatik olarak Kalıcı Kapsayıcıya yansıtılır. Ancak, bir öğeyi diziden kaldırdığımda,

itemArray.remove(at: someindex)

ve bağlamı arayın.kaydetmek. Öğe Kalıcı Kapsayıcıdan silinmez. Sadece ararsam,

context.delete(itemArray[someindex])

ardından öğe gerçekten depodan silinir.

Öyleyse neden bir özniteliğin değerini değiştirmek ve bağlamı kaydetmek, Temel Veriler üzerinde başarılı bir CRUD işlemi için yeterli olsa da, yalnızca itemArray ve save bağlamından kaldırmak yeterli değildir?

core-data ios swift
2021-11-23 12:52:23
3

En iyi cevabı

1

Bir Öğe nesnesindeki bir özniteliği değiştirdiğinizde, Çekirdek Veriler (aslında NSManagedObjectContext), Öğenin nsmanagedobjectcontext'e ait olduğunu ve öğenin kirli olarak işaretlendiğini algılar. Ancak dizinizin NSManagedObjectContext ile hiçbir şekilde bağlantısı yoktur, bu nedenle yaptığınız değişiklikler NSManagedObjectContext tarafından fark edilmeden kalır ve bu nedenle diziden kaldırdığınız öğeyi silmek istediğinizi açıkça söylemeniz gerekir.

Buna bakmanın başka bir yolu, Çekirdek Veri modelinizde oluşturduğunuz/tanımladığınız herhangi bir şeyin NSManagedObjectContext tarafından bilinmesi, ancak swift kodunda dışarıda oluşturulan herhangi bir şeyin bilinmemesidir. Varlıklar arasında çok ilişkilerle çalışmaya başlarsanız, çok koleksiyonundan nesne eklemenin veya kaldırmanın doğrudan NSManagedObjectContext tarafından diziniz için beklediğiniz şekilde işleneceğini görürsünüz.

2021-11-24 12:13:31
1

Dizi var itemArray = [Item]() temel veritabanı ile doğrudan bir ilişkisi yoktur. Bu nedenle, öğeleri bu diziden kaldırmak Çekirdek Veri veritabanını etkilemez.

Çekirdek Veri veritabanında NSManagedObject örnekleri oluşturmak, kaydetmek veya silmek için geçerli bir NSManagedObjectContext öğesinin ilgili işlevlerini çağırmanız gerekir.

2021-11-23 13:15:17
1

CoreData üzerindeki herhangi bir işlem şu şekilde yapılmalıdır NSManagedObjectContext veritabanındaki herhangi bir varlığa erişmek veya güncellemek için kazı kazan olduğu gibi. Yani sizin durumunuzda silerken Item varlık, bunu yalnızca veritabanına yansıtmak için bağlam aracılığıyla yapmalısınız.

var itemArray = [Item]()
let context = //get your context
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Item")
let predicate = NSPredicate(format: " (primaryKey == %@) ", "your_primary_key")
fetchRequest.predicate = predicate
itemArray = try! context.fetch(fetchRequest)
for i in 0 ..< itemArray.count where i < itemArray.count-1 {
    context.delete(itemArray[i])
}

do {
    try context.save()
} catch {
    // print the error
}
2021-11-23 14:54:08

Güncelleme çağrısının neden doğrudan CoreData tabanına yansıtıldığını merak ediyorum.
Akif

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................