Почему нам нужно вызвать context.delete, чтобы удалить элемент из массива NSManagedObject?

0

Вопрос

Предположим, у меня есть;

var itemArray = [Item]()

и элемент является объектом NSManagedObject. Элемент имеет два атрибута "Заголовок":Строка и "Готово":Логическое значение. Вот изображение моей модели данных.

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 {

 }

Когда я изменяю значение Готово и вызываю context.save, оно автоматически отражается в Постоянном контейнере. Однако, когда я удаляю элемент из массива, говоря,

itemArray.remove(at: someindex)

и вызовите контекст.сохраните. Элемент не удаляется из постоянного контейнера. Только если я позвоню,

context.delete(itemArray[someindex])

тогда товар действительно удаляется из магазина.

Так почему же недостаточно только удалить из itemArray и сохранить контекст, хотя для успешной работы с основными данными достаточно изменить значение атрибута и сохранить контекст?

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

Лучший ответ

1

При изменении атрибута объекта элемента Основные данные (фактически NSManagedObjectContext) обнаруживают, что, поскольку элемент принадлежит NSManagedObjectContext, и элемент помечен как грязный. Но ваш массив никоим образом не связан с NSManagedObjectContext, поэтому любые изменения, которые вы в него вносите, остаются незамеченными NSManagedObjectContext, и именно поэтому вам нужно явно сообщить ему, что вы хотите удалить элемент, который вы удалили из массива.

Другой способ взглянуть на это заключается в том, что все, что вы создаете/определяете в своей основной модели данных, известно NSManagedObjectContext, но все, что создано вне swift-кода, неизвестно. Если вы начнете работать с отношениями "ко многим" между сущностями, вы увидите, что добавление или удаление объектов из коллекции "ко многим" будет обрабатываться непосредственно NSManagedObjectContext так, как вы ожидали для своего массива.

2021-11-24 12:13:31
1

Массив var itemArray = [Item]() не имеет прямого отношения к базовой базе данных. Поэтому удаление элементов из этого массива не влияет на базу данных основных данных.

Чтобы создать, сохранить или удалить экземпляры NSManagedObject в базе данных основных данных, вам необходимо вызвать соответствующие функции допустимого NSManagedObjectContext.

2021-11-23 13:15:17
1

Любая операция с CoreData должна выполняться через NSManagedObjectContext поскольку это блокнот для доступа или обновления любой сущности в базе данных. Так что в вашем случае при удалении Item сущность, вы должны делать это через контекст только для того, чтобы получить отражение в базе данных.

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

Мне интересно, почему вызов обновления напрямую отражается на базе CoreData.
Akif

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................