有没有办法通过按下条形按钮项目来更新核心数据模型中的对象?

如何解决有没有办法通过按下条形按钮项目来更新核心数据模型中的对象?

我的目标是在编辑文本后按下完成按钮来更新核心数据中的对象。

完成按钮和下面的文本字段:

enter image description here

这是我的一些代码,

@objc func doneTapped() {

    
    do {
        try context.save()
    } catch {
        print("Error saving the new information \(error)")
    }
    
    dateEditableTextF.resignFirstResponder()
    selectedEventDate = dateEditableTextF.text
    dateEditableTextF.isEnabled = false
    
    costEditableTextF.resignFirstResponder()
    selectedEventCost = costEditableTextF.text
    costEditableTextF.isEnabled = false
    
    
    gradesEditableTextF.resignFirstResponder()
    selectedEventGrade = gradesEditableTextF.text
    gradesEditableTextF.isEnabled = false
    
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit,target: self,action: #selector(editTapped))
    
  
}

我希望当我在编辑文本字段后运行应用程序时按下完成按钮时,信息会更新,而当我返回到视图控制器时,信息会相同并且我的核心数据数据库会更新具有该对象的更新属性。

实际发生的情况是,当我完成编辑文本字段时,视图控制器中的数据会更新,但是当我离开视图控制器并返回时,数据会恢复到旧条目。

我看了大约 4 个关于 crud 方法的 youtube 视频,它们都是不同的场景,与我的不匹配,所以我希望这里有人可以提供帮助。提前致谢。

这是我的视图控制器的其余部分。

    @IBOutlet weak var costEditableTextF: UITextField!
    @IBOutlet weak var dateEditableTextF: UITextField!
    @IBOutlet weak var gradesEditableTextF: UITextField!
    
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    
    var updateTheEvents = [Event]()
    
    var selectedEventName: String?
    var selectedEventDate: String?
    var selectedEventCost: String?
    var selectedEventGrade: String?
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        navigationItem.title = selectedEventName
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit,action: #selector(editTapped))
     
        
     
        
        if let dateToLoad = selectedEventDate {
            dateEditableTextF.text = selectedEventDate
        }
        
        if let costToLoad = selectedEventCost {
            costEditableTextF.text = selectedEventCost
        }
        
        if let gradesToLoad = selectedEventGrade {
            gradesEditableTextF.text = selectedEventGrade
        }

        // Do any additional setup after loading the view.
    }
    
    
   @objc func editTapped() {
    
   
    dateEditableTextF.becomeFirstResponder()
    dateEditableTextF.isEnabled = true
    costEditableTextF.isEnabled = true
    gradesEditableTextF.isEnabled = true
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,action: #selector(doneTapped))
    
        
    }

解决方法

首先你需要创建一个存储来管理你的persistentContainer和CRUD操作:

class PersistenceManager {
lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "your_xcdatamodeld_name") //Here you should type the name of your xcdatamodeld file without the extension .xcdatamodeld
    container.loadPersistentStores(completionHandler: { (storeDescription,error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error),\(error.userInfo)")
        }
    })
    container.viewContext.automaticallyMergesChangesFromParent = true
    container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
    return container
}()
}

现在要保存数据,您需要一个上下文。我强烈建议你使用全局的。我在从外部函数访问商店上下文时遇到了几个问题(即没有添加/编辑东西)。请注意,尽管它对我很有用,但我不确定全局上下文是否是最佳实践。不过,我还遇到了任何问题。

在您的 PersistenceManager 类中,在persistentContainer 之前放置以下代码

static let shared = PersistenceManager()
var managedObjectContext: NSManagedObjectContext {
    persistentContainer.viewContext
}

并且,在课前和课外放以下内容

let context = PersistenceManager.shared.managedObjectContext
...
class PersistenceManager { [...] }

现在您必须像这样创建保存功能:

func saveContext () {
      if context.hasChanges {
          do {
              try context.save()
          } catch {
              let nserror = error as NSError
              fatalError("Unresolved error \(nserror),\(nserror.userInfo)")
          }
      }

这在 PersistenceManager 类中。

现在是有趣的部分:您必须创建 CRUD 函数。这些都将在您的 PersistenceManager 类中。我将向您展示一个关于创建和编辑实体的小演示。

假设您有一个名为“Item”的实体,它具有属性 name 和 price。
要保存每个项目,您将拥有如下功能:

func creaateNewItem(name: String,price: Int) -> Item {
        let entity = NSEntityDescription.entity(forEntityName: Item,in: context)
        let newItem = Item(entity: entity!,insertInto: context)
        
        newItem.name = name
        newItem.price = price
        
        self.saveContext()
        return newItem
    }

要编辑项目,您必须获取它,然后为其分配新值:

func editItem(currentItem: Item,newName: String,newPrice: Int) {
    
    let currentName: String = currentItem.name! //Current name
    
    //Looking for the item to edit
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Item")
    request.predicate = NSPredicate(format: "name = %@",currentName)
    request.returnsObjectsAsFaults = false
    
    do { //Editing the item
        let editedItem = (try context.fetch(request))[0] as! Item
        
        editedItem.name = newName
        editedItem.price = newPrice
       
        self.saveContext()
       
    } catch let error {
        print("Error \n \((error))")
    }
 
}

正如你在这里看到的,我传递了一些参数,允许你自定义你的项目。显然,如果您需要分配默认值,您可以删除这些参数。

现在,在您的视图控制器中,您将创建一个 Item 数组对象:

my item : [Item]? 

里面会装满你的物品。
要通过按条形按钮来编辑您保存的项目,您现在只需执行以下操作:

@objc func editMyItem(){
let newName = "Edited Item"
let newPrice = 15

PersistenceManager().editItem(currentItem: item[indexOfYourChoice],newName: newName,newPrice: newPrice)
}

您的项目将被编辑!
请注意,例如,如果您希望文本来自文本字段,则 newPrice 常量将等于该文本字段的文本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res