새로운 정보가 도착했을 때 가장 오래된 요소를 삭제하여 가장 최근의 50 건의 정보 만 저장하기 위해 FIFO 테이블을 만들고 싶습니다. 나는 테이블에서 ID를 조작하여 그것을 할 수 있지만 그것이 최선의 해결책이라고 생각하지 않습니다. 잘하는 어떤 아이디어?안드로이드 애플리케이션을위한 SQlite로 FIFO 테이블 만들기
답변
FIFO 로직을 생성하기 위해 ID로 재생할 필요가 없습니다. 가장 좋은 방법은이 열과 관련하여 오름차순으로 레코드를 선택하는 데 도움이되는 현재 시간 스탬프를 자동으로 삽입하는 테이블에 DATETIME
이라는 다른 열을 추가하는 것입니다.
DateAdded DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
당신이 새로운 레코드를 삽입 이제까지 당신이이 테이블에 전체 레코드 COUNT
점검을 수행해야 할 때 확인하고 필요한 경우 DateAdded에 대한 가장 오래된 기록을 삭제 : 새 열은 무언가 같이해야합니다. 또한 가장 오래된 레코드를 삭제할 경우 LIMIT
및/또는 MAX
을 선택 쿼리에 사용할 수 있습니다.
테이블에 datetime 형식 열을 아직 포함하지 않은 경우 추가하고 각 삽입시 'now'로 설정하십시오. 그런 다음 각 삽입에서 모두를 50으로 설정하고 날짜별로 정렬하여 선택하십시오. 마지막 항목을 선택하고이 마지막 항목보다 오래된 항목을 모두 삭제하려면 삭제 쿼리를 실행하십시오.
sqlite를 사용해야합니까? 파일 처리를 사용할 수 있습니까? 간단한 Queue 개체를 사용하여 파일에 저장할 수 있습니다.
날짜 시간, 항목 정렬 및 기타 등등 대신 테이블의 첫 번째 행이 마지막으로 삽입되었다고 가정 할 수 있습니다.
db.insert
호출을하기 전에 콘텐츠 공급자의 insert(Uri uri, ContentValues cv)
에서 getCount()를 사용하여 해당 테이블의 항목 수를 쿼리하고 count> 50 인 경우 첫 번째 행을 삭제할 수 있습니다. 그런 다음 전화 걸기를 계속하십시오.
여기는 트랜잭션 목록에 대해 수행 한 작업이며 괜찮습니다. 새 항목을 삽입 할 때 카운트가 50 이상이면 그래서, 난 그냥 맨 마지막 항목을 삭제하면 내가 확인 :
// Adding new transaction
public void addTransaction(Transaction transaction) {
SQLiteDatabase db = this.getWritableDatabase();
if(getTransactionsCount() > 50){
List<Transaction> allTransactions = getAllTransactions();
Transaction oldestTransaction = allTransactions.get(allTransactions.size()-1);
deleteTransaction(oldestTransaction);
}
ContentValues values = new ContentValues();
values.put(KEY_TRANSACTION_UID, transaction.getUID());
values.put(KEY_TRANSACTION_AMOUNT, transaction.getAmount());
values.put(KEY_TRANSACTION_IS_ADD, transaction.getIsAdd());
// Inserting Row
db.insert(TABLE_TRANSACTIONS, null, values);
db.close(); // Closing database connection
}
그리고 getAllTransactions()는 내림차순으로 목록을 반환합니다 (아이디 기본 키 기준) :
// Getting All Transactions
public List<Transaction> getAllTransactions() {
List<Transaction> transactionList = new ArrayList<Transaction>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_TRANSACTIONS + " ORDER BY " + KEY_TRANSACTION_ID + " DESC";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Transaction transaction = new Transaction();
transaction.setID(Integer.parseInt(cursor.getString(0)));
transaction.setUID(cursor.getString(1));
transaction.setAmount(cursor.getString(2));
transaction.setIsAdd(cursor.getString(3));
// Adding contact to list
transactionList.add(transaction);
} while (cursor.moveToNext());
}
// return contact list
return transactionList;
}
- 1. 안드로이드 애플리케이션을위한 애니메이션 디자인
- 2. 안드로이드 애플리케이션을위한 Sqlite 스키마
- 3. C에서 FIFO 대기열 만들기
- 4. 전체 안드로이드 애플리케이션을위한 터치 이벤트
- 5. iPhone에서 SQLite로 임시 테이블 저장
- 6. sqlite로 즉시 테이블 가져 오기
- 7. DBD :: SQLite로 테이블 트리거를 만드는 방법은 무엇입니까?
- 8. 중첩 선택 안드로이드 SQLite로 복잡한 업데이트 질의
- 9. 코어 데이터를 SQLite로 변환
- 10. 양방향 FIFO
- 11. android : MySQL에서 SQLite로 변환
- 12. FIFO 검색을 사용한 컬렉션
- 13. SQLite로 충분합니까?
- 14. 테이블 만들기
- 15. 자바 애플리케이션을위한 모바일 광고 지원
- 16. 안드로이드 테이블
- 17. 멀티 플레이어 안드로이드 애플리케이션을위한 Java 서버 및 데이터베이스 설정 방법
- 18. SQLite로 복잡한 쿼리
- 19. 가벼운 Android 애플리케이션을위한 팁
- 20. 레일즈에서 PHP 애플리케이션을위한 인터페이스
- 21. 레일스 애플리케이션을위한 RESTfull 클라이언트
- 22. 레일즈 애플리케이션을위한 'Per X'로깅
- 23. SQLite로 데이터를 삽입하는 방법은 무엇입니까?
- 24. FIFO 세마포어 테스트
- 25. 아이폰에 이미지 용 FIFO
- 26. 내 메시지 대기열/fifo
- 27. FIFO 기반 큐 구현?
- 28. FIFO 내용을 출력하고 종료하십시오.
- 29. RichTextBox의 FIFO 메커니즘
- 30. FIFO 서버 프로그램
감사합니다. 비슷한 방법으로 코드를 최적화했습니다. – Shannon
좀 더 자세히 설명해 주시겠습니까? –