ios CoreData Swift:如何保存和加载数据?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25586593/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 02:06:31  来源:igfitidea点击:

CoreData Swift: How to save and load data?

iosswiftiphonecore-data

提问by Nico Gutraich

I'm writing an iOS game in Swift, and I wanted to include a highscore label at the end. I think that the saving function is correct, but the load one is the one which is giving me problems. I already created an entity ("BestScores") and the attributes ("classicBestScoreTF"):

我正在用 Swift 编写一个 iOS 游戏,我想在最后包含一个高分标签。我认为保存功能是正确的,但加载功能是给我带来问题的功能。我已经创建了一个实体(“BestScores”)和属性(“classicBestScoreTF”):

To save the highscore:

保存高分:

var bestscore25 = 1000
var score: int

func savescore() {    
    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!
    var score25: AnyObject! = NSEntityDescription.insertNewObjectForEntityForName("BestScores", inManagedObjectContext: context) as NSManagedObject
    score25.setValue(score, forKey: "classicBestScoreTF")
    context.save(nil)
}

func loadscore() {
    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!
    bestScore25 = valueForKey("classicBestScoreTF") as Int
}

func endgame() {

    if score > bestScore25 {
        savescore()
        loadscore()
        bestScoreLabel.text = "Best Score: \(bestScore25)"
    }

    if score < bestscore {            
        loadscore()
        bestScoreLabel.text = "Best Score: \(bestScore25)"
    }    
}

It's not working :( Please help!

