1

I am trying to save a random number with current date in core data. But the number is getting over written. Here is my code :

func saveRandNumbers (number : Int){

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

        let date = Date();

        let managedContext = appDelegate.persistentContainer.viewContext;

        let entity = NSEntityDescription.entity(forEntityName: "RandNumbers", in: managedContext);

        let randNumbers = NSManagedObject(entity: entity!, insertInto : managedContext);

        randNumbers.setValue(number , forKeyPath : "randNumber");
        randNumbers.setValue(date , forKeyPath : "time");

        do{
            try managedContext.save()
        }catch let error as NSError{
            print("Could not save\(error)");
        }
    }

This is how I am testing it for demo. In viewDidLoad()

I call that function with two diff values :

saveRandNumbers (number : 3)
saveRandNumbers (number : 4)

Code to fetch the data :

func fetchRandNumbers (){

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

        let managedContect = appDelegate.persistentContainer.viewContext;

        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName : "RandNumbers")

        do{
            RandNumbers = try managedContect.fetch(fetchRequest)
            print("Result :\(RandNumbers)")
        }catch let error as NSError{
            print("Could not fetch \(error)");
        }

    }

Output:

[<RandNumbers: 0x608000099690> (entity: RandNumbers; id: 0xd000000000040000 <x-coredata://B35EDED6-9C24-45E7-8F05-D2CB5F5FE4BA/RandNumbers/p1> ; data: <fault>), <RandNumbers: 0x60800009a400> (entity: RandNumbers; id: 0xd000000000080000 <x-coredata://B35EDED6-9C24-45E7-8F05-D2CB5F5FE4BA/RandNumbers/p2> ; data: <fault>), <RandNumbers: 0x60800009ac70> (entity: RandNumbers; id: 0xd0000000000c0000 <x-coredata://B35EDED6-9C24-45E7-8F05-D2CB5F5FE4BA/RandNumbers/p3> ; data: <fault>), <RandNumbers: 0x60800009acc0> (entity: RandNumbers; id: 0xd000000000100000 <x-coredata://B35EDED6-9C24-45E7-8F05-D2CB5F5FE4BA/RandNumbers/p4> ; data: <fault>), <RandNumbers: 0x60800009adb0> (entity: RandNumbers; id: 0xd000000000140000 <x-coredata://B35EDED6-9C24-45E7-8F05-D2CB5F5FE4BA/RandNumbers/p5> ; data: <fault>), <RandNumbers: 0x60000009d470> (entity: RandNumbers; id: 0xd000000000180000 <x-coredata://B35EDED6-9C24-45E7-8F05-D2CB5F5FE4BA/RandNumbers/p6> ; data: {
    randNumber = 4;
    time = nil;
})]

And when i print the result i only get 2nd value. Any help would be appreciated. Thanks.

Sharad Chauhan
  • 4,821
  • 2
  • 25
  • 50

2 Answers2

1

You have fetched an array of results; you need to iterate through this array to access each individual item. When you print the array, the objects are faults; placeholder objects that will be replaced with the actual object when you access it.

func fetchRandNumbers (){

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

    let managedContect = appDelegate.persistentContainer.viewContext;

    let fetchRequest: NSFetchRequest<RandNumbers> = RandNumbers.fetchRequest()

    do{
        let randNumbers = try managedContect.fetch(fetchRequest)
        for randNumber in randNumbers {
            print("random number \(randNumber.number) was saved at \(randNumber.date)")
        }
    }catch let error as NSError{
        print("Could not fetch \(error)");
    }

}
Paulw11
  • 108,386
  • 14
  • 159
  • 186
  • Getting this : Value of type 'NSMAnagedObject' has no member 'randNumber' – Sharad Chauhan May 22 '17 at 11:17
  • Its not working. Why you have user RandNumbers.fetchRequest() ? RandNumbers is a var of NSManagedObject type to store the fetched values. – Sharad Chauhan May 22 '17 at 11:25
  • `RandNumbers` should not be a variable; variables start with lower case letters. Classes start with upper case letters. Core Data automatically creates classes for each of your managed object entities. Using these saves you have having to do all of that messing around with `setValue`. Change your property name so that it isn't hiding the class. – Paulw11 May 22 '17 at 11:27
  • Yes, my mistake. Working fine now. Thanks. :) – Sharad Chauhan May 22 '17 at 11:36
0

Loop over your fetchedResults and print each randNumber:

RandNumbers = try managedContect.fetch(fetchRequest)
for randNumber in RandNumbers {
    print(randNumber)
}
shallowThought
  • 19,212
  • 9
  • 65
  • 112