Как мне выполнить операции триггера событий с помощью "DBAccess" iOS ORM

Я использую каркас DBAccess v1.6.12 с Xcode 7.1.1.

Я хотел бы использовать триггер события, когда INSERT, UPDATE или DELETE строки, как:

  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 без изменения информации.

1 ответ

Решение

Для перехвата событий, как вы хотите, вы бы использовали следующие методы:

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

}
Другие вопросы по тегам