我的Android应用程序中有一张表,只能存储50个最新文本,仅此而已。 当表格的ID达到50时,我希望它删除旧的,只插入新的。
我猜测最好是当我插入新内容时,它会将ID设为1并使其他所有内容向下移动一步。 ID 1将成为ID 2等,新文本将是ID 1。 虽然这是猜测。但它应该只存储最新的50个,以及其他一切要删除的内容。
这是我创建表格的方式:
private final String CreateTable = "CREATE TABLE " +
SqConstants.TABLE_LOCAL + " (" +
SqConstants.EXTERNAL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
SqConstants.TEXT + " TEXT NOT NULL, " +
SqConstants.TIME + " TEXT NOT NULL, " +
SqConstants.IMAGE_URL + " TEXT NOT NULL, " +
SqConstants.USER + " TEXT NOT NULL, " +
SqConstants.LONG_EXT + " LONG NOT NULL);";
这是将其插入数据库的方法:
public long insert(
String text,
String time,
String imageUrl,
String user,
long ExtLong) {
try {
ContentValues cv = new ContentValues();
cv.put(SqConstants.TEXT, text);
cv.put(SqConstants.TIME, time);
cv.put(SqConstants.IMAGE_URL, imageUrl);
cv.put(SqConstants.USER, user);
cv.put(SqConstants.LONG_EXT, id);
return dataBase.insert(SqConstants.TABLE_LOCAL, null, cv);
} catch(SQLiteException ex) {
Log.e(TAG, "FAILED TO PUT INTO CONTENTVALUES. Exception: " + ex.getMessage());
return -1;
}
}
任何想法如何才能做到最好?
答案 0 :(得分:2)
实现这一目标的一个很好的方法是使用sql lite中提供的触发器。在表上插入之前定义触发器。如果已有50个项目,则从表格中获取最低的ID,然后删除其行。
然后,我不确定你是否想要弄乱自动增量ID,因为它应该由系统处理。我提出的解决方案不需要更新ID。
答案 1 :(得分:2)
是的,触发器就是你的解决方案。如下所示:
db.execSQL("CREATE TRIGGER fifty_rows AFTER INSERT ON "+ SqConstants.TABLE_LOCAL +
" BEGIN DELETE FROM "+ SqConstants.TABLE_LOCAL +" WHERE " +
SqConstants.EXTERNAL_ID +" IN (SELECT "+SqConstants.EXTERNAL_ID+" FROM " +
SqConstants.TABLE_LOCAL +" ORDER BY "+SqConstants.EXTERNAL_ID+" DESC LIMIT 50,
-1);END;");
答案 2 :(得分:1)
触发器方法是我过去一直使用的方法,但是Gerry Snyder刚刚在SQLite邮件列表上提出了这个很好的解决方案,用于相关的查询:
添加一个带有UNIQUE ON CONFLICT REPLACE
约束的整数列。然后,在确定了足够多的条目(maxcount
)之后,插入每一行,将该列指定为mod((lastinsertrowid()+1),maxcount)
,或者指定模数或余数。当该列点击maxcount
时,该列将会回滚;你提取基于rowid,而不是
列保持正确的顺序。