Por que precisamos para chamar o contexto.excluir para excluir um item de NSManagedObject matriz?

0

Pergunta

Suponha que eu tenha;

var itemArray = [Item]()

e o Item é um NSManagedObject. Item tem dois atributos "Title":Cadeia de caracteres e "Feito":Boolean. Aqui está a foto do meu modelo de dados.

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 {

 }

Quando eu alterar o valor do Feito e o contexto de chamada.salve, é refletida automaticamente Persistente Recipiente. No entanto, quando eu remover um elemento de matriz,dizendo:

itemArray.remove(at: someindex)

e o contexto de chamada.salvar. O item não é excluído do Persistente Recipiente. Só se eu liguei,

context.delete(itemArray[someindex])

em seguida, o item é verdadeiramente excluídos da loja.

Então, por que apenas a remoção de itemArray e salvar o contexto não é suficiente, embora a alteração de um atributo de valor e salvar o contexto é suficiente para o sucesso da operação CRUD no Núcleo de Dados?

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

Melhor resposta

1

Quando você alterar um atributo em um objeto de Item, em seguida, os Dados do Núcleo (na verdade, o NSManagedObjectContext) detecta que uma vez que o Item pertence ao NSManagedObjectContext e o item está marcado como danificado. Mas a matriz não tem nenhuma conexão com o NSManagedObjectContext de forma alguma, portanto, qualquer alteração que você faz para continua a ser detectada pelo NSManagedObjectContext e é por isso que você precisa dizer explicitamente que você deseja excluir o item é removido da matriz.

Outra maneira de olhar para isso é que qualquer coisa que você criar/definir no seu Core modelo de Dados é conhecido por NSManagedObjectContext mas tudo o que é criado fora no código swift é desconhecido. Se você começar a trabalhar com o para-muitos relacionamentos entre entidades, você vai ver que, em seguida, adicionar ou remover objetos de para-muitos coleção vai ser tratadas diretamente pelo NSManagedObjectContext em uma maneira que você esperava para sua matriz.

2021-11-24 12:13:31
1

Matriz var itemArray = [Item]() não tem nenhuma relação direta com o banco de dados subjacente. Portanto, a remoção de itens da matriz não afeta o Núcleo do banco de Dados.

Para criar, salvar ou excluir NSManagedObject instâncias em um Núcleo de banco de Dados que você precisa para chamar as funções relacionadas de um válido NSManagedObjectContext.

2021-11-23 13:15:17
1

Qualquer operação em CoreData deve ser feito através de NSManagedObjectContext como é o rascunho para acessar ou atualizar qualquer entidade no banco de dados. Então, no seu caso, ao eliminar o Item entidade, você deve fazer isso por meio de contexto só para se reflete no banco de dados.

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

Eu estou querendo saber sobre o porquê de a chamada de atualização reflete diretamente no CoreData da base de dados.
Akif

Em outros idiomas

Esta página está em outros idiomas

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