【发布时间】:2015-11-29 05:28:21
【问题描述】:
我正在开发一个小应用程序来学习 CoreData。这些是 CoreData 的实体。
extension Person {
@NSManaged var firstName: String?
@NSManaged var lastName: String?
@NSManaged var age: NSNumber?
@NSManaged var personToBook: NSSet?
}
extension Books {
@NSManaged var bookName: String?
@NSManaged var bookISBN: String?
@NSManaged var bookToPerson: Person?
}
该应用程序是人员列表。属于列表中的每个人都可以多出一本书。
我很容易对人进行分类。
let fetchRequest = NSFetchRequest(entityName: "Person")
let fetchSort = NSSortDescriptor(key: "lastName", ascending: true)
fetchRequest.sortDescriptors = [fetchSort]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
}
catch let error as NSError {
print("Unable to perform fetch: \(error.localizedDescription)")
}
我很难解决的是如何按字母顺序对书籍进行排序,就像我是人一样。当我点击人员列表中的一个人时,我会转到包含书籍列表的UITableView。在 prepareForSegue 中,我传入所选人员、上下文以及我在人员列表中使用的 NSFetchedResultsController。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let vc = segue.destinationViewController as! BooksController
vc.person = fetchedResultsController.objectAtIndexPath(selectedIndex) as! Person
vc.context = self.context
vc.fetchedResultsController = self.fetchedResultsController
}
UITableView 由 person.personToBook 填充。
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return (person.personToBook?.count)!
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("BooksCell", forIndexPath: indexPath)
let book = person.personToBook?.allObjects[indexPath.row] as! Books
cell.textLabel?.text = book.bookName!
return cell
}
书籍以这种方式添加到正确的人:
let entity = NSEntityDescription.entityForName("Books", inManagedObjectContext: self.context)
let bookInstance = Books(entity:entity!, insertIntoManagedObjectContext: self.context)
bookInstance.bookName = alertController.textFields?[0].text
bookInstance.bookISBN = alertController.textFields?[1].text
self.person.mutableSetValueForKey("personToBook").addObject(bookInstance)
do {
try self.context.save()
self.tableView.reloadData()
}
catch let error as NSError {
print("Error saving a book \(error.localizedDescription)")
}
personToBook 是一个 NSSet,它没有排序。我考虑过使用另一个 NSFetchedResultsController to pull the list of books out, but there is nothing unique that is identifying the books as belonging to a specific user. For instance, I could have two people with the same name of John Doe. Because of this, I'd have no way to set theNSPredicate`,这样它只会为 John Do 中的一个拉入书籍。
虽然我有一个是我可以向 Person 实体添加某种 UniqueID,就像我在 SQL 中所做的那样。这将确保我只能获得正确人的 Books 记录。有人告诉我,我不应该在 CoreData 中这样做。这使我相信必须有某种方法可以对其中的多对多部分中的项目进行排序。
我可以通过哪些方式对我的图书数据进行排序?
【问题讨论】:
-
您是否尝试过在您的
UITableView上实现NSSortDescriptor? (设置fetchedResultsController时最好) -
我在 Person 实体上设置 NSSortDescriptor,因为这就是我正在做的提取。我不是在取书。当我仅通过对 Person 的获取而获取 Books 时,如何在 Books 上设置 NSSortDescriptor?
-
怎么样:再创建一个
sortDescriptor并将其添加到数组let bookNameSort = NSSortDescriptor(key: "book.bookname", ascending: true)->fetchRequest.sortDescriptors = [fetchSort, bookNameSort]