1

我正在使用带有 Xcode 7.1.1 的 DBAccess 框架 v1.6.12。

我想在插入、更新或删除如下行时使用事件触发器:

  1. 现有特定时期数据的“最长”参数变为“否”。
  2. 找到具有最长“文本”的行。
  3. 将其行的“最长”参数更改为“是”。

代码图片:

@interface NoteModel : DBObject
@property uint32_t dateYMD; // not unique
@property BOOL longest; // default value is NO
@property NSString *text;
@end

- (void)test {
    NoteModel *obj = [NoteModel new];
    obj.dateYMD = 20151201;
    obj.text = @"hoge";
    [obj commit]; //< HERE I want to fire the event trigger
}

DBObject#entityWillInsert 只是返回 BOOL 值而不更改信息。

4

1 回答 1

0

要根据需要拦截事件,您将使用以下方法:

- (BOOL)entityWillInsert;
- (BOOL)entityWillUpdate;
- (BOOL)entityWillDelete;
- (void)entityDidInsert;
- (void)entityDidUpdate;
- (void)entityDidDelete;

从您的示例中,虽然我可能不太清楚您的要求,但我会使用 entityWillInsert/Update 方法来查询可能更长的其他对象,然后您可以相应地更新最长的标志。

在半伪代码中,它看起来像这样:

- (BOOL)entityWillInsert {

    // see if we have any existing records with a longer text field
    self.longest = [[[NoteModel query] whereWithFormat:@"length(text) > length(%@)", self.text] count] ? NO:YES;

    // now if this is to be the longest then we will need to ensure that the current record is updated too.
    if(self.longest) { 
       for (NoteModel* r in [[[NoteModel query] where:@"longest = 1"] fetch]) {
            r.longest = NO;
           [r commit];
       }
    }

    // you must return yes to ensure the ORM knows to complete the action
    return YES;

}
于 2015-12-04T09:48:43.157 回答