You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Realm:如何获取数据库中所有对象的类型?

获取Realm模型类名并生成变量/枚举的方法

核心思路

Realm的Schema包含了所有已注册模型的元数据,通过读取Schema可以直接获取所有继承自Object的类名,再基于这些类名实现变量存储或枚举定义。


Swift(iOS/macOS)实现

1. 获取所有模型类名并保存为变量

import RealmSwift

do {
    let realm = try Realm()
    // 从Realm Schema中提取所有模型类名
    let allModelClassNames = realm.schema.objectSchemas.map { $0.className }
    // 保存为字符串数组变量
    let registeredModels: [String] = allModelClassNames
    print("已注册的Realm模型:\(registeredModels)")
} catch {
    print("Realm初始化失败:\(error)")
}

2. 创建对应枚举

Swift枚举是编译期类型,无法动态生成,需手动根据类名定义,或借助代码生成工具(如Sourcery)自动生成:

enum RealmModel: String {
    case User
    case Post
    case Comment
    // 根据实际模型类名逐一添加
}

// 类名转枚举的工具方法
extension RealmModel {
    static func fromClassName(_ className: String) -> RealmModel? {
        return RealmModel(rawValue: className)
    }
}

Kotlin(Android)实现

1. 获取所有模型类名并保存为变量

import io.realm.Realm
import io.realm.RealmConfiguration

val config = RealmConfiguration.getDefaultConfiguration()
val schema = config.schema
// 提取所有模型类名
val allModelClassNames = schema.allClasses.map { it.name }
// 保存为List变量
val registeredModels: List<String> = allModelClassNames
println("已注册的Realm模型:$registeredModels")

2. 创建对应枚举

同样需手动定义枚举,可添加工具方法实现类名与枚举的转换:

enum class RealmModelType(val className: String) {
    User("User"),
    Post("Post"),
    Comment("Comment");

    companion object {
        fun fromClassName(className: String): RealmModelType? {
            return values().firstOrNull { it.className == className }
        }
    }
}

注意事项

  • 如果你的Realm配置中显式指定了objectTypes(如Swift中Realm.Configuration(objectTypes: [User.self, Post.self])),直接读取配置的objectTypes再提取类名会更可靠,避免自动发现模型时的遗漏。
  • 单个Realm对象实例也可直接获取类名:Swift用object.className,Kotlin用object.realmClass.name。

内容的提问来源于stack exchange,提问作者Vader20FF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:11:37