I have the following code that executes without error. The problem is it only saves the last entry ("Jack Daniels", 3). How do change this so it will save all three entries?
let employees = NSEntityDescription.insertNewObjectForEntityForName("Employees", inManagedObjectContext: managedObject)
employees.setValue("John Doe", forKey: "employeename")
employees.setValue(1, forKey: "id")
employees.setValue("Jane Doe", forKey: "employeename")
employees.setValue(2, forKey: "id")
employees.setValue("Jack Daniels", forKey: "employeename")
employees.setValue(3, forKey: "id")
do {
try managedObject.save()
} catch {
print("problem saving")
}
Right-click on your project's folder in the project navigator and then New File… In the new window, type “data” in the top right corner, select Data Model, and press Next. Give it a name, and save it. Now, let's add all the necessary code to connect Core Data with our project.
The next time you need to store data, you should have a better idea of your options. Core Data is unnecessary for random pieces of unrelated data, but it's a perfect fit for a large, relational data set. The defaults system is ideal for small, random pieces of unrelated data, such as settings or the user's preferences.
Use Core Data to save your application's permanent data for offline use, to cache temporary data, and to add undo functionality to your app on a single device. To sync data across multiple devices in a single iCloud account, Core Data automatically mirrors your schema to a CloudKit container.
Swift 4.1. You don't need to put save code in for loop. Just insert all enteries then do save them in one go.
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Employees", in: context)
let employeeNames = ["John Doe", "Jane Doe", "Jack Daniels"]
for (index, employee) in employeeNames.enumerated() {
let newUser = NSManagedObject(entity: entity!, insertInto: context)
newUser.setValue(employee, forKey: "employeename")
newUser.setValue(index, forKey: "id")
}
do {
try context.save()
} catch {
print("Failed saving")
}
// Alternative You can create your Entity class as below and insert entries.
import CoreData
class Employees: NSManagedObject {
@NSManaged var employeename: String
@NSManaged var id: String
func addNameAndId(name: String = "", id: String = "") throws {
if name.count > 0 {
self.employeename = name
self.id = id
} else {
throw NSError(domain: "", code: 100, userInfo: nil)
}
}
}
// Now time to insert data
let employeeNames = ["John Doe", "Jane Doe", "Jack Daniels"]
for name in employeeNames {
guard let emp = NSEntityDescription.insertNewObject(forEntityName: "Employees", into: context) as? Employees else {
print("Error: Failed to create a new Film object!")
return
}
do {
try emp.addNameAndId(name: name, id: "0")
} catch {
print("Error: \(error)\nThe quake object will be deleted.")
context.delete(emp)
}
}
// Save all the changes just made and reset the taskContext to free the cache.
if context.hasChanges {
do {
try context.save()
} catch {
print("Error: \(error)\nCould not save Core Data context.")
}
context.reset() // Reset the context to clean up the cache and low the memory footprint.
}
let employees = NSEntityDescription.insertNewObjectForEntityForName("Employees", inManagedObjectContext: managedObject)
let employees1 = NSEntityDescription.insertNewObjectForEntityForName("Employees", inManagedObjectContext: managedObject)
let employees2 = NSEntityDescription.insertNewObjectForEntityForName("Employees", inManagedObjectContext: managedObject)
employees.setValue("John Doe", forKey: "employeename")
employees.setValue(1, forKey: "id")
employees1.setValue("Jane Doe", forKey: "employeename")
employees1.setValue(2, forKey: "id")
employees2.setValue("Jack Daniels", forKey: "employeename")
employees2.setValue(3, forKey: "id")
do {
try managedObject.save()
} catch {
print("problem saving")
}
A more compact way (and expandable) to do this would be to load your name data into an array, and step through that. You don't really want to be hard-coding variable1, variable2 for arrays of arbitrary length
let employeeNames = ["John Doe", "Jane Doe", "Jack Daniels"]
for (index, employee) in employeeNames.enumerate()
{
let employeeEntry = NSEntityDescription.insertNewObjectForEntityForName("Employees", inManagedObjectContext: managedObject)
employeeEntry.setValue("John Doe", forKey: "employeename")
employees.setValue(index, forKey: "id")
do {
try managedObject.save()
} catch {
print("problem saving")
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With