Masalah Pengambilan Data Inti Di Swift

Saya mengalami masalah saat mengambil data inti (kode ditunjukkan di bawah). Saya membuat proyek XCode baru dan model data dengan tiga atribut username, password dan testnumbers. Dengan menggunakan kode di bawah ini saya menyimpan nilai di dalamnya, dan mengeluarkan hasilnya ke log (kanan bawah adalah keluaran itu, dari baris kode println(results) yang dikomentari). Jadi jelas itu telah menyimpan semuanya dengan benar, saya kira.

Sekarang saya mengomentari bagian itu dan sekarang ingin mengambil nilai yang disimpan di bawah username, password dan testnumbers. Mencetak result.password tampaknya baik-baik saja dengan kodenya, tetapi dalam kode ketika mencoba mencetak result.testnumbers dan result.username, dikatakan "'AnyObject' tidak memiliki anggota bernama 'testnumbers/username'". Saya tidak yakin apa yang terjadi, karena keluaran saya sebelumnya menunjukkan penyimpanan yang benar.

Saya telah mencoba mengulangi proyek sederhana ini beberapa kali, selalu membuat model data terlebih dahulu dan memastikan semuanya dieja dengan benar, dll. Hal yang sama terus terjadi.

Ini kodenya:

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)
            }
        }
    }
}

Inilah keluaran dari apa yang diberikan println(results) pertama kepada saya:

Opsional([ (entitas: Pengguna; id: 0xd000000000040000 ; data: { kata sandi = lulus; nomor tes = 12345; nama pengguna = Tandai; }), (entitas: Pengguna; id: 0xd000000000080000 ; data: { kata sandi = lulus; nomor tes = 12345; nama pengguna = Tandai; }), (entitas: Pengguna; id: 0xd0000000000c0000 ; data: { kata sandi = lulus; nomor tes = 12345; nama pengguna = Tandai; })])

Tangkapan layar XCode sebenarnya:

Tangkapan layar XCode sebenarnya


person CodeMark22    schedule 06.04.2015    source sumber


Jawaban (1)


Masalah Anda adalah context.executeFetchRequest mengembalikan array AnyObject?. Saat Anda mengulang objeknya adalah AnyObject?, yang seperti dikatakan Xcode, tidak memiliki properti testnumber, username atau password.

Untuk mengatasi ini dan dapat mengakses properti dengan notasi titik, Anda perlu membuat subkelas untuk entitas Anda:

1. Pilih model data Anda (file .xcdatamodel) dan pilih setidaknya satu entitas Anda. Lalu pergi ke 'Editor -> Buat Subkelas NSManagedObject...' seperti yang ditunjukkan pada gambar.

masukkan deskripsi gambar di sini

Xcode akan membawa Anda dalam pembuatan subkelas. (Cukup klik berikutnya dan pilih semua Entitas yang ingin Anda buatkan subkelasnya - mungkin semuanya)

2. Sekarang Anda akan memiliki file .m dan .h untuk objek yang dikelola. Dalam file .h Anda akan melihat properti untuk setiap Atribut dan Hubungan. Anda dapat menggunakan properti ini untuk mengakses nilai yang disimpan di CoreData.

Catatan - 'Buat Subkelas ManagedObject; membuat File Objective-C, maka .h dan .m. Karena Anda menggunakan Swift, Anda perlu memasukkan file .h di header penghubung Anda, mis. #include "User.h". Jika Anda belum memiliki header penghubung, Xcode akan menanyakan apakah Anda ingin membuatnya. Jika tidak, lihat tautan ini: https://bohemianpolymorph.wordpress.com/2014/07/11/manually-adding-a-swift-bridging-header/

3. Sekarang, saat Anda menggunakan context.executeFetchRequest dan mendapatkan objek, Anda harus melemparkannya ke objek apa pun yang Anda harapkan dan kemudian Anda dapat mengakses propertinya. Berikut ini contohnya:

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)
}
person ABakerSmith    schedule 06.04.2015