Skip to content
This repository has been archived by the owner on Apr 1, 2024. It is now read-only.

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

Open
evohi8 opened this issue Aug 28, 2023 · 2 comments

Comments

@evohi8
Copy link

evohi8 commented Aug 28, 2023

データストアから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
Copy link

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

object["objectId"] = nickname.text

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

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

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

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

@evohi8
Copy link
Author

evohi8 commented Aug 30, 2023

ありがとうございます

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants