【问题标题】:Realm c# : How to add DynamicRealmObject?Realm c#:如何添加 DynamicRealmObject?
【发布时间】:2021-08-12 12:05:15
【问题描述】:

我在 c# (VS) 中设置了领域 (v10.3.0),它适用于经典静态对象(继承 RealmObject)。现在我需要在运行时创建一个动态对象并考虑一下。像这样:

RealmConfiguration config = new RealmConfiguration(realm_db_name);
config.SchemaVersion = 2;
config.ShouldDeleteIfMigrationNeeded = true;
config.IsDynamic = true;
                
var realm = Realm.GetInstance(config);

realm.Write(() =>
{

                    DynamicRealmObject tmp_obj = realm.DynamicApi.CreateObject("test", "time");

                    for (int min_idx = 0; min_idx < values.Length; min_idx++)
                    {
                        for (int col_idx = 0; col_idx < headers.Length - 1; col_idx++)
                        {
                            tmp_obj.DynamicApi.Set(headers[col_idx], double_values[col_idx,min_idx]);
                        } 

                        realm.Add(tmp_obj);

                    }
});

(headers 是带有标题名称的字符串[],double_values 是带有值的二维双精度数组)

但是,我收到以下错误:

类测试不在此领域的有限类集中

我还尝试设置不同的架构版本(从 1 到 2),但没有任何改变。如果我捕捉到当前架构,它仍然拥有我之前使用的旧静态类。

有什么想法吗?

【问题讨论】:

    标签: c# .net realm


    【解决方案1】:

    正如 MongoDB 社区论坛 here 上所讨论的那样,不幸的是,无法按照您的意愿以编程方式创建模式。当前的动态 API 只能用于访问现有属性。

    您尝试做的另一种方法可能是使用字典:

    public class HeaderContainer : RealmObject
    {
        public IDictionary<string, double> Headers { get; }
    }
    
    // Later...
    
    realm.Write(() =>
    {
    
        var container = realm.Add(new HeaderContainer());
    
        for (int min_idx = 0; min_idx < values.Length; min_idx++)
        {
            for (int col_idx = 0; col_idx < headers.Length - 1; col_idx++)
            {
                container.Headers[headers[col_idx]] = double_values[col_idx,min_idx];
            } 
        }
    });
    
    

    【讨论】:

    • 泰!这在技术上是这样做的,但在性能方面它有令人难以置信的缺点,所以很遗憾它对我来说不可用。你试过吗?使用动态扩展对象?
    • @c_ph_r 性能是 Realm 团队可以看看的,因为它们不应该那么糟糕。关于动态对象,不幸的是它不是你可以使用的,因为它们有不同的用例,即使命名听起来很混乱
    • 好吧……太糟糕了!我已经为我的用例完成了第一轮数据库基准测试,不幸的是,领域还不够快。我喜欢这种处理方式,它非常直观。希望团队正在深入研究此功能...无论如何我都会接受您的回答作为解决方案..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多