尝试使用 coredata 保存待办事项列表不保存

     2023-03-04     151

关键词:

【中文标题】尝试使用 coredata 保存待办事项列表不保存【英文标题】:Attempting to save todo list using coredata doesnt save 【发布时间】:2019-06-18 19:32:22 【问题描述】:

我已经设置了一个 tableview 控制器,并将它用于带有 coredata 的重量跟踪列表,以保存所有的条目。虽然在应用程序打开时添加条目并显示它们,但在下一次应用程序加载时它不会显示这些条目。我很感谢您的帮助,因为我对 swift 编码相对较新。

data model screenshot

import UIKit
import CoreData

class TodoViewController: UITableViewController 

    var items = [Items]()

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    var selectedCategory: Items?
        didSet
            loadItems()
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
    

    //MARK: Table View Datasource Methods
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return items.count
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Item", for: indexPath)
        let item = items[indexPath.row]
        cell.textLabel?.text = item.name
        cell.accessoryType = item.completed ? .checkmark : .none
        return cell
    

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)
        items[indexPath.row].completed = !items[indexPath.row].completed
        saveItems()
    

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 
        return true
    

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        if (editingStyle == .delete)
            let item = items[indexPath.row]
            items.remove(at: indexPath.row)
            context.delete(item)

            do
                try context.save()
            catch
                print("Error deleting item with \(error)")
            
            tableView.deleteRows(at: [indexPath], with: .automatic)
        
    

    @IBAction func addButtonPressed(_ sender: UIBarButtonItem) 
        var textField = UITextField()
        let alert = UIAlertController(title: "Add New Weight", message: "", preferredStyle: .alert)
        let action = UIAlertAction(title: "Save", style: .default)  (action) in

            let newItem = Items(context: self.context)
            newItem.name = textField.text!
            self.items.append(newItem)
            self.saveItems()
        
        alert.addAction(action)
        alert.addTextField  (field) in
            textField = field
            textField.placeholder = "Add Weight"
        
        present(alert, animated: true, completion: nil)

    func saveItems()
        do
            try context.save()
        catch
            print("Error Saving item with \(error)")
        
        self.tableView.reloadData()
    

    func loadItems()
        let request: NSFetchRequest<Items> = Items.fetchRequest()

        do
            items = try context.fetch(request)
        catch
            print("Error fetching data from context \(error)")
        
        tableView.reloadData()
    


【问题讨论】:

【参考方案1】:

将你的 items 数组更新为 NSManagedObject

var items: [NSManagedObject] = []

使用此方法进行保存并从保存操作中调用它:

func save(name: String, completed: Bool) 
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else 
  return


let managedContext = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Items", in: managedContext)!
let item = NSManagedObject(entity: entity, insertInto: managedContext)
item.setValue(name, forKeyPath: "name")
item.setValue(completed, forKeyPath: "completed")

do 
  try managedContext.save()
  items.append(item)
 catch let error as NSError 
  print("Could not save. \(error), \(error.userInfo)")


对于加载项目,请使用以下方法:

func loadItems() 
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else 
  return


let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Items")

do 
  items = try managedContext.fetch(fetchRequest)
 catch let error as NSError 
  print("Could not fetch. \(error), \(error.userInfo)")


然后将 cellForRowAtIndexPath 方法更新为:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Item", for: indexPath)
    let item = items[indexPath.row]
    cell.textLabel?.text = item.value(forKeyPath: "name") as? String
    cell.accessoryType = item.value(forKeyPath: "completed") as? Bool ? .checkmark : .none
    return cell

使用 KVC 访问数组项中的任何属性,如下所示:

item.value(forKeyPath: "name") as? String

【讨论】:

CoreData 不将数据保存到数据库

】CoreData不将数据保存到数据库【英文标题】:CoreDatadoesn\'tsavedatatodatabase【发布时间】:2015-01-0720:49:35【问题描述】:我正在按照Youtube上的教程使用Swift编写iOS应用程序。该应用程序将具有与待办事项列表应用程序相同的功能,... 查看详情

使用 jQuery 将新列表项添加到待办事项列表?

...然后还将一个COMPLETED按钮附加到每个项目。以下代码是我尝试过的。它仅显示数组中的原始4项。我被困在这里,任何帮助将不胜感激。 查看详情

无法从 Listview 中删除项目(待办事项列表),长按没有任何反应

...gpress【发布时间】:2021-12-3020:44:04【问题描述】:我正在尝试使用sqlite创建一个待办事项列表,当我长时间按下一个项目时,它将从列表(以及数据库)中删除。但我做不到,不明白如何删除(我是新手)。我还可以在s 查看详情

如何使用 JsPdf 下载完整的待办事项 (vue.js) 列表?

