繁体   English   中英

Swift中的核心数据检索问题

[英]Core Data Retrieval Issue In Swift

我在检索核心数据时遇到问题(代码如下所示)。 我创建了一个新的XCode项目以及具有三个属性usernamepasswordtestnumbers的数据模型。 使用下面的代码,我将值存储在其中,并将结果输出到日志(右下角是输出,从注释掉的代码println(results)行)。 所以很显然,我假设它正确地存储了所有内容。

现在,我注释掉了该部分,现在想检索存储在usernamepasswordtestnumbers下的值。 在代码中打印result.password似乎没问题,但是在代码中尝试打印result.testnumbersresult.username ,它说“'AnyObject'没有名为'testnumbers / username'的成员”。 我不确定发生了什么,因为我以前的输出显示了这些的正确存储。

我尝试过几次重做这个简单的项目,总是先创建数据模型并确保所有拼写正确,依此类推。同一件事不断发生。

这是代码:

import UIKit
import CoreData

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        var appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        var context:NSManagedObjectContext = appDel.managedObjectContext!     

        var newUser = NSEntityDescription.insertNewObjectForEntityForName("Users",
                      inManagedObjectContext: context) as NSManagedObject   

        newUser.setValue("Mark", forKey: "username")
        newUser.setValue("pass", forKey: "password")
        newUser.setValue("12345", forKey: "testnumbers")
        context.save(nil) 

        var request = NSFetchRequest(entityName: "Users")
        request.returnsObjectsAsFaults = false
        var results = context.executeFetchRequest(request, error: nil)

        if results?.count > 0 {
            for result: AnyObject in results! {
                //println(results) // this printed everything fine
                println(result.password)
                println(result.testnumbers)
                println(result.username)
            }
        }
    }
}

这是第一个println(results)给我的输出:

可选([(实体:Users; id:0xd000000000040000;数据:{密码=通过;测试编号= 12345;用户名=标记;}),(实体:Users; id:0xd000000000080000;数据:{密码=通过; testnumbers = 12345;用户名=标记;}),(实体:用户; id:0xd0000000000c0000;数据:{密码=通过;测试号= 12345;用户名=标记;}]]))

实际的XCode屏幕截图:

实际的XCode屏幕截图

您的问题是context.executeFetchRequest返回一个AnyObject?数组AnyObject? 当您遍历对象时是AnyObject? ,正如Xcode所说,它没有属性testnumberusernamepassword

为了解决这个问题并能够使用点符号访问属性,您需要为实体创建子类:

1.选择数据模型(.xcdatamodel文件),然后至少选择一个实体。 然后转到“编辑器->创建NSManagedObject子类...”,如图所示。

在此处输入图片说明

Xcode将带您创建子类。 (只需单击下一步,然后选择您要为其创建子类的所有实体-可能是所有实体)

2.现在,您将拥有用于托管对象的.m和.h文件。 在.h文件中,您应该看到每个属性和关系的属性。 您可以使用这些属性来访问存储在CoreData中的值。

注意- '创建ManagedObject子类; 创建Objective-C文件,因此创建.h和.m。 由于您使用的是Swift,因此您需要在桥接标头中包含.h文件,例如#include "User.h" 如果您还没有桥接头,那么Xcode应该询问您是否要创建一个。 否则,请查看此链接: https : //bohemianpolymorph.wordpress.com/2014/07/11/manually-adding-a-swift-bridging-header/

3.现在,当您使用context.executeFetchRequest并获取对象时,应将其强制转换为所需的任何对象,然后可以访问其属性。 这是一个例子:

let results = context.executeFetchRequest(request, nil)
if let user = results.first? as? User { // User is an NSManagedObject Subclass
    // Now you can access the properties, e.g:
    println(user.username)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM