• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 17:28:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

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

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

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

@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)viewWillDisappearBOOL)animated{
    [super viewWillDisappear:animated];
    if([self.tableView isEditing]){
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm cancelWriteTransaction];
    }
    NSLog(@"gone...");
}

//Edit Mode --------------------------------
- (IBAction)enterEditModeid)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];
    }
}



Best Answer-推荐答案


据我了解,您正在尝试更新现有记录的数据。 根据 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap