[英]Core Data Retrieval Issue In Swift
我在檢索核心數據時遇到問題(代碼如下所示)。 我創建了一個新的XCode項目以及具有三個屬性username
, password
和testnumbers
的數據模型。 使用下面的代碼,我將值存儲在其中,並將結果輸出到日志(右下角是輸出,從注釋掉的代碼println(results)
行)。 所以很顯然,我假設它正確地存儲了所有內容。
現在,我注釋掉了該部分,現在想檢索存儲在username
, password
和testnumbers
下的值。 在代碼中打印result.password
似乎沒問題,但是在代碼中嘗試打印result.testnumbers
和result.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屏幕截圖:
您的問題是context.executeFetchRequest
返回一個AnyObject?
數組AnyObject?
。 當您遍歷對象時是AnyObject?
,正如Xcode所說,它沒有屬性testnumber
, username
或password
。
為了解決這個問題並能夠使用點符號訪問屬性,您需要為實體創建子類:
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.