Core data 获取核心数据字符串并放入标签(Swift4)
我试图调用2个不同的核心数据字符串,并将它们分别放在不同的标签上。现在我得到一个错误,即无法使用类型为“([NSManagedObject])”的参数列表调用类型为“init(:)”的初始值设定项。此错误来自j1.text=String(itemsName)。我添加了用于保存和显示的两个视图控制器Core data 获取核心数据字符串并放入标签(Swift4),core-data,label,swift4,fetch,nsfetchrequest,Core Data,Label,Swift4,Fetch,Nsfetchrequest,我试图调用2个不同的核心数据字符串,并将它们分别放在不同的标签上。现在我得到一个错误,即无法使用类型为“([NSManagedObject])”的参数列表调用类型为“init(:)”的初始值设定项。此错误来自j1.text=String(itemsName)。我添加了用于保存和显示的两个视图控制器 import UIKit import CoreData class ViewController: UIViewController { @IBOutlet var j1 : U
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")
}
}}
导入UIKit
导入CoreData
类ViewController:UIViewController{
@IBOutlet变量j1:UITextField!
@IBOutlet变量j2:UITextField!
@IBAction func save(){
将appD=UIApplication.shared.delegate设为!AppDelegate
让context=appD.persistentContainer.viewContext
让entity=NSEntityDescription.entity(在:context中,名为“Team”)!
让标题=NSManagedObject(实体:实体,插入到:上下文)
标题设置值(j1.text,forKey:“分数”)
title.setValue(j2.text,forKey:“alba”)
做{
尝试context.save()
}
抓住{
印刷品(“汤姆·科利”)
}
}}
类twoVC:UIViewController{
@IBVAR j1:UILabel!
@IBVAR j2:UILabel!
var itemsName:[NSManagedObject]=[]
var itemsName2:[NSManagedObject]=[]
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后,通常从nib执行任何其他设置。
将appD=UIApplication.shared.delegate设为!AppDelegate
让context=appD.persistentContainer.viewContext
let fetchRequest=NSFetchRequest(entityName:“团队”)
fetchRequest.sortDescriptors=[NSSortDescriptor(键:“分数”,升序:true)]
让fetchRequest2=NSFetchRequest(entityName:“团队”)
fetchRequest.sortDescriptors=[NSSortDescriptor(键:“alba”,升序:true)]
做{
itemsName=try context.fetch(fetchRequest)
itemsName2=try context.fetch(fetchRequest2)
如果let score=itemsName[0]。值(forKey:“score”){
j1.text=(分数为!字符串)
}
如果让alba=itemsName2[0]。值(forKey:“alba”){
j2.text=(alba为?字符串)
}
}抓住{
印刷品(“Ashley Tisdale”)
}
}}
试试这个,它对我有用Swift 4我想你需要将值存储为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
}
循环获取的结果,并将其附加到一个字符串中,该字符串随后用作标签的值,这将进入您今天进行获取的
do{…}
中。请注意,我在这里只使用一个获取请求
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
我不知道该在结果中输入什么。计数>0。我尝试了itemsName=try context.fetch(fetchRequest)itemsName2=try context.fetch(fetchRequest2)j1.text=String(itemsName)j2.text=String(itemsName2)但是我得到了同样的错误。@SamBurns Here itemsName和itemsName2不是字符串类型,它是NSManagedObject,所以您需要像我在更新的答案中所做的那样转换它。试试看:)出现此错误是因为
itemsName
和itemsName2
是数组,并且没有可用的字符串init接受数组作为参数,你能提供你想要的更多细节,帮助我们理解你想要的吗want@NiravD我试图从核心数据调用两个不同的数组,并将它们显示在不同的标签上。核心数据字符串是alba和score。您仍然没有得到,我想说的是,如何在标签中显示数组,而且数组的类型是NSManagedObject
,您能展示您的团队吗entity@NiravD我用我所有的代码更新了我的问题。这应该可以回答你的问题。现在你正在设置第一个对象的值,但是如果你的数组为空,如果你想显示所有数据,你的应用程序可能会崩溃。你需要的是使用tableView搜索它,你会知道如何实现它。我应该把它放在什么功能中?你问题中的那个,将现有行替换为ITIT开始工作,但仅显示第一个索引。我想显示数组中的所有内容。@SamBurns我故意只读取答案中的第一个值,因为我不知道您到底想要什么。我是否正确理解要将所有提取的值添加到标签?我要将所有值提取到标签。
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