Android Realm文件大小

时间:2015-12-11 06:36:17

标签: java android database android-studio realm

我是Android编程新手。我为我的简单成绩跟踪器实现了Realm,然而,文件大小从1.5mb增加到5mb。这是正常的吗?

我只是在每个使用oncreate的类中添加一个领域实例,只要活动有可能结束,就会在realm.close()中添加。还围绕每个对象创建包装了begin和commit事务。

我做错了什么导致了大量的文件?

谢谢!

编辑:我的意思是apk尺寸

4 个答案:

答案 0 :(得分:5)

@geisshirt是对的。 Realm引入了方法public static boolean compactRealm(RealmConfiguration configuration)来压缩领域数据库。调用此方法会将我的数据库大小从+ 350MB减少到<1MB

此处提供的文档: https://realm.io/docs/java/latest/api/io/realm/Realm.html#compactRealm-io.realm.RealmConfiguration-

答案 1 :(得分:4)

如果您有长时间运行的事务,文件大小可能会增加。有关说明以及如何减小文件大小,请参阅https://realm.io/docs/java/latest/#faq(“大域文件大小”)。

答案 2 :(得分:3)

我已经研究过并尝试了所有东西,所以不要浪费你的时间。 有两种可能的解决方案:

1)Realm.compact(RealmConfiguration): 您需要关闭已打开的Realm数据库的所有连接,活动或创建它的位置。然后你应该调用Realm.compact(yourDb.getConfiguration())。 如果在紧凑操作之前关闭每个连接,结果将为真,数据库将变小,否则不会调整大小,结果将为false。

2)我的那种compactDb: 第二种解决方案是基于做某种&#34;交换机制&#34;可能会有较慢的性能(在某些大型文件中,以毫秒为单位计算),但肯定会解决大文件的问题,并只为您的数据库留下必要的领域大小。

我创建了我的个人功能&#34; compactDb()&#34;那会:  1.拿我的db(领域),  2.将其复制到名为default-compact.realm的新文件中  3.删除我的db(领域)  4.将文件default-compact.realm复制回我的数据库(带扩展领域的新文件)  5.删除default-compact.realm,因为我们不再需要它们了

这&#34;复制品&#34;将删除旧版本的数据库并仅复制最后一个(数据库的实际大小)。由于下一步是删除您当前的数据库,然后您将删除这些文件......:)

这是我的代码:

    public void compactDb(String dbName){
    try{
        //move compacted db to new one...
        Realm db = Realm.getInstance(getConfig(dbName));
        File compactedFile = new File(db.getConfiguration().getRealmDirectory(), "default-compacted.realm");
        compactedFile.delete();
        db.writeCopyTo(compactedFile);
        db.close();

        Realm compactedDb = Realm.getInstance(getConfig("default-compacted.realm"));
        File dbFile = new File(compactedDb.getConfiguration().getRealmDirectory(), dbName);
        dbFile.delete();
        compactedDb.writeCopyTo(dbFile);
        compactedDb.close();
        compactedFile.delete();

    }catch (Exception e){
        e.printStackTrace();
    }
}

帮助函数,它将为我提供我通过代码使用的所需配置:

private RealmConfiguration getConfig(String name) {
    return new RealmConfiguration.Builder()
            .name(name)
            .schemaVersion(0)
            .build();
}

此功能的用法是:

compactDb("default.realm");

并且您的Realm数据库将调整为实际大小... 有一个快乐的编码:)

答案 3 :(得分:2)

如先前的回答中所述,有时需要处理default.realm文件,因为如果您执行很多领域操作,它可能会增加。经过大量测试,处理了许多不同线程的寄存器后,我发现这个文件有1.7GB。

在按我显示的方式将领域配置为紧凑后,该文件减小为<1MB。

Realm API - CompactRealm

中的更多详细信息

但是,一种简单的方法是在构建领域配置时调用方法 compactOnLaunch

    Realm.init(this);

    objRealmConfig = new RealmConfiguration.Builder()
            .schemaVersion(2)
            // WARNING: Use compact to reduce the size of default.realm. A Realm file usually contain free/unused space.
            // This method removes this free space and the file size is thereby reduced
            // If the app do a lot of operations with Realm, use this method to compact and release free/unused space.
            // More details in: https://realm.io/docs/java/latest/api/io/realm/Realm.html#compactRealm-io.realm.RealmConfiguration-
            .compactOnLaunch()
            .build();

    Realm.setDefaultConfiguration(objRealmConfig);