【问题标题】:fetch core data string and place in a label (Swift4)获取核心数据字符串并放置在标签中(Swift4)
【发布时间】:2018-08-06 02:48:21
【问题描述】:

我正在尝试调用 2 个不同的核心数据字符串并将它们分别放在单独的标签上。现在我收到错误无法使用类型为“([NSManagedObject])”的参数列表调用类型“init(_:)”的初始化程序。此错误来自 j1.text = String(itemsName)。我添加了两个视图控制器来保存和显示。

        import UIKit
import CoreData

class ViewController: UIViewController {

@IBOutlet var j1 : UITextField!
@IBOutlet var j2 : UITextField!


@IBAction func save(){

    let appD = UIApplication.shared.delegate as! AppDelegate

    let context = appD.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "Team", in : context)!

    let theTitle = NSManagedObject(entity: entity, insertInto: context)
    theTitle.setValue(j1.text, forKey: "score")
    theTitle.setValue(j2.text, forKey: "alba")


    do {
        try context.save()
    }
    catch {
        print("Tom Corley")

    }
}}
class twoVC: UIViewController {

    @IBOutlet var j1 : UILabel!
    @IBOutlet var j2 : UILabel!

        var itemsName : [NSManagedObject] = []
      var itemsName2 : [NSManagedObject] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let appD = UIApplication.shared.delegate as! AppDelegate

        let context = appD.persistentContainer.viewContext

        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Team")
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "score", ascending: true)]


        let fetchRequest2 = NSFetchRequest<NSManagedObject>(entityName: "Team")
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "alba", ascending: true)]





        do {
            itemsName = try context.fetch(fetchRequest)
            itemsName2 = try context.fetch(fetchRequest2)
            if let score = itemsName[0].value(forKey: "score") {
                j1.text = (score as! String)
            }
            if let alba = itemsName2[0].value(forKey: "alba") {
                j2.text = (alba as? String)
            }


        }catch {
            print("Ashley Tisdale")
        }
    }}

【问题讨论】:

  • 您收到此错误是因为 itemsNameitemsName2 是数组,并且没有可用的 String init 可以接受数组作为参数,您能否详细说明您想要什么可以帮助我们了解你想要什么
  • @NiravD 我正在尝试从核心数据中调用 2 个不同的数组并将它们显示在单独的标签上。核心数据字符串是 alba 和 score。
  • 你还没有得到,我的意思是如何在标签中显示数组,而且数组的类型是NSManagedObject,你能显示你的团队实体
  • @NiravD 我用我的所有代码更新了我的问题。那应该回答你的问题。
  • 现在您正在从第一个对象设置值,但是如果您的数组为空,如果您想显示所有数据,您的应用程序可能会崩溃,您需要使用 tableView 搜索它,您将知道如何实施它

标签: core-data label swift4 fetch nsfetchrequest


【解决方案1】:

遍历 fetch 的结果并附加到一个字符串,然后将其用作标签的值,这将位于您今天进行 fetch 的 do{...} 内。请注意,我在这里只使用了一个 fetch 请求。

itemsName = try context.fetch(fetchRequest)
var mergedScore: String = ""
var mergedAlba: String = ""
for item in itemsName {
    if let score = item.value(forKey: "score") as? String {
         mergedScore.append(score)
         mergedScore.append(" ") //separator
    }
    if let alba = item.value(forKey: "alba") as? String {
         mergedScore.append(alba)
         mergedScore.append(" ") //separator
    }
}
j1.text = mergedScore
j2.text = mergedAlba

【讨论】:

  • 我把这个放在什么函数里?
  • 你问题中的那个,用它替换现有的行
  • 它开始工作,但它只显示第一个索引。我想显示数组中的所有内容。
  • @SamBurns 我故意只阅读答案中的第一个值,因为我不知道你想要什么。我是否正确理解您要将所有获取的值添加到标签?
  • 我想获取标签的所有值。
【解决方案2】:

试试这个它为我工作的 Swift 4 我认为您需要将值存储为用作 sortDescriptor 的 int。

func FetchManagedObjectFromDatabaseForStoreData(Entity :NSEntityDescription) -> 
[NSManagedObject]
{
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>()

    // Add Sort Descriptor
    let sortDescriptor = NSSortDescriptor(key: "order", ascending: true)
    let sortDescriptor1 = NSSortDescriptor(key: "is_favourite", ascending: false)

    fetchRequest.sortDescriptors = [sortDescriptor,sortDescriptor1]

    // Create Entity Description
    fetchRequest.entity = Entity

    let result : [NSManagedObject] = []

    // Execute Fetch Request
    do{
        let result = try appDelegate.managedObjectContext.fetch(fetchRequest) as! [NSManagedObject]

    if  result.count > 0
    {
        return result

    }
    else
    {
        // return result

    }
}
catch{
    let fetchError = error as NSError
    print(fetchError)
}

return result
}

获取数据

// Create Entity Description
let entityDescription = NSEntityDescription.entity(forEntityName: "Your Entity Name Here", in: appDel.managedObjectContext)

let DataObject = FetchManagedObjectFromDatabaseForStoreData(Entity: entityDescription!)

//Convert  Array of NSManagedObject into array of [String:AnyObject]     
for item in DataObject{

    let keys = Array(item.entity.attributesByName.keys)

    // Here is your result
    print((item.dictionaryWithValues(forKeys: keys) as NSDictionary).value(forKey: "id") as Any) // And so On Whatewer you Fetch

}

【讨论】:

  • 我对在 result.count >0 中放入什么感到困惑。我试过 itemsName = try context.fetch(fetchRequest) itemsName2 = try context.fetch(fetchRequest2) j1.text = String(itemsName) j2.text = String(itemsName2) 但我得到了同样的错误。
  • @SamBurns 这里 itemsName 和 itemsName2 不是 String 类型,它是 NSManagedObject 所以你需要像我在更新的答案中所做的那样转换它。试试看:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2018-08-11
  • 1970-01-01
  • 2017-08-11
  • 2018-09-25
相关资源
最近更新 更多