Saving an object in Swift

Hi,

I’m a Parse convertee and has run in to a bit of trouble.
I have a class that I try to save to the server.









class BodyTrack: BackendlessEntity {

    

    let backendless = Backendless.sharedInstance()




    var user:           BackendlessUser

    var trackingDate:   NSDate

    var chest:          Double = 0.0

    var upperArm:       Double = 0.0

    var waist:          Double = 0.0

    var hip:            Double = 0.0

    var thigh:          Double = 0.0

    var weight:         Double = 0.0

    var bodyFat:        Double = 0.0

    var fatFreeMass:    Double = 0.0

    var totalBodyWater: Double = 0.0

    var bodyMassFat:    Double = 0.0

    var smm:            Double = 0.0

    

     init(user: BackendlessUser) {

        

        self.user           = user

        self.trackingDate   = NSDate()

        self.chest          = 0.0

        self.upperArm       = 0.0

        self.waist          = 0.0

        self.hip            = 0.0

        self.thigh          = 0.0

        self.weight         = 0.0

        self.bodyFat        = 0.0

        self.fatFreeMass    = 0.0

        self.totalBodyWater = 0.0

        self.bodyMassFat    = 0.0

        self.smm            = 0.0

    }

    

    // MARK: - Backendless

    

    

    func saveToServer() -> Bool {

        let dataStore = backendless.data.of(BodyTrack.ofClass())

        

        dataStore.save(

            self,

            response: { (result: AnyObject!) -> Void in

                let obj = result as! BodyTrack

                print("BodyTrack has been saved: \(obj.objectId)")

            },

            error: { (fault: Fault!) -> Void in

                print("Server reported an error: \(fault)")

        })

        return false

    }

    

However, when I run this i get an error and crash.

*** Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<Backendless 0x7fd1f2506dc0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key appID.’

I’m calling the save function from the viewcontroller like this;

let track            = BodyTrack(user: backendless.userService.currentUser)
            track.trackingDate   = Utils.dateFromString(dateTF.text!, format: "dd/MM/yyyy")
            track.weight         = (weightTF.text! != "") ? Double(weightTF.text!)! : 0.0
            track.chest          = (chestTF.text! != "") ? Double(chestTF.text!)! : 0.0
            track.upperArm       = (upperArmTF.text! != "") ? Double(upperArmTF.text!)! : 0.0
            track.waist          = (waistTF.text! != "") ? Double(waistTF.text!)! : 0.0
            track.hip            = (hipTF.text! != "") ? Double(hipTF.text!)! : 0.0
            track.thigh          = (thighTF.text! != "") ? Double(thighTF.text!)! : 0.0
            track.bodyFat        = (bodyfatTF.text! != "") ? Double(bodyfatTF.text!)! : 0.0
            track.fatFreeMass    = (ffmTF.text! != "") ? Double(ffmTF.text!)! : 0.0
            track.totalBodyWater = (tbwTF.text! != "") ? Double(tbwTF.text!)! : 0.0
            track.bodyMassFat    = (bfmTF.text! != "") ? Double(bfmTF.text!)! : 0.0
            track.smm            = (smmTF.text! != "") ? Double(smmTF.text!)! : 0.0


           track.saveToServer()

I would be grateful for any help to point out where I have gone wrong.

Hi Jorgen,
Please remove
let backendless = Backendless.sharedInstance()
from your BodyTrack class. You can do this somewhere outside the BodyTrack class, maybe in ViewController class.
Regards,
Slava

Hi Slava,

I did that, but now let dataStore = backendless.data.of(BodyTrack.ofClass()) is not happy. I have it being called in the AppDelegate.

You can rewrite your BodyTrack class methods using directly Backendless.sharedInstance(), for example:

func saveToServer() -> Bool {
let dataStore = Backendless.sharedInstance().data.of(BodyTrack.ofClass())
dataStore.save(
self,
response: { (result: AnyObject!) -> Void in
let obj = result as! BodyTrack
print("BodyTrack has been saved: \(obj.objectId)")
},
error: { (fault: Fault!) -> Void in
print("Server reported an error: \(fault)")
})
return false
}

Got one step further down the line, but ended up with a different error…

fatal error: use of unimplemented initializer ‘init()’ for class ‘BodyTrack’

Found the problem.

I had to have a simple override init() and all was happy.
Now to get it back from the server.

Thanks for your help Vyacheslav.

  override init() {
        
        self.user = Backendless.sharedInstance().userService.currentUser
        self.trackingDate   = NSDate()
        self.chest          = 0.0
        self.upperArm       = 0.0
        self.waist          = 0.0
        self.hip            = 0.0
        self.thigh          = 0.0
        self.weight         = 0.0
        self.bodyFat        = 0.0
        self.fatFreeMass    = 0.0
        self.totalBodyWater = 0.0
        self.bodyMassFat    = 0.0
        self.smm            = 0.0
        
        super.init()
    }

Please add to your BodyTrack class:

    override init() {
    }