kanyun-inc/YTKKeyValueStore

通过 like 删除 指定前缀的数据会不会误伤

callmewhy opened this issue · 3 comments

在 YTKKeyValueStore 中的 DELETE语句,DELETE from %@ where id like ? 通过 like 删除指定前缀的数据,会不会有一些被误删除?

这个SQL是给 - (void)deleteObjectsByIdPrefix:(NSString *)objectIdPrefix fromTable:(NSString *)tableName;这个接口调用的,这个接口本意就是把一批拥有相同前缀的记录删掉。
如果使用者不合理的安排key,使得相同前缀的集合并不是他本身想要的子集,那应该是有可能误删的。

我查了一下,在我的应用中,我主要用这个方法来做一些缓存数据的删除。

在猿题库中,用户的草稿纸(以及用户标记)在用户交卷前一直有效,但是交卷后草稿就可以删除了。每于每张卷子,草稿可能有很多份。

所以我给草稿纸的表记录的key统一加上了试卷id当前前缀,然后就可以交卷后按前缀进行批量删除了,示例代码如下:

// 删除草稿纸信息
- (void)clearScratchDataOnExerciseId:(NSNumber *)exerciseId {
    NSString *prefixKey = [NSString stringWithFormat:@"%@-", exerciseId];
    [_userStore deleteObjectsByIdPrefix:prefixKey fromTable:UserScratchTable];
}

// 删除用户答题标记
- (void)clearExclusionMarkOnExerciseId:(NSNumber *)exerciseId {
    NSString *prefixKey = [NSString stringWithFormat:@"%@-", exerciseId];
    [_userStore deleteObjectsByIdPrefix:prefixKey fromTable:UserExclusionTable];
}

了解了,ID前缀需要做好控制