早上一朋友问, EL如果支持删除某个课程, 还怎么能支持getPrev()和getNext()? 我很奇怪, 为啥不能呢? 他说, 因为EL的课程号是不连续的, 那么应该是靠连续的记录ID继续上下索引的, 那么当删除某个记录时, 导致ID不连续, 也就不能正常Navigate了, 是不? 除非删除后, 一个一个'搬', 以包装连续. 听他说完, 忽然感到轻松 -- 原来'笨蛋'不止我一个啊...
在实现EL对记录的getPrev()和getNext()时, 我也为EL的记录表中没有一个连续的记录ID而郁闷 -- 没有个连续ID, 而课程号本身又不连续, 咋不呢? 那时都还没考虑删除的问题呢. 郁闷地去睡觉, 半夜惊醒才想起, 没有连续记录ID就是设计是觉得这个ID跟课程号在一起太冗余才去掉的, 而getPrev()/getNext(), 完全靠课程号就能搞定的啊, 代码敲的都忘记自己的初衷了, SQL语句也白学了...
于是我把下面ELContentProvider的片段发给他, 并加了句 -- '你咋跟我一样笨呢...'
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
int res = matcher.match(uri);
String table =
null;
switch (res) {
case MATCH_ITEM_EL_ESL_RANDOM:
db = elDBAccess.getReadableDatabase();
table = "esl";
sortOrder = "random() limit 1";
break;
case MATCH_ITEM_EL_ESL_NEXT:
case MATCH_ITEM_EL_ESL_PREV:
case MATCH_ITEM_EL_ESL_FIRST:
case MATCH_ITEM_EL_ESL_LAST:
if (res == MATCH_ITEM_EL_ESL_NEXT) {
selection = "idx>" + ContentUris.parseId(uri);
sortOrder = "idx asc";
}
else if (res == MATCH_ITEM_EL_ESL_PREV) {
selection = "idx<" + ContentUris.parseId(uri);
sortOrder = "idx desc";
}
else if (res == MATCH_ITEM_EL_ESL_FIRST) {
selection =
null;
sortOrder = "idx asc";
}
else {
selection =
null;
sortOrder = "idx desc";
}
db = elDBAccess.getReadableDatabase();
return db.query("esl", projection, selection,
null,
null,
null, sortOrder, "1");
}
}
记录在此, 提醒自己保持清醒...