NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
81 stars 18 forks source link

データストアからobjectIdを検索してidがあれば上書き、なければ新規登録したい #1364

Open evohi8 opened 10 months ago

evohi8 commented 10 months ago

データストアからAllUserクラスの中のobjectIdを検索してidがあれば上書き、なければ新規登録したいのですが、 どう記述すればよいかわかりません。下記の記述だとデバックで保存に失敗しましたと表示されます。 どなかたか、ご教示いただけますでしょうか。 初心者なもので、わからずすみません・・・

    @IBAction func gettest(_ sender: Any){
        var obid:String? = nil
        //AllUserクラスを検索するNCMBQueryを作成
        let query : NCMBQuery<NCMBObject> = NCMBQuery.getQuery(className: "AllUser")

        //データストアでの検索を行う
        query.findInBackground(callback: { result in
            switch result {
            case let .success(array):

                print("取得に成功しました 件数: \(array.count)")

                var ob:String = ""
                for objectVal in array{
                    if let obidfile : String = objectVal["objectId"]{
                        print(obidfile)
                    }
                    var obid = ob.append("objectVal")

//                    print(objectVal.objectId!)
                }

            case let .failure(error):
                print("取得に失敗しました: \(error)")
            }
        })
        let object : NCMBObject = NCMBObject(className: "AllUser")
            object.objectId = "\(obid)"

        // オブジェクトに値を設定
        object["objectId"] = nickname.text
        object["MailAdress"] = email.text
        object["Nickname"] = nickname.text
        object["Age"] = age.text
        object["Gender"] = gender.text
        object["tel"] = tel.text

        let agestring = age.text
        let ageint = Int(agestring!)
        guard let ageint else{
            return
        }

        let telstring = tel.text
        let telint = Int(telstring!)
        guard let telstring else{
            return
        }

        // データストアへの登録を実施
        object.saveInBackground(callback: { result in
            switch result {
            case .success:
                // 保存に成功した場合の処理
                print("保存に成功しました")
            case let .failure(error):
                // 保存に失敗した場合の処理
                print("保存に失敗しました: \(error)")
            }
        })

        //        performSegue(withIdentifier: "limetoblue", sender: nil)

    }
goofmint commented 10 months ago

objectIdは自動生成されるもので、上書きはできません。なので以下は不可です。

object["objectId"] = nickname.text

完全なユニーク制約は難しいですが、ニックネーム(nickname)の一意性を確認する場合には、QueryのequalToを使って、検索を実行してください。結果が1件であればすでに利用済み、なければ利用可能と判断できます。

query.where(field: "nickname", equalTo: nickname.text)

ただし、同時に同じニックネームに関するリクエストがあった場合には登録されてしまうので、その点は注意が必要です。

NCMBでユニークが保証されるのは、ユーザ管理のuserNameになるので、userName = ニックネームであればユニークが保証されます(同じuserNameでは登録できません)。その上で、ユーザーが自由に決められるニックネーム(表示名)がある方が安全かと思います。

evohi8 commented 10 months ago

ありがとうございます