簡體   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