ios - 更新 RLMObject 的模型而不提交

标签 ios objective-c realm decoupling

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

我添加了当文本字段上的编辑结束时要触发的操作。该操作应该更新 RLMObject 的模型。

我尝试以下操作,其中 self.currentProfile 是我 View 的 RLMObject 属性:

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

我的 Realm 对象的类如下(为了简单起见,我删除了一些属性):

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

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

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

我不想将这些添加到我的 UITableViewController 类中,因为我已经将程序解耦以拥有中间数据访问层。在下面的代码中,我想将所有数据库事务放入我的 DataAccessServices 层中。有替代解决方案吗?我不是 Realm 专家,而且是个新手。我想指出的是,我需要导航到此 View 中的另一个 View ,并在另一个 View 中拥有其他 Realm 事务。如果我在转向新 View 时仍在编辑 - 即我将嵌套 beginWriteTransactions,这会导致问题吗?

提前致谢。

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

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    if([self.tableView isEditing]){
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm cancelWriteTransaction];
    }
    NSLog(@"gone...");
}

//Edit Mode --------------------------------
- (IBAction)enterEditMode:(id)sender {
    if ([self.tableView isEditing]) { //Turn off Edit Mode
        [self.tableView setEditing:NO animated:YES];
        [self.editButtonItem setTitle:@"Edit"];

        [DataAccessServices saveProfile:self.currentProfile];
        [self reloadSections];

        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm commitWriteTransaction];
    }
    else {// Turn on edit mode
        [self.editButtonItem setTitle:@"Done"];
        [self.tableView setEditing:YES animated:YES];
        [self reloadSections];
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
    }
}

最佳答案

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

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];

希望有帮助:)

关于ios - 更新 RLMObject 的模型而不提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990512/

相关文章:

ios - NSMutableString stringWithString 使应用程序崩溃

ios - 在一个 TableViewController 中显示两组结果

swift - 如何减少存储在 Realm 中的嵌套对象的可变性?

swift - 在 Swift 中使用带有 CocoaPods 的静态库对于 Realm 失败

ios - 如何在快速点击按钮时从第二个 View Controller 调用第一个 View Controller 功能?

ios - 为什么不写optional mark就可以声明一个变量?

ios - AVPlayer的addPeriodicTimeObserverForInterval中的CMTime : callback never reaches item's duration

iOS 8 在 UVManager.m 中崩溃,这不是我的类(class)之一

ios - 仅在选中时出现的选择器轮

swift - Realm Swift 多对多逆向关系