将NSObject转换为RLMObject以将其保存到领域数据库

时间:2018-03-16 03:25:06

标签: ios objective-c error-handling realm

因为我想从我的主模型中获得一个单独的RLMObject 我创建了两个独立的模型:

#import <Foundation/Foundation.h>

@interface Story: NSObject

@property(nonanatomic, strong) NSString *title;

@end

和另一个将Story对象保存到Realm数据库的模型:

#import "RLMObject.h"
#import <Realm/Realm.h>

@interface StoryStorage : RLMObject

@property NSString *title;

@end

在MainController中,我从服务器获取故事并将它们添加到Story对象数组中。

然后我通过indexPath.row将一个故事对象传递给DetailController并在那里显示它的数据。 我也可以选择将该对象添加到Realm Database。

为此,我创建了一个函数:

-(void)addToDatabaseStory: (StoryStorage *)story {
        [self.realm beginWriteTransaction];
        [self.realm addObject:story];
        [self.realm commitWriteTransaction];
}

当编译器到达

[self.realm addObject:story];

它会抛出错误:

    *** Terminating app due to uncaught exception
 'NSInvalidArgumentException', reason: '-[Story isInvalidated]:
 unrecognized selector sent to instance 0x60400028eb00'

您能否告诉我如何在RealmDatabase中添加和删除对象? 当我从Realm中删除该对象时只有一个对象作为RLMObject时,它会抛出一个错误&#34;该对象被删除并失效&#34;。

仅从RealmDatabase删除对象的更好方法是什么,但仍然将其保留在模型中以便在UI中显示?

1 个答案:

答案 0 :(得分:2)

我理解您希望将存储机制与模型类和UI分开,但您需要将Realm视为不仅仅是存储机制。它真正意味着是直接与UI连接的模型类。例如,它的通知系统非常适合直接与UITableViewController的插入/删除/更改行进行交互。

因此,当您深入了解Realm时,您会很快后悔尝试将其降级到应用程序的存储端。让它 用于你的应用程序的模型类,或至少那些需要持久性的模型类!您尝试进行的所有转换将导致1)获取许多不需要获取的领域对象(减慢您的应用程序和/或浪费大量内存),以及2)您将风不利用Realm的通知系统和3)大量的额外代码和复杂性(因此也可能存在很多错误)。

至于你的具体问题,你没有展示你是如何将Story转换为StoryStorage的,但是你做的那样肯定是错的,因为当你调用领域的addObject时,它永远不能抱怨故事对象。它应该对Story对象一无所知(根据错误“Story isInvalidated”)。 Story对象的标题应该已经被映射到StoryStorage对象的标题,其方式是稍后不会调用Story。

无论如何,这是没有意义的,因为我认为你正试图让Realm对象与非Realm对象保持同步。 (如果你要为你的许多模型做到这一点,你也可以切换到CoreData,因为你很少使用Realm提供的东西 - 你最终将不得不用很多东西弥补它自定义代码)。希望这有帮助!