2015-04-06 29 views
1

我在检索核心数据时遇到问题(代码如下所示)。我创建了一个新的XCode项目和具有三个属性username,passwordtestnumbers的数据模型。使用下面的代码我将值存储在它们中,并将结果输出到日志中(右下角是输出,来自注释掉的代码行println(results))。很显然,它已经正确存储了我所想的一切。Swift中的核心数据检索问题

现在我评论说,部分出来,现在要检索下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)给我的输出:

可选([(单位:用户; ID: 0xd000000000040000 ;数据:密码= pass; testnumbers = 12345; username = Mark;}),(entity:Users; id:0xd000000000080000 ; data:{ password = pass; testnumbers = 12345; username = Mark; }),(实体:用户; ID:0xd0000000000c0000 ;数据:{ 密码=通过; testnumbers = 12345; 用户名=标记;})])

实际的XCode截图:

Actual XCode screenshot

回答

1

你的问题是context.executeFetchRequest返回一个数组AnyObject?。在循环播放对象时,如Xcode所说,它不包含testnumber,usernamepassword的属性。

为了解决这个问题,并能够与您需要为您的enties创建子类点标记来访问属性:

1.选择你的数据模型(.xcdatamodel文件),并至少选择你的实体之一。然后转到'Editor - > Create NSManagedObject Subclass ...',如图所示。

enter image description here

的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/

现在,当您使用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) 
}