如何从 coredata swift 中随机选择一个元素
How to randomly choose an element from coredata swift
import UIKit
import CoreData
class Period1Controller: UIViewController, UITextFieldDelegate {
@IBOutlet weak var enterName: UITextField!
@IBOutlet weak var presentName: UITextView!
@IBOutlet weak var independceStatue: UITextField!
@IBOutlet weak var driverSelection: UITextField!
var entitys = [NSManagedObject]()
var nameList : [String] = []
var period1 = ""
var period1NameList = ""
override func viewDidLoad() {
super.viewDidLoad()
}
func setValues() {
nameList = [enterName.text!]
}
//this button is for saving the element into the core data
@IBAction func setName(sender: UIButton) {
setValues()
for item in nameList{
period1 += (item + " ")
period1NameList += item
}
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let entity = NSEntityDescription.entityForName("Entity", inManagedObjectContext: context)
let otherEntity = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: context)
otherEntity.setValue(period1NameList, forKey: "period1Core")
do {
try context.save()
print("Item Saved")
} catch {
print("Saved Failed")
}
presentName.text = period1
enterName.text = ""
}
// this button is for taking out element from core data and randomly pick a value from the element I took out from core data
@IBAction func start(sender: UIButton) {
setValues()
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let request = NSFetchRequest(entityName: "Entity")
do {
let results = try context.executeFetchRequest(request)
entitys = results as! [NSManagedObject]
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
let otherEntity = entitys.last
let randomIndex = Int(arc4random_uniform(UInt32(otherEntity.count)))
driverSelection.text! = nameList[randomIndex]
}
}
我想做的是从我的核心数据中随机选择一个元素并将其设置为等于 driverSelection 文本字段。
在我的代码中,我将 coredata = 中的元素设置为 otherEntity
。这使 otherEntity
成为 NSmanagedObject
,但由于 otherEntity
是 NSmanagedObject
,我无法使用 .count
方法。有什么方法可以让我从 NSmanagedObject
中随机选择一个元素???
如果您尝试从数据库中当前数量的对象中提取随机索引,那么您应该使用 results.count
而不是 otherEntity.count
,如下所示:
@IBAction func start(sender: UIButton) {
setValues()
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let request = NSFetchRequest(entityName: "Entity")
var results = [AnyObject]()
do {
results = try context.executeFetchRequest(request)
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
let randomIndex = Int(arc4random_uniform(UInt32(results.count)))
driverSelection.text! = nameList[randomIndex]
}
Swift 5
我一直在寻找这个答案,我发现你可以用 fetchOffset 得到一行,用 moc.count
得到数组计数
像这样...
func randomIconAK(_ moc: NSManagedObjectContext) -> Icon? {
//
// RETURNS ONE ITEM AT RANDOM
//
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Icon")
if let fetchRequestCount = try? moc.count(for: fetchRequest) {
fetchRequest.fetchOffset = Int.random(in: 0...fetchRequestCount)
}
fetchRequest.fetchLimit = 1
var fetchResults: [Icon]?
moc.performAndWait {
fetchResults = try? fetchRequest.execute() as? [Icon]
}
if let wrapFetchResults = fetchResults {
if wrapFetchResults.count > 0 {
return wrapFetchResults.first
} else {
return nil
}
} else {
return nil
}
}//randomIconAK
import UIKit
import CoreData
class Period1Controller: UIViewController, UITextFieldDelegate {
@IBOutlet weak var enterName: UITextField!
@IBOutlet weak var presentName: UITextView!
@IBOutlet weak var independceStatue: UITextField!
@IBOutlet weak var driverSelection: UITextField!
var entitys = [NSManagedObject]()
var nameList : [String] = []
var period1 = ""
var period1NameList = ""
override func viewDidLoad() {
super.viewDidLoad()
}
func setValues() {
nameList = [enterName.text!]
}
//this button is for saving the element into the core data
@IBAction func setName(sender: UIButton) {
setValues()
for item in nameList{
period1 += (item + " ")
period1NameList += item
}
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let entity = NSEntityDescription.entityForName("Entity", inManagedObjectContext: context)
let otherEntity = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: context)
otherEntity.setValue(period1NameList, forKey: "period1Core")
do {
try context.save()
print("Item Saved")
} catch {
print("Saved Failed")
}
presentName.text = period1
enterName.text = ""
}
// this button is for taking out element from core data and randomly pick a value from the element I took out from core data
@IBAction func start(sender: UIButton) {
setValues()
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let request = NSFetchRequest(entityName: "Entity")
do {
let results = try context.executeFetchRequest(request)
entitys = results as! [NSManagedObject]
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
let otherEntity = entitys.last
let randomIndex = Int(arc4random_uniform(UInt32(otherEntity.count)))
driverSelection.text! = nameList[randomIndex]
}
}
我想做的是从我的核心数据中随机选择一个元素并将其设置为等于 driverSelection 文本字段。
在我的代码中,我将 coredata = 中的元素设置为 otherEntity
。这使 otherEntity
成为 NSmanagedObject
,但由于 otherEntity
是 NSmanagedObject
,我无法使用 .count
方法。有什么方法可以让我从 NSmanagedObject
中随机选择一个元素???
如果您尝试从数据库中当前数量的对象中提取随机索引,那么您应该使用 results.count
而不是 otherEntity.count
,如下所示:
@IBAction func start(sender: UIButton) {
setValues()
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let request = NSFetchRequest(entityName: "Entity")
var results = [AnyObject]()
do {
results = try context.executeFetchRequest(request)
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
let randomIndex = Int(arc4random_uniform(UInt32(results.count)))
driverSelection.text! = nameList[randomIndex]
}
Swift 5
我一直在寻找这个答案,我发现你可以用 fetchOffset 得到一行,用 moc.count
得到数组计数像这样...
func randomIconAK(_ moc: NSManagedObjectContext) -> Icon? {
//
// RETURNS ONE ITEM AT RANDOM
//
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Icon")
if let fetchRequestCount = try? moc.count(for: fetchRequest) {
fetchRequest.fetchOffset = Int.random(in: 0...fetchRequestCount)
}
fetchRequest.fetchLimit = 1
var fetchResults: [Icon]?
moc.performAndWait {
fetchResults = try? fetchRequest.execute() as? [Icon]
}
if let wrapFetchResults = fetchResults {
if wrapFetchResults.count > 0 {
return wrapFetchResults.first
} else {
return nil
}
} else {
return nil
}
}//randomIconAK