Ich habe eine Core Data-Entität (Typ) namens NoteEntity. Es hat eine verwaltete Variable namens noteDocument, die vom benutzerdefinierten Typ NoteDocument (meine Unterklasse von NSDocument) ist. Ich änderte seine automatisch generierte NoteEntity + Core Data Properties Klasse so liest esAbrufanforderung für einzelnes transformierbares Attribut (Swift)
import Foundation
import CoreData
extension NoteEntity {
@NSManaged var noteDocument: NoteDocument? // changed
@NSManaged var belongsTo: NSSet?
}
so dass noteDocument vom Typ NoteDocument ist anstelle von NSObject. Die NoteDocument Klasse nicht implementiert NSCoding wie folgt:
required convenience init(coder theDecoder: NSCoder)
{
let retrievedURL = theDecoder.decodeObjectForKey("URLKey") as! NSURL
self.init(receivedURL: retrievedURL)
}
func encodeWithCoder(theCoder: NSCoder)
{
theCoder.encodeObject(fileURL, forKey: "URLKey")
}
Was ich will, ist zu tun, um die Lage sein, die noteEntity Einheiten in dem verwalteten Zusammenhang mit einem bestimmten noteDocument Wert zu finden. So betreibe ich diesen Code (einen Parameter theNote vorbei, die zu einem noteDocument entspricht, die ich kenne in dem verwalteten Kontext vorhanden ist):
var request = NSFetchRequest(entityName: "NoteEntity")
let notePredicate = NSPredicate(format: "noteDocument == %@", theNote)
request.predicate = notePredicate
print("Text in the NoteEntity with the NoteDocument for "+theNote.filename+":")
do
{
let notesGathered = try context.executeFetchRequest(request) as? [NoteEntity]
for n in notesGathered!
{
print (n.noteDocument!.filename)
print (n.noteDocument!.noteText)
}
}
catch let error as NSError
{
print("Could not run fetch request. \(error), \(error.userInfo)")
}
aber es gibt keine Einträge. Wenn ich das Prädikat auskommentiere, bekomme ich alle NoteEntity-Werte in der Datenbank, aber mit dem Prädikat da drin bekomme ich nichts. Offensichtlich stimmt etwas nicht mit der Suche, die ich im Prädikat machen will. I denke, es ist, weil der Wert ist ein Transformable, aber ich bin mir nicht sicher, wo ich von dort gehen soll. Ich weiß, dass Sie keine Abrufanforderungen für die Mitglieder von Transformable-Arrays ausführen können, aber ist es nicht möglich, Abrufanforderungen für einzelne transformierbare Attribute auszuführen? Wenn nicht, welche Alternativen gibt es?
EDIT: Die NoteDocument-Klasse enthält viel mehr als das NSCoding. Wie gesagt, es ist eine NSDocument-Unterklasse. Das NSCoding verwendet eine URL als Schlüssel, da dies der "Primärschlüssel" für die NoteDocument-Klasse ist - es initialisiert die Klasse. Hier ist der Rest der Klasse, ohne die NSCoding oben:
import Cocoa
class NoteDocument: NSDocument, NSCoding
{
var filename: String
var noteText: String
var attributes: NSDictionary?
var dateCreated: NSDate?
var dateString: String?
init (receivedURL: NSURL)
{
self.filename = ""
self.noteText = ""
super.init()
self.fileType = "net.daringfireball.markdown"
self.fileURL = receivedURL
// Try to get attributes, most importantly date-created.
let fileManager = NSFileManager.defaultManager()
do
{
attributes = try fileManager.attributesOfItemAtPath(fileURL!.path!)
}
catch let error as NSError
{
print("The error was: "+String(error))
}
if let dateCreated = attributes?.fileCreationDate()
{
// print("dateCreated is "+String(dateCreated!))
// Format the date-created to an appropriate string.
dateString = String(dateCreated)
}
else
{
print("Did not find the attributes for "+filename)
}
if let name = self.fileURL?.lastPathComponent
{
filename = name
}
else
{
filename = "Unnamed File"
}
noteText = ""
do
{
noteText = try NSString(contentsOfURL: self.fileURL!, encoding: NSUTF8StringEncoding) as String
}
catch let error as NSError
{
print("Error trying to get note file:"+String(error))
}
}
// MARK: - Document functions
override class func autosavesInPlace() -> Bool
{
// print ("autosavesInPlace ran.")
return true
}
override func dataOfType(typeName: String) throws -> NSData
{
var outError: NSError! = NSError(domain: "Migrator", code: 0, userInfo: nil)
// Post: Document is saved to a file specified by the user.
outError = NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
if let value = self.noteText.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) {
// Convert noteText to an NSData object and return that.
return value
}
print("dataOfType ran.")
throw outError
}
override func readFromData(data: NSData, ofType typeName: String) throws
{
// Currently unused; came free with NSDocument.
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}
}
Möchten Sie Dokumente oder URLs vergleichen? – Willeke
Ich versuche, Dokumentobjekte (der Klasse NoteDocument, welche Unterklassen NSDocument) zu vergleichen. Soll ich das NSCoding entsprechend ändern? –
Verwenden Sie den SQLite-Speicher? – Willeke