它不起作用:(请帮忙!

回答by jomafer

Saving data:

保存数据:

var person = NSEntityDescription.insertNewObjectForEntityForName("Person", 
inManagedObjectContext: self.managedObjectContext!) as Person
person.name = "Mary"
person.age = Float(arc4random() % 100)

var error : NSError? = nil
if !self.managedObjectContext!.save(&error) {
    NSLog("Unresolved error \(error), \(error!.userInfo)")
    abort()
}

Loading data:

加载数据中:

var error: NSError? = nil
var fReq: NSFetchRequest = NSFetchRequest(entityName: "Frases")    
fReq.predicate = NSPredicate(format: "id contains[c] %@", String(day))
var sorter: NSSortDescriptor = NSSortDescriptor(key: "id" , ascending: false)
fReq.sortDescriptors = [sorter]
fReq.returnsObjectsAsFaults = false
let result : [AnyObject] = self.managedObjectContext!.executeFetchRequest(fReq, error:&error)!

回答by steffeydev

For saving data, you should be using:

为了保存数据,您应该使用:

context.insertNewObjectForEntityForName(...)

And the same when you are loading data, it should be:

与加载数据时相同,它应该是:

context.valueForKey(...)

context.valueForKey(...)

However, I am not sure if that is even the correct syntax, as you may need to get an array of the entities and then get the object at index 0. On that note why are you using core data for high scores? You might want to look into user defaults or icloud, Core data is designed more for databases

但是,我不确定这是否是正确的语法,因为您可能需要获取实体数组,然后获取索引 0 处的对象。关于这一点,您为什么要使用核心数据来获得高分?您可能想查看用户默认值或 icloud,核心数据更多地是为数据库设计的

回答by Kiran jadhav

Updated for swift:

快速更新:

used below simple code for load, insert, delete date;

下面使用简单的代码来加载、插入、删除日期;

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

    // MARK:- Variable Declarations

    @IBOutlet weak var mTableView: UITableView!
    var manageObjectContext: NSManagedObjectContext!
    var eventArray = [Event]()

    // MARK:- ViewController LifeCycle Methods

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "Event Reminder"
        manageObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        self.loadSaveData()
    }

    override func viewWillAppear(_ animated: Bool) {
        // Remove empty cell from tableview
        mTableView.tableFooterView = UIView(frame: .zero)
    }

    // MARK:- TableView DataSource and Delegate Methods

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return eventArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ViewControllerTableViewCell")! as! ViewControllerTableViewCell
        cell.layer.cornerRadius = 05

        let eventArrayItem = eventArray[indexPath.row]

        if let eventImage = UIImage(data: (eventArrayItem.event_image! as Data)){
            cell.mImageView.image = eventImage
        }

        cell.mEventHeadingLabel.text = eventArrayItem.event_heading
        cell.mShortDescriptionLabel.text = eventArrayItem.event_description

        return cell
    }

    // To delete Particular cell/row from tableview
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        let eventArrayItem = eventArray[indexPath.row]

        if editingStyle == .delete {
            manageObjectContext.delete(eventArrayItem)

            do {
                try manageObjectContext.save()
            } catch let error as NSError {
                print("Error While Deleting Note: \(error.userInfo)")
            }
        }
        self.loadSaveData()
    }

    // MARK:- IBAction Methods

    @IBAction func actionOnPlusButton(_ sender: Any) {
        let imagePicker = UIImagePickerController()
        imagePicker.sourceType = .photoLibrary
        imagePicker.delegate = self
        self.present(imagePicker, animated: true, completion: nil)
    }

    // MARK:- ImagePicker Delegate Methods

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        if let mImage = info[UIImagePickerControllerOriginalImage] as? UIImage{
            picker.dismiss(animated: true, completion: { 
                self.createEventItemWith(selectedImage: mImage)
            })
        }
    }

    // MARK:- Instance Methods

    func createEventItemWith(selectedImage: UIImage)  {

        let eventItem = Event(context: manageObjectContext)

        let alertController = UIAlertController(title: "Add Event", message: "Enter event and it's description", preferredStyle: .alert)

        let saveAction = UIAlertAction(title: "Save", style: .default, handler: {
            alert -> Void in

            let eventNameTextField = alertController.textFields![0] as UITextField
            let descriptionTextField = alertController.textFields![1] as UITextField

            print("firstName \(String(describing: eventNameTextField.text)), secondName \(String(describing: descriptionTextField.text))")

            if eventNameTextField.text != "" || descriptionTextField.text != ""{

                eventItem.event_heading = eventNameTextField.text
                eventItem.event_description = descriptionTextField.text
                eventItem.event_image = NSData(data: UIImageJPEGRepresentation(selectedImage, 0.3)!)

                do{
                    try self.manageObjectContext.save()
                    self.loadSaveData()
                }catch{
                    print("Could not save data: \(error.localizedDescription)")
                }

            }else{
                self.showAlertMessageToUser(title: "Alert", messageToUser: "Fields should not be empty, Please enter given info...")
            }
        })

        let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: {
            (action : UIAlertAction!) -> Void in
                self.manageObjectContext.reset()
        })

        alertController.addTextField { (textField : UITextField!) -> Void in
            textField.placeholder = "Enter event Name"
        }
        alertController.addTextField { (textField : UITextField!) -> Void in
            textField.placeholder = "Enter event description in short"
        }

        alertController.addAction(saveAction)
        alertController.addAction(cancelAction)

        self.present(alertController, animated: true, completion: nil)
    }

    func showAlertMessageToUser(title: String, messageToUser: String)  {
        let alert = UIAlertController(title: title, message: messageToUser, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }

    func loadSaveData()  {
        let eventRequest: NSFetchRequest<Event> = Event.fetchRequest()
        do{
            eventArray = try manageObjectContext.fetch(eventRequest)
            self.mTableView.reloadData()
        }catch
        {
            print("Could not load save data: \(error.localizedDescription)")
        }
    }
}

enter image description here

在此处输入图片说明

回答by swiftBoy

Swift 5

斯威夫特 5

Step 1. Create Simple app with CoreData option

步骤 1. 使用 CoreData 选项创建简单的应用程序

enter image description here

在此处输入图片说明

Step 2. Open .xcdatamodeldfile and add Entity, Attributesthis way

步骤 2. 打开.xcdatamodeld文件并以这种方式添加Entity, Attributes

enter image description here

在此处输入图片说明

Step 3. your AppDelegate should have Core Data stack methods

步骤 3. 你的 AppDelegate 应该有Core Data 堆栈方法

Step 4. Make sure you have swift code snipe as following

步骤 4. 确保你有如下的 swift code snipe

import UIKit
import CoreData

class ViewController: UIViewController {

    // MARK: Variables declearations
    let appDelegate = UIApplication.shared.delegate as! AppDelegate //Singlton instance
    var context:NSManagedObjectContext!

    // MARK: View Controller life cycle methods
    override func viewDidLoad() {
        super.viewDidLoad()

        openDatabse()
    }

