2015-04-06 30 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) 
}