2011-05-10 3 views
0

안드로이드 앱에 50 개의 최신 텍스트 만 저장해야하는 테이블이 있습니다. 테이블이 ID 50에 도달하면 이전 테이블을 삭제하고 새 테이블을 삽입하기를 원합니다.SQLite가 최신 50 가지만 저장하도록하십시오 - Android!

나는 새로운 것을 삽입 할 때 1의 ID로 놓고 다른 모든 것을 한 단계 아래로 가게하는 것이 가장 좋을 것이라고 추측하고 있습니다. 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

얼마나 자주 상위 50 개를 업데이트 하시겠습니까? – Ian

+0

트리거는 2.2 이상에서만 작동하는 것으로 나타납니다. – Femi

답변

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

이것을 달성하는 좋은 방법은 sql lite에서 사용할 수있는 트리거를 사용하는 것입니다. 테이블에 삽입하기 전에 트리거를 정의하십시오. 이미 50 개의 항목이있는 경우 테이블에서 가장 낮은 ID를 가져 와서 해당 행을 삭제하십시오.

그런 다음 시스템에서 처리해야하는 자동 증가 ID를 엉망으로 만들고 싶지 않습니다. 내가 제안한 해결책은 ID를 업데이트 할 필요가 없다.

1

트리거 접근 방식은 항상 과거에 사용했던 것입니다, 그러나 게리 스나이더는 관련 질문에 대한 SQLite는 메일 링리스트에이 좋은 솔루션을 제안 열에는 UNIQUE ON CONFLICT REPLACE 제약 조건이 있습니다. 그런 다음 얼마나 많은 항목이 충분한 지 계산 한 후 (maxcount) 각 열을 삽입하여 해당 열을 mod((lastinsertrowid()+1),maxcount)으로 지정하거나 계수 또는 나머지를 지정하십시오. 이 열은 maxcount에 도달하면 그냥 돌아갑니다. 그리고 당신은 올바른 순서로 물건을 유지하기 위해 그 row가 아니라 칼럼을 기반으로 추출한다.

관련 문제