我遵循Apple开发人员关于实现离线数据的教程。但我想使用CoreData。我正在努力打开CoreData Context并将其放入数组中,如果这是正确的话。
我正在使用Swift 3和最新的xCode。
这是我的实体,我不需要为细胞提取所有值,只需要展示有趣的东西:
所以这是我的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的研究,但仍然没有完全理解它。
答案 0 :(得分:2)
您的book
班级被宣布为
public class book: NSObject, NSCoding
它不是NSManagedObject
的子类,因此您无法将其与Core Data一起使用。使用Core Data存储的所有对象必须是NSManagedObject
或子类的实例。
稍后你会这样做:
let book = books[indexPath.row] as! NSManagedObject
由于books
是book
的数组,而不是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中(如果你手动生成文件)