如何从coredata swift中随机选择一个元素

时间:2016-01-21 06:51:45

标签: ios arrays core-data swift2 nsmanagedobject

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,但由于otherEntityNSmanagedObject,我无法使用.count方法。有没有办法让我能够从NSmanagedObject ???

中随机选择一个元素

2 个答案:

答案 0 :(得分:2)

如果您尝试从数据库中当前的对象数量中提取一个随机索引,那么应该使用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]

    }

答案 1 :(得分:2)

快捷键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