CoreData Swift: как сохранить и загрузить данные?
Я пишу игру iOS в Swift, и я хотел бы включить ярлык рекордов в конце. Я думаю, что функция сохранения правильная, но нагрузка-это та, которая дает мне проблемы. Я уже создал сущность ("BestScores") и атрибуты ("classicBestScoreTF"):
сохранить рекорд:
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)"
}
}
не работает :( пожалуйста, помогите!
3 ответов
сохранение данных:
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()
}
загрузка данных:
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)!
для сохранения данных, вы должны использовать:
context.insertNewObjectForEntityForName(...)
и то же самое, когда вы загружаете данные, должно быть:
контексте.valueForKey(...)
однако я не уверен, что это даже правильный синтаксис, так как вам может потребоваться получить массив сущностей, а затем получить объект в индексе 0. На этой ноте, почему вы используете основные данные для высоких результатов? Возможно, вы захотите изучить пользовательские настройки по умолчанию или icloud, Core data больше подходит для баз данных
обновлено для swift:
используется ниже простой код для загрузки, вставки, удаления даты;
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)")
}
}
}