领域数据库多个表

时间:2018-08-07 20:16:51

标签: android realm android-database

尽管阅读了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

3 个答案:

答案 0 :(得分:1)

一些要点:

每个领域配置将转换为一个数据库。 扩展realmobject的每个类将转换为一个表。 这些类的每个实例都将转换为一行(如果保存的话)。

首先尝试确定您需要多少个数据库和表? (99%的应用程序使用1个数据库)。您可以阅读并遵循数据库规范化方法,然后尝试使用Realm满足您的需求。

答案 1 :(得分:1)

  

据我所知,领域就像一个表,但是它可以存储多个模型

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();
}

答案 2 :(得分:0)

我也是Realm的新手,并且从SQL Lite切换到了我,我想知道如何替换表,因为我对Realm的了解是它存储对象。 下载Realm Studio之后,我有点了解了Realm如何存储数据。

这就是我所看到的,以及如何根据情况使用倍数表。

创建Realm Object时,它基本上会创建一个具有基于Objects属性键的字段的表。因此,您不必表相同的对象,也不必因为它们相同而没有用

对于您的情况,您只需要一个用于Songs的表,然后又有其他表(songs_new和songs_best),这些表将包含一个键,该键实际上指向songs_table中的项是外键。