去你妈的Realm

记录一下自己的入坑记录,使用Realm过程中的血泪历。

;

Realm这个数据库早就有所耳闻,只是一直没有什么机会去用到它,恰好赶上我最近打算做一个私人项目,也刚好需要用到数据。 所以一直秉着追求技术潮流的脚步,我打算先用Realm。它号称是专为移动端设计的一款数据,号称速度双倍于SQLiet,而且还支持swiftreact native。所以在选用前我几乎是毫不犹豫,而且还带有一丝兴奋。现在回想起来,感觉比吃了💩还难受。下面一一道述所使用过程中所遇到的奇葩故事。

在查找学习资料的时候,我完全被第一条约束所震精。所以的实体类必须继承自RealmObject,要知道java是单继承机制,你所有的实体不能在继承别的东西,侵入性非常强。例如如果要使用bomb这样的第三方服务,只能使用复杂的接口方式了。
首先我的确无法认同这样糟糕的设计,但是如果仅仅如此那我还能勉强使用。Realm所支持的数据类型只有基础数据类型和String,所有的非基础类型必须继承RealmObject,List必须使用RealmList替代。关键在于如果使用RealmList(Sting)这种类型是用不了的。这可是最常见的一种数据类型啊,这样就不给用了?再看看资料,RealmList中只支持继承RealmObject的数据类型,意思就是你的String必须继承完了之后才能使用。

然后我就使用着RealmString,发现的确行得通,但是我使用Gson一解析后直接给报错了,这是为什么?当然摸摸屁股都能想得通,因为你的List(Stirng)不再是那个String了,那怎么办了?我又去搜了搜答案,这种常见的问题答案自然也容易找到,我们需要去自定义TypeAdapter

问题当然是解决了,但是此时我已经是火冒三丈,为什么在实体当中支持的类型在list当中就不能用了?一个这么常见的类型需要去花费这么长时间去解析?
我想想坑都踩了这么久,后面也不能就放弃了,当我后面用到Intent传值的时候又给我爆出一个bug,一万个草泥马在内心奔腾而过,这么坑的?activity直接传递bean是经常需要进行的操作,为什么又不行了?官方的建议不要传递整个RealmList或者RealmObject,而是传递对象的标识符,然后在接收方{Activity, Service, BroadcastReceiver等等}解析出这个标识符,然后利用Realm再次查询获得相应的结果。此时我无法形容他们的设计有多傻逼了,对于这个数据好感一扫而空。
好吧,都弄了这么久,当然还是选择原谅它了。当然前提是还能用的情况下,但当我删除一组包含RealmObject类型的数据的时候,我发现居然根元素删除了,但是RealmObject类型的子元素根本没有相应的删除,例如我现在获取到一堆微博数据,每条微博都包含了一个用户对象(RealmObject)。那么当我首先缓存下微博数据,再执行删除操作后,所有微博数据都删除了,但是用户数据却还缓存着,它没有mysql的那种关联属性。那么问题来了,如果你没有指定@PrimaryKey的话,每一次缓存数据都会重复记录一次,如果你指定了,它在判断的时候只会更具PrimaryKey来判断,你用户更新属性你都不知道。所以你如果不手动去关联删除的话,数据库会越来越大,完全无法想象。到目前我都没有找到任何解决这个问题的方案,不知道是别人没有发现还是我用法不对。看了下官方说法如下

至此我已经无言以对了,当然还有其他很多的坑,网上随便搜搜都能出来,以后做技术选型的时候多加谨慎,好在没有使用到正式项目当中。这个设计团队也算是傻逼当中的极致了,使用体验-100分。去你妈的Realm