您如何将NSObject
转发为RLMObject
?
假设你有一个NSObject
类型的模型对象,并且说你想将它动态地转发为RLMObject
,你会怎么做?
值得一提的是,RLMObject
的属性无法在运行时填充,否则我可能会通过<objc/runtime.h>
完成此操作。 (我的意思是......他们在技术上可以......它只是太过分了)
我想做的事情:
这背后的主要目的是创建一个缓存框架,可以在可互换的缓存依赖项之间动态选择,例如Realm,SQLite,Core Data等。例如,我想有一个预处理器标志,希望从使用Realm切换到SQLite ,无需更改我的模型子类。
这将要求我的所有模型都是NSObject
的子类,只是因为RLMObject
在SQLite环境中没有意义。例如。
我一直在考虑这个问题,这是我的方法:
1)在运行时循环浏览NSObject
的属性&amp;创建它们的键/值对象
2)在运行时创建RLMObject
的子类,并从传递的NSObject
模型中复制属性列表
3)利用Realm&#39; initWithValue:
来填充属性
您的意见是什么?
答案 0 :(得分:0)
看起来你提到的这个方法 - RLMObject.initWithValue
或静态等价的createInDefaultRealmWithValue
必须在RLMObject子类上调用,否则会抛出异常:&#34;对象类型&# 39; RLMObject&#39;不是由Realm&#34 ;.
您需要一个动态模式创建API(RLMObject的基础),我不认为它是一个公共API。
另一种方法是将对象手动编码为某个字典或NSData,并将其附加到固定的RLMObject子类。
你可能会失去一些Realm功能,因为你没有继承RLMObject,比如知道对象何时变脏,但仍然可能取得一些成功。
我认为你会遇到与Core Data相同的问题。通常,Core Data仅支持NSManagedObject
个子类,而且它要求您在模型文件中预先定义固定模式(由代码NSManagedObjectModel
表示)。
当然,您可以将对象视为属性名称和值的字典,并将它们放入巨型(&#34;类型&#34;,&#34; id&#34;,&#34;属性&# 34;,&#34;值&#34;)表,但它不是最好的方法(可能很慢)。
使用SQLite后端可以实现相同的策略。有兴趣看看你会选择哪种架构。
我建议将键值存储看作后端,并避免使用SQL。或者将SQL视为键值存储,如(&#34; type + id&#34;,&#34; encoded_object_data&#34;):)