0

我正在尝试在 Mongo Realm 的用户集合(用于聊天应用程序)中添加嵌入的“对话”对象。我想在创建用户帐户时创建一个“默认”对话,这样每个用户都应该是至少一个对话的成员,然后他们可以将其他用户添加到其中。

该应用程序当前使用电子邮件/密码身份验证过程通过后端 Realm 中的触发器和函数更新用户集合。

我的类在 Swift 中定义如下:

@objcMembers class User: Object, ObjectKeyIdentifiable {
    dynamic var _id = UUID().uuidString
    dynamic var partition = "" // "user=_id"
    dynamic var userName = ""
    dynamic var userPreferences: UserPreferences?
    dynamic var lastSeenAt: Date?
    var teams = List<Team>()
    dynamic var presence = "Off-Line"

    var isProfileSet: Bool { !(userPreferences?.isEmpty ?? true) }
    var presenceState: Presence {
        get { return Presence(rawValue: presence) ?? .hidden }
        set { presence = newValue.asString }
    }

    override static func primaryKey() -> String? {
        return "_id"
    }

@objcMembers class Conversation: EmbeddedObject, ObjectKeyIdentifiable {
    dynamic var id = UUID().uuidString
    dynamic var displayName = ""
    dynamic var unreadCount = 0
    var members = List<Member>()
    
}

所以我目前的想法是我应该在 Swift 中对其进行如下编码,我认为这应该更新登录的用户,但遗憾的是不能完全正确:

 // Open the default realm
        let realm = try! Realm()
        
        try! realm.write {
            let conversation = Conversation()
            conversation.displayName = "My Conversation"
            conversation.unreadCount = 0
        
            var user = app.currentUser
            let userID = user.id
            
            let thisUser = User(_id: userID)
            realm.add(user)
        }

谁能发现我的代码哪里出错了?

在谷歌上花了几个小时,我错过了一些非常明显的东西!我有相当多的 .NET 经验和 SQL,但正在努力转换到新世界!

当谈到 NoSQL 数据库和 SwiftUI 时,我是一个菜鸟,并试图找到我查看大量 Google 示例的方法。我的示例基于 Andrew Morgan 的教程https://developer.mongodb.com/how-to/building-a-mobile-chat-app-using-realm-new-way/

4

1 回答 1

0

我对这里的确切用例有点不清楚,但我认为要问的是如何用默认值初始化一个对象——在这种情况下,一个默认对话,它是一个嵌入式对象。

如果这不是问题,请告诉我,以便我更新。

从用户对象开始

class UserClass: Object {
    @objc dynamic var _id = ObjectId.generate()
    @objc dynamic var name = ""

    let conversationList = List<ConversationClass>()

    convenience init(name: String) {
        self.init()
        self.name = name

        let convo = ConversationClass()
        self.conversationList.append(convo)
    }

    override static func primaryKey() -> String? {
        return "_id"
    }
}

和 EmbeddedObject 会话类

class ConversationClass: EmbeddedObject {
    dynamic var displayName = "My Conversation"
    dynamic var unreadCount = 0
    var members = List<MemberClass>()
}

目标是,当创建新用户时,他们会将默认对话类添加到对话列表中。这是在便利初始化中完成的

所以整个过程是这样的:

let realm = Realm()
let aUser = UserClass(name: "Leroy")
try! realm.write { 
   realm.add(aUser)
}

将初始化一个新用户,将他们的名字设置为 Leroy。它还将初始化一个 ConversationClass Embedded 对象并将其添加到会话列表中。

ConversationClass 对象为每个问题的 displayName 和未读计数设置了默认值。

于 2021-06-03T18:00:19.120 回答