...:2022-01-2121:25:54【问题描述】:我是这个领域的初学者。尝试使用vue.js做一个小项目。我想为用户提供一个选项来下载他们的Vue.js待办事项列表。我已经导入了jspdf库和Html2canvas。ThisiswhatIgotasanou 查看详情

无法在初始渲染中显示待办事项列表

...nreact【发布时间】:2021-08-0708:32:06【问题描述】:我正在尝试使用react、redux、redux-form和firestore数据库构建todoList,我还可以使用操作或操作创建器将待办事项插入数据库中,我可以获取数据库中的数据存储但是当用户第一次访... 查看详情

如何在应用程序中保存数据?

...的待办事项程序。我想保存用户创建的任务列表。现在我尝试将它们保存为文本文件,但我不希望这样。我想要它,以便我可以保存用户在程序中创建的任务而不是外部文本文件,然后检索这些保存的文件并将它们显示在文本文... 查看详情

在AngularJS中编写待办事项列表时无法理解删除过程

...ularJS【发布时间】:2017-02-1718:45:38【问题描述】:我正在尝试使用以下代码在Angularjs中编写待办事项应用程序。functionwrite_controller($scope)$scope.todos=[text: 查看详情

使用 localStorage 的待办事项列表

】使用localStorage的待办事项列表【英文标题】:To-DoListwithlocalStorage【发布时间】:2019-06-0213:23:53【问题描述】:我做了一个简单的待办事项清单。但我想让一个列表元素有一个text-decoration=line-through当我单击按钮时,列表项将设... 查看详情

在 Swift 3 中保存表格视图的数据

...Swift3【发布时间】:2017-01-2000:48:59【问题描述】:我正在尝试使用Swift3和Xcode8构建一个简单的待办事项列表应用程序。它包括一个文本输入框、一个提交按钮和一个表格,其中每个单元格都包含一个标题和一个显示日期。到目前... 查看详情

在待办事项列表中隐藏/显示不同的内容并使用 JavaScript 一次显示一个内容 [关闭]

】在待办事项列表中隐藏/显示不同的内容并使用JavaScript一次显示一个内容[关闭]【英文标题】:hide/showdifferentcontentintodolistandshowonecontentatatimeusingJavaScript[closed]【发布时间】:2021-11-2016:23:59【问题描述】:我正在使用laravel框架构... 查看详情

如何让 splice() 方法在我的待办事项列表中工作?

...删除按钮和我的删除功能之间的“连接”似乎有效。我也尝试了slice方法并且有效,但由于某种原因,sp 查看详情

NSDocument 用于关系数据/待办事项列表?

...也与其他实体有关系。我为此创建了一个iOS应用程序,它使用核心数据数据模型.... 查看详情

用户特定内容

...和整个后端领域的新手,我需要一些启发。基本上我正在尝试制作一个用户可以注册和登录的应用程序。当用户登录时,他可以创建简单的东西,例如待办事项列表。待办事项列表随后保存在数据库中,并且只能由创建它的用户... 查看详情

通过recyclerview按日期排序显示sqlite中保存的数据

...问题描述】:我的应用是一个待办事项列表应用。我正在尝试根据保存到sqlite数据库和数组列表中的日期对recyclerview中的数据进行排序。我见过有人说我可以使用比较器来做到 查看详情

不保存上下文的 CoreData 保存

】不保存上下文的CoreData保存【英文标题】:CoreDataSavingwithoutSavingContext【发布时间】:2020-11-0502:34:44【问题描述】:我在使用CoreData时遇到了一些问题。在使用实体之前,我将它们从Coredata中删除,并打印出来以确保它们确实被... 查看详情

如何在内部保存我的数据?

...nally?【发布时间】:2013-09-1222:11:11【问题描述】:我正在尝试创建一个“待办事项列表”,并且我已经完成了所有工作,除了保存数据。我是新手,想知道是否有人可以告诉我如何在内部完成保存数据。这是我的代码:Main_ToDoLis... 查看详情

如何在 Swift 中保存复选标记?

】如何在Swift中保存复选标记?【英文标题】:HowtosavecheckmarkinSwift?【发布时间】:2019-03-0213:03:05【问题描述】:我正在为自己制作一个待办事项应用程序,并且我想制作一个功能来将待办事项标记为已完成。它添加了一个复选... 查看详情

如何从 laravel 的列表中删除待办事项列表项?

...ravel?【发布时间】:2019-10-3105:11:56【问题描述】:我正在尝试删除laravel中的一个项目。这是我的代码:这是我的路线:Route::resource(\'\',\'TodosController\');这是我的控制器:namespaceApp\\Http\\Cont 查看详情