2017-09-13 13 views
0

Androidルームデータベースの行数を制限する方法行の中で最も古いアイテムを削除し、最新のものを挿入するルームデータベースの行数を制限する

アイテムをデータベースに追加する際に標準クエリを推測していますか?

EDIT:最大行数が20になるようにデータベーステーブルを制限したい場合は、最も古い項目を削除し、現在の行数を20にして新しい項目を挿入します。

+0

は、あなたがしたい...あなたが欲しいものを説明データベースの行に制限を設定し、新しいデータを追加したいときにすべての行に古いデータがある場合は、データベースに最初の行の新しいデータを追加しますか?またはデータを設定する特定の行を選択しますか? –

+0

@MohamedNagyMostafa edit – x10sion

+0

okey ..を参照してください。私はあなたが最初に行うことができる2つの方法について考えています。新しいデータを1から20まで連続的に挿入するテクニックを教えてください。それはあなたのプログラム中に行を削除しようとしていない良い方法です。任意の行を削除した場合、最良のアルゴリズムは、削除された行に新しいデータを設定することです。 プログラムで行を削除している場合は、日付を挿入する列を使用する必要があります。次に、並べ替え順にデータを取得してチェックできます。 あなたのためにどちらが良いかを教えてください。詳しくは –

答えて

0

は、この手順に従います。

1>カウントは最も古い記録に取得する>より20(より大きい)であれば、そのテーブル

your_count = SELECT count(*) FROM table_name; 

2>の行数を取得

SELECT * 
    FROM table_name 
ORDER BY entry_Date ASC 
LIMIT 1; 

3>今これらの選択されたレコードが

4>新しい件のデータ

を挿入、削除

注:複数のエントリを挿入する場合、ループでこれを置くよりも、

+0

を確認してください。答え更新@ x10sion –

0

は、私はあなたがにデータを挿入することができると思いますあなたのテーブルは、その後、最後の20(制限)を除くすべての行を削除します

削除するには、次のクエリを使用することができます

この場合ID NOT IN(IDのDESCのLIMIT 20によってtableNameの順序とIDを選択)

tableNameのFROM DELETE、IDが自動インクリメントに設定されているプラ​​イマリ・キーです。

あなたのテーブルが

create table example_table (
    ts timestamp, 
    uid number(19), 
    some_other_field varchar(64) 
); 

され、手動でいくつかのクエリを実行している気にする必要はありません:あなたはと仮定すると、日付

+1

OPは25行以上*を保持しようとしましたが、実際には* 25行まで削除*します。 –

+0

ありがとう、私は私の答えを更新しました。 – Kunu

0

によってそれらを格納している場合は、同様にキーとして日付を使用することができます。

使用データベースはトリガー:

create trigger 
    if not exists -- I don't actually know if you DB will support this line. 
       -- Might want to remove it if it's not. 
example_table_limiter 
on example_table 
after insert 
begin 
    delete 
    from example_table 
    where ts in (
    select ts 
    from example_table 
    order by ts 
    limit -1 -- we don't want to limit how many rows we want to delete 
    offset 25 -- but we want to offset query result so it leaves 25 rows in table 
); 
end; 

構文はthis answerに触発された "制限なしオフセット"。 Javaであなたのトリガーを有効にするには

:あなたはSQLiteOpenHelperを上書きすることができ

シンプルアンドロイド、:

public class DataBaseSchemaHelper extends SQLiteOpenHelper { 
    @Override 
    public void onCreate(SQLiteDatabase db) {  
    db.execSQL(<trigger string from above>); 
    } 
} 

のAndroid館内バージョン:

public MyDatabase extends RoomDatabase { 
    @Override 
    public void init(DatabaseConfiguration _config) { 
    super.init(_config); 
    getOpenHelper().getWritableDatabase().execSQL(<trigger string from above>); 
    } 
} 
+0

imは、SQLデータベース – x10sion

+1

@ x10sionを処理するためにAndroid Roomを使用していますが、ちょっと別の場所でもまだ実行できます。私はそれを私の答えに加えます。 –

+0

@ x10sion、それはあなたのために働いたのですか? (私はRoom自身に本当に精通していない)。 –

関連する問題