让SQLite只存储最新的50个 - Android!

时间:2011-05-10 14:36:00

标签: android sqlite

我的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;
    }
}

任何想法如何才能做到最好?

3 个答案:

答案 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,而不是 列保持正确的顺序。