简体   繁体   中英

Save current user's message list in parse with swift

I use parse for my app. I want to let user able to type messages that they want to send via textField and save it to that user's messages column in parse with PFRelation via save button in view controller and the messages will be saved as an array and show it in tableView .

The problem is I don't know how to add text in textfield to an array and save it to parse.

Any help is appreciated and let me know if you need any additional information!

UPDATE:

These are screenshots of my parse's class "User"

This is my current user's friend list inside "Friends" column

I've not yet create Messages column because when run relationForKey code in Xcode it will automatically create for me

UPDATE 2:

This is my code:

@IBAction func addMessage(sender: AnyObject) {
    var newMessage = addMessageText.text
    let message = PFObject(className: "Messages")
    var query = PFQuery(className: "Messages")
    message["messageTextColumn"] = newMessage



    message.saveInBackgroundWithBlock {
        (success: Bool, error: NSError?) -> Void in
        if (success) {


            println("added to Message Class")
            query.whereKey("messageTextColumn", equalTo: newMessage)
            query.getFirstObjectInBackgroundWithBlock{(object:PFObject!, error: NSError!) -> Void in
                if error == nil {
                    let relation = PFUser.currentUser().relationForKey("Messages")
                    var addMessageWithObject = object
                    if addMessageWithObject != nil {
                        relation.addObject(addMessageWithObject)
                        println("Added with getFirstObject")
                    }
                    else{
                        println("Error Added with getFirstObject")
                    }
                }
            }



        } else {
            println("added to Message class Error")
        }
    }
    }

I save new message to the array first and then I save it with saveInBackgroundWithBlock.. and inside I query that message to add it to relation.

The messages that I've added appear on Messages class table but not in that user's relation but it shows log

"added to Message Class" and "Added with getFirstObject"  

Which means that my code execute exactly like it should be. Probably about the method?
UPDATE 3 this is the object println

<Messages: 0x7fd4484f75f0, objectId: LFXoSaHfQl, localId: (null)> {
ACL = "<PFACL: 0x7fd4484d2e70>";
messageTextColumn = 9;

}

UPDATE 4 this is my code

@IBAction func addMessage(sender: AnyObject) {
    var newMessage = addMessageText.text
    let message = PFObject(className: "Messages")
    var user = PFUser.currentUser()
    var query = PFQuery(className: "Messages")
    message["messageTextColumn"] = newMessage

        message.saveInBackgroundWithBlock {
            (success: Bool, error: NSError?) -> Void in
            if (success) {


                println("added to Message Class")
                query.getFirstObjectInBackgroundWithBlock{(object:PFObject!, error: NSError!) -> Void in
                    if error == nil {
                        var addMessageWithObject = object
                        if addMessageWithObject != nil {
                            user.saveInBackground()
                            println("Added with getFirstObject")
                        }
                        else{
                            println("Error Added with getFirstObject")
                        }
                    }
                }
            }
    }
}

user column is (undefined) as in screenshot here 消息类表
and the error log can't add non pointer to relation is back

how do I fix this? Thanks!

Here's what you do:

  1. Manually create your Message table on Parse
  2. Add a messages column to your user table of type Relation with Target Class as your Message table.
  3. In your code, in your buttons trigger:

     // Get the message text from your textField let messageText = textField.text // Create your new Message object let newMessage = PFObject(className: "Message") // ... Add your data to your new message object newMessage["messageTextColumn"] = messageText newMessage.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in if (success) { // Add the new message to the user's relation let relation = yourUser.relationForKey("messagesColumnName") relation.addObject(newMessage) // Save the user object yourUser.saveInBackground() } else { // There was a problem, check error.description } } 

Here's a link to Parse's Relation reference .

UPDATE:

Missing code to save your user object.

query.getFirstObjectInBackgroundWithBlock{(object:PFObject!, error: NSError!) -> Void in
            if error == nil {
                let relation = PFUser.currentUser().relationForKey("Messages")
                var addMessageWithObject = object
                if addMessageWithObject != nil {
                    relation.addObject(addMessageWithObject)

                    PFUser.currentUser().saveInBackground()

                    println("Added with getFirstObject")
                }
                else{
                    println("Error Added with getFirstObject")
                }
            }
        }

UPDATE 2:

Messages without PFRelation:

  1. Add a column (let's say user ) of type Pointer with Target Class as _User to the Messages table to identify each message by their user.
  2. Saving new messages: Save the new message object like above (just without adding the relation and it'e related code):

     @IBAction func addMessage(sender: AnyObject) { var newMessage = addMessageText.text let message = PFObject(className: "Messages") message["messageTextColumn"] = newMessage message["user"] = PFUser.currentUser() message.saveInBackgroundWithBlock {(success: Bool, error: NSError?) -> Void in if (success) { println("added to Message Class") } else { // Error saving message } } } 
  3. Querying the messages for a user: You can query using the current user as a constraint so no matter which device a particular switches to, he/she will get only his messages.

     var query = PFQuery(className:"Messages") query.whereKey("user", equalTo:PFUser.currentUser()) query.findObjectsInBackgroundWithBlock { ... } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM