web-dev-qa-db-fra.com

Limitez le nombre de lignes dans une base de données de salle

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.

15
x10sion

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

16
Kunu

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.

15
Md. Sajedul Karim

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>);
   }
 }
1
M. Prokhorov

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

0
Amit Vaghela