Несколько таблиц базы данных Realm

Я запутался в концепции таблиц и областей, хотя я читал документацию по области. Насколько я знаю, область похожа на таблицу, но в ней может храниться несколько моделей. Проблема в том, что я хочу иметь несколько таблиц (некоторые из них просто содержат объекты 1 класса, а некоторые — несколько классов), но я не знаю, как управлять несколькими областями. Я хочу, чтобы мой класс «База данных» был оболочкой для RealmDatabase, и я хочу, чтобы в нем было несколько таблиц, например, таблица для «новых песен» и таблица для «лучших песен». Итак, что я сделал:

public class Database {
//tables that I want to have
   public enum RealmType {
    SONGS_NEW, SONGS_BEST, PLAYLISTS_BEST, PLAYLISTS_MINE, PLAYLISTS_OTHERS, ALBUMS_SPECIAL, NEWS, FEED
   }

   private static final String TAG = "Database";

   Context context;
   //A realm object for each table
   Realm profileRealm;
   Realm songs_newRealm;
   Realm songs_bestRealm;
   //and so on...

// as I didn't know how to differentiate between Realms (all of them are created with Realm.getDefaultInstance(), and I think they are just one Realm. so I created a class for different configs )
private static class RealmConfigs {
        static RealmConfiguration songs_newConfig;
        static RealmConfiguration songs_bestConfig;
        //and so on..
        public RealmConfigs() {
            config();
        }

        private static void config() {
            songs_newConfig = new RealmConfiguration.Builder()
                    .name("songs_new.realm")
                    .deleteRealmIfMigrationNeeded()
                    .build();
            songs_bestConfig = new RealmConfiguration.Builder()
                    .name("songs_best.realm")
                    .deleteRealmIfMigrationNeeded()
                    .build();
        }
    }
}

Но это просто неправильно. Я знаю, что запутался в основных концепциях Realm, но документация тоже не помогла. Было бы полезно получить четкое объяснение того, как правильно управлять различными таблицами и их инициализировать.

PS. Я также нашел этот ответ, но он тоже не кажется правильным: https://stackoverflow.com/a/40547703/7893941


person Apptic    schedule 07.08.2018    source источник


Ответы (3)


Некоторые моменты:

Каждая конфигурация области будет преобразована в одну базу данных. Каждый класс, расширяющий realmobject, будет преобразован в одну таблицу. Каждый экземпляр этих классов будет преобразован в одну строку (если вы ее сохраните).

Прежде всего попробуйте решить, сколько баз данных и таблиц вам нужно? (99 процентов приложений используют 1 базу данных). Вы можете прочитать и следовать методам нормализации базы данных, а затем попытаться реализовать то, что вам нужно, с помощью Realm.

person Ehsan Mashhadi    schedule 07.08.2018
comment
Спасибо, это было очень ясно :) но что, если я хочу иметь несколько таблиц моего класса Song? - person Apptic; 07.08.2018
comment
Почему вы хотите разделить свои таблицы песен? У них разные столбцы? Если они совершенно разные, вы можете сделать для этого 2 отдельных класса. Если они зависимы, попробуйте связать их с внешним ключом, и если они имеют одну и ту же концепцию, но имеют разное значение, попробуйте использовать одну таблицу. - person Ehsan Mashhadi; 07.08.2018
comment
Это один и тот же класс, но они используются по-разному; Они будут отображаться в разных частях приложения. И я не знаю, как различать их с помощью запросов! (Я не думаю, что это возможно без добавления еще одного поля с именем type) - person Apptic; 07.08.2018
comment
Что я понял из вашего кода, так это то, что вам нужна одна таблица песен со столбцом типа для их классификации. - person Ehsan Mashhadi; 07.08.2018
comment
Конечно, я подумал, что это необычный способ справиться с этим! Дамет гарм однако :) - person Apptic; 07.08.2018
comment
Я рассматривал возможность использования столбца type в таблице Song, но я думаю, что он должен поддерживать сохранение одной и той же песни в разных списках воспроизведения. В этом случае ему нужно будет создать первичный ключ из type_songid и создать дубликаты записей песни для каждого списка воспроизведения песни. хранится в нем. Но его легче запрашивать, так что в этом тоже есть смысл. Однако именно поэтому я рассматривал возможность создания фактического RealmList<Song> для хранения порядка элементов. - person EpicPandaForce; 08.08.2018
comment
@Apptic Если вы считаете, что мой ответ помог вам, примите ответ. - person Ehsan Mashhadi; 08.08.2018
comment
конечно :), но я бы предложил обновить ваш ответ, чтобы он содержал добавление поля типа и составного первичного ключа (имя таблицы + идентификатор) - person Apptic; 08.08.2018

Насколько я знаю, область похожа на таблицу, но может хранить несколько моделей.

1 Realm — это 1 файл базы данных, и в нем может храниться несколько RealmModels.

Каждая RealmModel соответствует 1 «таблице».

PS. Я также нашел этот ответ, но он тоже не кажется правильным:

Это потому, что этот ответ предназначен для хранения подтипов данного класса в одной таблице. Хотя технически это возможно даже в вашем сетапе.

public class Playlist extends RealmObject {
    @Index
    private String type; // SONGS_NEW, SONGS_BEST, PLAYLISTS_BEST, PLAYLISTS_MINE, PLAYLISTS_OTHERS, ALBUMS_SPECIAL, NEWS, FEED

    private RealmList<Song> songs;
}

А потом

public RealmResults<Song> getSongsForType(Realm realm, RealmType type) {
    return realm.where(Playlist.class).equalTo("type", type.name())
                .findFirst().getSongs().where().findAll();
}
person EpicPandaForce    schedule 07.08.2018

Я тоже новичок в Realm и перехожу с SQL Lite, и мне было интересно, как заменить таблицы, поскольку я читал о Realm, что он хранит объекты. После загрузки Realm Studio я вроде как понял, как Realm хранит данные.

Это то, что я вижу, и то, как вы можете иметь несколько таблиц для вашей ситуации.

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

В вашем случае вам нужна только одна таблица для песен, а затем другие таблицы (songs_new и song_best ), и эти таблицы будут содержать ключ, который ссылается на элемент в song_table, в основном внешний ключ.

person JPilson    schedule 21.02.2020