    // MARK: Methods to Open, Store and Fetch data
    func openDatabse()
    {
        context = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "Users", in: context)
        let newUser = NSManagedObject(entity: entity!, insertInto: context)
        saveData(UserDBObj:newUser)
    }

    func saveData(UserDBObj:NSManagedObject)
    {
        UserDBObj.setValue("RDC", forKey: "username")
        UserDBObj.setValue("1234", forKey: "password")
        UserDBObj.setValue("21", forKey: "age")

        print("Storing Data..")
        do {
            try context.save()
        } catch {
            print("Storing data Failed")
        }

        fetchData()
    }

    func fetchData()
    {
        print("Fetching Data..")
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
        request.returnsObjectsAsFaults = false
        do {
            let result = try context.fetch(request)
            for data in result as! [NSManagedObject] {
                let userName = data.value(forKey: "username") as! String
                let age = data.value(forKey: "age") as! String
                print("User Name is : "+userName+" and Age is : "+age)
            }
        } catch {
            print("Fetching data Failed")
        }
    }
}

Step 5. Run on Device and see log for core data results

步骤 5. 在设备上运行并查看核心数据结果的日志

回答by kartik patel

import UIKit import CoreData

导入 UIKit 导入 CoreData

class ViewController: UIViewController {

类视图控制器:UIViewController {

let nameTxt: UITextField = {

    let td = UITextField()
    td.translatesAutoresizingMaskIntoConstraints = false
    td.placeholder = "Enter Id"
    td.borderStyle = .line
    td.layer.borderWidth = 1
    td.layer.borderColor = UIColor.lightGray.cgColor
    return td
}()

let doneBt: UIButton = {

    let bt = UIButton()
    bt.translatesAutoresizingMaskIntoConstraints = false
    bt.setTitle("DONE", for: .normal)
    bt.setTitleColor(.white, for: .normal)
    bt.addTarget(self, action: #selector(handleDoneBt), for: .touchUpInside)
    bt.backgroundColor = UIColor.blue
    return bt
}()

@objc func handleDoneBt() {

     saveData()
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    view.backgroundColor = .white

    setupView()
    setupLayout()

}


func saveData() {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}

    let manageContent = appDelegate.persistentContainer.viewContext

    let userEntity = NSEntityDescription.entity(forEntityName: "Users", in: manageContent)!

    let users = NSManagedObject(entity: userEntity, insertInto: manageContent)

    users.setValue(1, forKeyPath: "id")
    users.setValue(nameTxt.text, forKeyPath: "name")
    users.setValue(123, forKeyPath: "mobile")


    do{
        try manageContent.save()
    }catch let error as NSError {

        print("could not save . \(error), \(error.userInfo)")
    }

    fetchData()
}

func fetchData() {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}
     let manageContent = appDelegate.persistentContainer.viewContext
     let fetchData = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")

    do {

        let result = try manageContent.fetch(fetchData)

        for data in result as! [NSManagedObject]{

             print(data.value(forKeyPath: "id") as Any)
             print(data.value(forKeyPath: "name") as Any)
        }
    }catch {
        print("err")
    }
}

func setupView() {

    view.addSubview(nameTxt)
    view.addSubview(doneBt)
}
func setupLayout(){

    NSLayoutConstraint.activate([

            nameTxt.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            nameTxt.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            nameTxt.widthAnchor.constraint(equalToConstant: 160),
            nameTxt.heightAnchor.constraint(equalToConstant: 30),

            doneBt.topAnchor.constraint(equalTo: nameTxt.bottomAnchor,constant: 6),
            doneBt.leftAnchor.constraint(equalTo: nameTxt.leftAnchor,constant: 8),
            doneBt.widthAnchor.constraint(equalToConstant: 120),
            doneBt.heightAnchor.constraint(equalToConstant: 36)
        ])
}

}

}

DISPLAY IN TABLEVIEW

在表格中显示

func fetchData() {

功能 fetchData() {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}
    let manageContent = appDelegate.persistentContainer.viewContext
    let fetchData = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")        
    do {

        let result = try manageContent.fetch(fetchData)
        allData = result as! [NSManagedObject]
        tbl.reloadData()
    }catch {
        print("err")
    }
}

var allData = [NSObject]()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return allData.count }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return allData.count }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! tblCell
    cell.lbl.text = allData[indexPath.row].value(forKey: "name") as? String
    return cell
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

func tableView(_ tableView: UITableView, commiteditingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {
        let task = allData[indexPath.row]
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}

        let manageContent = appDelegate.persistentContainer.viewContext

        manageContent.delete(task as! NSManagedObject)
        (UIApplication.shared.delegate as! AppDelegate).saveContext()

        do {
            try manageContent.save()
        } catch {
            print("Fetching Failed")
        }
    }
    fetchData()
}