2016-11-11 6 views
2

У меня есть класс RealmObject. Я хочу несколько таблиц одного класса. Могу ли я сделать это в одном Realm (Database), или мне нужно иметь несколько Realms (по одной таблице для каждого Realm).Таблицы с несколькими царствами того же класса

Если это должно быть несколько царств, насколько быстро происходит процесс переключения Царства?

+0

У вас есть определенное число этой таблицы, или 'N' этой таблицы? – EpicPandaForce

+0

BTW, пожалуйста, прочитайте [эту статью, часть '" Мне не нужен полиморфизм, мне просто нужны несколько классов, которые немного отличаются друг от друга, но разделяют одни и те же элементы "') (https://medium.com/ @ Zhuinden/design-the-schema-of-realm-эффективно-и-другие-realm-tips-feb76c5b6072 # .oah921cgf) – EpicPandaForce

+0

@EpicPandaForce Нет, количество таблиц динамическое. Скажите, что это как канал информации. С течением времени будет добавлен все больше каналов. Единственная вещь - информация, поступающая, хотя эти каналы имеют один и тот же тип. Но есть некоторые ограничения, которые они должны хранить отдельно. –

ответ

1

Я хочу несколько таблиц одного класса.

Ну у вас есть два разумных варианта:

1.) добавить поле дискриминатор, который определяет, какая «таблица» это текущий экземпляр объекта принадлежит

public class MyObject extends RealmObject { 
    @PrimaryKey 
    private String tableAndId; 

    @Index 
    private String table; 

    @Index 
    private long id; 

    // getters, setters 
} 

Тогда вы можете запросить «за столом «:

RealmResults<MyObject> results = realm.where(MyObject.class) 
             .equalTo(MyObjectFields.TABLE, "tableA") 
             .findAll(); 

2.) создать любую таблицу вы хотите динамически с помощью DynamicRealm и ручного создания схему через RealmSchema.

DynamicRealm dynamicRealm = DynamicRealm.getInstance(config); 
RealmSchema schema = dynamicRealm.getSchema(); 
RealmObjectSchema objectSchema; 
if(!schema.contains("MyObject_Table_A")) { 
    objectSchema = schema.create("MyObject_Table_A"); 
    objectSchema.addField("id", long.class, FieldAttribute.PRIMARY_KEY); 
    objectSchema.addField("created", Date.class, FieldAttribute.INDEXED); 
    //... 
} else { 
    objectSchema = schema.get("MyObject_Table_A"); 
} 

И затем вы можете написать в динамической области:

dynRealm.executeTransaction(new DynamicRealm.Transaction() { 
    @Override 
    public void execute(DynamicRealm dynRealm) { 
     DynamicRealmObject dynObj = dynRealm.where("MyObject_Table_A") 
              .equalTo("id", id) 
              .findFirst(); 
     if(dynObj == null) { 
      dynObj = dynRealm.createObject("MyObject_Table_A", id); 
     } 
     dynObj.setDate("created", new Date()); 
    } 
}); 

Вы также можете иметь новую конфигурацию для каждой таблицы, но это звучит как необоснованный вариант, так что я едва хочу упомянуть об этом.

Смежные вопросы