无法将CoreData实现到TableView中

时间:2017-05-31 11:55:07

标签: ios swift uitableview core-data

我遵循Apple开发人员关于实现离线数据的教程。但我想使用CoreData。我正在努力打开CoreData Context并将其放入数组中,如果这是正确的话。

我正在使用Swift 3和最新的xCode。

这是我的实体,我不需要为细胞提取所有值,只需要展示有趣的东西:

Image

所以这是我的book.swift,一切都是基于。

import Foundation
import CoreData
import UIKit
import os.log

public class book: NSObject, NSCoding {
var title: String
var author: String
var photo: UIImage?
var isbn: String
var publisher: String

static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("books")


struct PropertyKey {
    static let title = "title"
    static let photo = "photo"
    static let author = "author"
    static let isbn = "isbn"
    static let publisher = "publisher"
}

然后,我的BookTableViewController

import UIKit
import os.log
import CoreData

class BookTableViewController: UITableViewController {

//MARK: Properties
var books = [book]()
var i = 0
var managedObjectContext: NSManagedObjectContext

required init(coder aDecoder: NSCoder) {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    self.managedObjectContext = appDelegate.persistentContainer.viewContext
    super.init(coder: aDecoder)!
}

override func viewDidLoad() {
    super.viewDidLoad()
    }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "BookTableViewCell", for: indexPath) as? BookTableViewCell else {
        fatalError("some cell error")
    }
    // need help here, somehow grab the data from CoreData, or do I populate the book array from CoreData?


    let book = books[indexPath.row]

    cell.bookLabel.text = book.title
    cell.authorLabel.text = book.author
    cell.bookImageView.image = book.photo
    cell.publisherLabel.text = book.publisher

    return cell
}

我理解的是我需要以某种方式在cellforrowat中打开一个循环(至少我认为)或者我是否需要以某种方式在superviewdidload中以某种方式填充数组?

我已经完成了大量关于CoreData的研究,但仍然没有完全理解它。

2 个答案:

答案 0 :(得分:2)

您的book班级被宣布为

public class book: NSObject, NSCoding

它不是NSManagedObject的子类,因此您无法将其与Core Data一起使用。使用Core Data存储的所有对象必须是NSManagedObject或子类的实例。

稍后你会这样做:

let book = books[indexPath.row] as! NSManagedObject

由于booksbook的数组,而不是NSManagedObject的子类,因此保证失败。您无法使用NSManagedObject将班级的实例转换为as!。他们是完全不同的类型。

使用最新版本的Xcode,会自动创建NSManagedObject的子类。您的数据模型显示名为Book的实体,这意味着Xcode将自动创建与实体描述匹配的类Book。您应该使用该类而不是您创建的book类。使用该类,您可以从托管对象上下文创建,保存和获取Book的实例。

您似乎对Core Data的一些最基本方面有困难。我强烈建议查看Apple的Core Data Programming Guide。它详细介绍了核心数据,包括示例代码。在您完全掌握基础知识之前,您将难以使用Core Data,而该指南将帮助您实现这一目标。

答案 1 :(得分:0)

你得到的代码都搞砸了,你不需要创建一些继承NSObject的新类书,你可以使用NSManagedObject又名Book又名CoreDataModel实体的所有东西,我不知道还有什么。 每当与collectionView或tableView中的Coredata或任何使用某种dataSource协议的组件进行交互时,你都应该使用NSFetchedResultsController ......无论如何,我觉得本教程对初学者非常有用:

https://cocoacasts.com/implement-the-nsfetchedresultscontrollerdelegate-protocol-with-swift-3/

只需按照教程并删除课本(你不应该创建第一个字母小写的类永远不会......它实际上不符合约定。你可以将所有属性存储到NSManagedObject中(如果你手动生成文件)