草庐IT

swift - 获取单个 Transformable 属性的请求 (Swift)

coder 2023-09-07 原文

我有一个名为 NoteEntity 的核心数据实体(类型)。它有一个名为 noteDocument 的托管变量,它属于自定义类型 NoteDocument(我的 NSDocument 子类)。我更改了它自动生成的 NoteEntity+Core Data Properties 类,所以它显示为

import Foundation
import CoreData

extension NoteEntity {

    @NSManaged var noteDocument: NoteDocument? // changed
    @NSManaged var belongsTo: NSSet?

}

所以 noteDocument 是 NoteDocument 类型而不是 NSObject。 NoteDocument 类确实实现了 NSCoding,如下所示:

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")
}

我希望能够在托管上下文中找到具有给定 noteDocument 值的 noteEntity 实体。所以我运行这段代码(向它传递一个参数 theNote,该参数对应于我知道托管上下文中存在的 noteDocument):

    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)")
    }

但它没有返回任何条目。如果我注释掉谓词,我将获得数据库中的所有 NoteEntity 值,但是其中的谓词我什么也得不到。显然我在谓词中尝试进行的搜索有问题。我认为这是因为该值是一个 Transformable,但我不确定从那里去哪里。我知道您不能对 Transformable 数组的成员运行提取请求,但是否不可能对单个 Transformable 属性运行提取请求?如果不是,还有哪些替代方案?

编辑:NoteDocument 类包含的内容比 NSCoding 多得多。正如我所说,它是一个 NSDocument 子类。 NSCoding 使用 URL 作为它的键,因为它是 NoteDocument 类的“主键”——它是初始化类的东西。这是类(class)的其余部分,不包括上面的 NSCoding:

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)
}


}

最佳答案

在代码中,您表明您正在编码的唯一内容是 URL。在这种情况下,在实体中使用纯字符串来存储 URL 并为文档添加 transient 属性(或创建包装类以组合实体和文档)更有意义并提供更多实用程序。通过这种方式,您可以在谓词中使用 URL,并且很容易从文档构建谓词。将文档存储为可转换文件并不能以任何方式帮助您。

关于swift - 获取单个 Transformable 属性的请求 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38556553/

有关swift - 获取单个 Transformable 属性的请求 (Swift)的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  7. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  8. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  9. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