Comment puis-je limiter le nombre de lignes dans une Android par en supprimant l'élément le plus ancien de la ligne et en insérant le plus récent?
Je suppose que c'est une requête standard lors de l'ajout d'un élément à la base de données?
EDIT: Je veux limiter une table de base de données pour avoir un nombre de lignes maximum de disons 20. Si cette limite est atteinte, nous supprimons l'élément le plus ancien et insérons le nouveau en gardant le nombre de lignes actuel à 20.
Je pense que vous pouvez insérer les données dans votre tableau puis supprimer toutes les lignes sauf les 20 dernières (limite)
Pour supprimer, vous pouvez utiliser la requête suivante
DELETE FROM tableName où id NOT IN (SELECT id from tableName ORDER BY id DESC LIMIT 20)
Dans ce cas, id est la clé primaire qui est définie sur l'incrémentation automatique. Vous pouvez également utiliser la date comme clé si vous les stockez par date
Voici un exemple de solution:
La requête est:
@Query("SELECT * FROM user LIMIT :limit OFFSET :offset")
User[] loadAllUsersByPage(int limit,int offset);
Ici, il donnera une liste d'utilisateurs basée sur la limite et le décalage.
si loadAllUsersByPage(2,0)
il retournera les 2 premières lignes de la table.
si loadAllUsersByPage(2,1)
il retournera les 2e et 3e lignes du tableau.
mais si loadAllUsersByPage(-1,10)
alors il servira les 10 premières lignes du tableau.
En supposant:
Votre table est
create table example_table (
ts timestamp,
uid number(19),
some_other_field varchar(64)
);
Et vous ne voulez pas vous soucier d'exécuter une requête manuellement.
Utilisez des déclencheurs de base de données:
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;
La syntaxe "Offset sans limite" est inspirée de cette réponse .
Pour activer votre déclencheur en Java:
Android simple, où vous pouvez remplacer SQLiteOpenHelper
:
public class DataBaseSchemaHelper extends SQLiteOpenHelper {
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(<trigger string from above>);
}
}
Version de la salle Android:
public MyDatabase extends RoomDatabase {
@Override
public void init(DatabaseConfiguration _config) {
super.init(_config);
getOpenHelper().getWritableDatabase().execSQL(<trigger string from above>);
}
}
Suivez ces étapes:
1> obtenir le nombre de lignes de cette table
your_count = SELECT count( * ) FROM table_name;
2> si le nombre est> (supérieur à) 20 que pour obtenir l'enregistrement le plus ancien
SELECT *
FROM table_name
ORDER BY entry_Date ASC
LIMIT 1;
3> maintenant supprimez ces enregistrements sélectionnés
4> insérer de nouvelles données
REMARQUE: si vous insérez plusieurs entrées, mettez-les en boucle