在不提交的情况下更新RLMObject的模型

时间:2015-11-30 02:15:39

标签: ios objective-c realm decoupling

基本上,我有一个UITableView,其中的单元格具有与RLMObject中的属性(比如10个属性)对应的UITextField。我只允许用户在编辑模式下编辑字段(通过。禁用用户交互)。如果用户按下Done,我希望将RLMObject提交到数据库。

我添加了当editField上的Editing Did结束时要触发的动作。该操作应更新RLMObject的模型。

我尝试以下方法,其中self.currentProfile是我视图的RLMObject属性:

sed '1s/^/<column names>\
&/' file.csv

My Realm Object的类如下(为简单起见,我已经采用了一些属性):

 - (BOOL) profileTextFieldDidChange:(UITextField *)textField
{
        self.currentProfile.name = textField.text; //crashes here
        return YES;
}

我从上面的代码中收到以下错误消息: 由于未捕获的异常'RLMException'而终止应用程序,原因是:'尝试修改写事务之外的对象 - 首先在RLMRealm实例上调用beginWriteTransaction。'

以前的解决方案声明我应该在更改之前添加callBeginWriteTransaction,并提交或取消,具体取决于用户是否退出并取消编辑或按下完成并将新配置文件提交到数据库。

我不想在我的UITableViewController类中添加这些,因为我已经将程序解耦为具有中间数据访问层。在下面的代码中,我想在DataAccessServices层中抛出所有数据库事务。有替代解决方案吗?我不是Realm专家,而且很新。我想要注意,我需要导航到此视图中的另一个视图,并在另一个视图中具有其他领域事务。如果我在编辑新视图时仍在编辑 - 那就是我会嵌套beginWriteTransactions,这会导致问题吗?

提前致谢。

我不满意的当前解决方案如下:

@interface Profile : RLMObject
@property (nonatomic) NSString * profileId; // primary key
@property (nonatomic) NSString * name;
@property (nonatomic) NSString * color;
-(id) initWithPrimaryKey;
@end

1 个答案:

答案 0 :(得分:2)

据我所知,您正在尝试更新现有记录的数据。 根据{{​​3}},您可以使用现有记录的主键初始化新对象,如下所示。

Profile *myWriteableProfile = [[Profile alloc] initWithValue:self.currentProfile];
    myWriteableProfile.name = @"Dummy Name!"; // No Exception will be thrown! :)

    RLMRealm *realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    [Profile createOrUpdateInRealm:realm withValue:myWriteableProfile];
    [realm commitWriteTransaction];

希望有所帮助:)