IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

SQLite supprimer données dupliquées


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut SQLite supprimer données dupliquées
    Bonjour,

    J'ai la Tbale suivante: table_news contenant ces champs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     ROWID = INTEGER PRIMARY KEY AUTOINCREMENT 
     
        ID = TEXT NOT NULL 
     
        CONTENT = TEXT NOT NULL
     
        ZONE TEXT = NOT NULL 
     
        AREA TEXT = NOT NULL
     
        TITLE TEXT = NOT NULL
     
        DATE TEXT = NOT NULL
     
        AUTHOR TEXT = NOT NULL
    Elle est remplit comme ceci:

    1st Row:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     ROWID ==> 1
     
        ID ==> "5"
     
        CONTENT ==> "Discover New York."
     
        ZONE ==> "New York"
     
        AREA ==> "New York"
     
        TITLE ==> "Let's discover the world."
     
        DATE ==> "2012-07-04"     
     
        AUTHOR ==> "Henry Brakman"
     
    2nd Row (same but with ROWID field setted to 2):
     
     
     
        ROWID ==> 2
     
        ID ==> "5"
     
        CONTENT ==> "Discover New York."
     
        ZONE ==> "New York"
     
        AREA ==> "New York"
     
        TITLE ==> "Let's discover the world."
     
        DATE ==> "2012-07-04"     
     
        AUTHOR ==> "Henry Brakman"
    Je veux faire un sqlstatement qui va me supprimer les donnees redondantes (qui ont le meme ID par exemple).

    J'ai essaye cela mais ca ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public SQLiteStatement removeSameContentNews()
    	{
    		return bdd.compileStatement("DELETE FROM table_news WHERE ROWID NOT IN (SELECT MIN( ROWID) FROM table_news GROUP BY ID, CONTENT, ZONE, AREA, TITLE, DATE, AUTHOR)");
    	}
    Merci de m'aider les amis.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Pourquoi ne pas éradiquer le problème à sa source ?
    Je veux dire par là, pourquoi n'as tu pas mis une contrainte d'unicité sur l'ID ?

  3. #3
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Comment faire ?? ca m'interesse !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Voilà le schéma

    En gros, je te conseille d'utiliser le mot clé PRIMARY KEY

  5. #5
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Je ne comprend rien a ces schema,

    voici la requete de ma creation de table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private static final String CREATE_TABLE_NEWS = "CREATE TABLE "+ TABLE_NEWS + " (" + COLUMN_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_ID + " TEXT NOT NULL, "+ COL_CONTENT +" TEXT NOT NULL, "+ COL_ZONE + " TEXT NOT NULL, "+ 
    	COL_AREA + " TEXT NOT NULL, "+ COL_TITLE + " TEXT NOT NULL, "+ COL_DATE + " TEXT NOT NULL, " + COL_AUTHOR +" TEXT NOT NULL);";
    Que dois je modifier pour eviter la redondance et creer l'unicite sur le champs ID?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Ben en fait il y a quelque chose qui m'échappe dans ta structure de données. A quoi correspond la champ ROWID ?
    Celui ci est déjà unique alors pourquoi vouloir rajouter un champ ID ?

  7. #7
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Le champ ROWID correspond a mon champs primaire pour compter les lignes en interne et l'ID est généré par mon webservice.

    Une idee pour l'unicite ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Mais concrètement il te sert à quoi ce champ ROWID ?

    Car si tu veux connaitre le nombre de lignes de données, il te suffit juste de faire un SELECT COUNT(*) FROM TA_TABLE

  9. #9
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    J'ai une methode getNewsbyRowid(String index) qui me renvoi un objet News au l'index que je lui passe.

    Je fais boucler cela dans une situation particuliere (pas internet sur le mobile) pour recuperer dans l'ordre les donnees de mon webservice stockees en base interne puisque les champs ID ne se suivent pas..

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Bon je pense que tu n'utilise pas la bonne approche pour récupérer tes données. Mais là n'est pas le débat.
    Pour utiliser la clause UNIQUE regarde ici ou la

  11. #11
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Merci Beaucoup Simon j'ai donc utilise le mot clef UNIQUE dans ma creation de table et cela marche parfaitement et m'evite d'ecrire et de supprimer dans ma table !!



    Voici l'exemple de ma creation de table pour ceux qui ne savent pas comment implementer l'unicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private static final String CREATE_TABLE_NEWS = "CREATE TABLE "+ TABLE_NEWS + " (" + COLUMN_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_ID + " TEXT NOT NULL UNIQUE, "+ COL_CONTENT +" TEXT NOT NULL, "+ COL_ZONE + " TEXT NOT NULL, "+ 
    	COL_AREA + " TEXT NOT NULL, "+ COL_TITLE + " TEXT NOT NULL, "+ COL_DATE + " TEXT NOT NULL, " + COL_AUTHOR +" TEXT NOT NULL);";

  12. #12
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Attention aussi... sur ROWID

    ROWID est un identifiant 'integer' en autoincrement....

    Mais quand tu détruis une row, ca ne décalle pas les ROWID des autres....
    Donc cela ne correspond absolument pas à un index !

    D'ailleurs quand on spécifie dans une table "TOTO INTEGER PRIMARY KEY AUTOINCREMENT" tout ce qu'il fait c'est de donner à ROWID un alias "TOTO"...

    ROWID c'est l'identifiant unique d'une row dans ta table.
    ID c'est l'identifiant unique d'une row sur le serveur

  13. #13
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Comment utiliser un index qui decalera tout parfaitement si je delete ?
    En gerant l'incrementation dans mon instanciation d'objets que contient la table ?!

    "ROWID c'est l'identifiant unique d'une row dans ta table.
    ID c'est l'identifiant unique d'une row sur le serveur"

    Oui je le sais, c'est bien pour ca que j'ai cree un ROWID pour ma base locale.

  14. #14
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non mais ROWID est toujours créé pas besoin de le créer soit même....
    Et quand on définit une colonne "INTEGER PRIMARY KEY AUTOINCREMENT", cette colonne devient même un ALIAS du ROWID et il y a quelques endroit ou Android apprécie d'avoir "_ID" comme alias du ROWID.

    Il est impossible d'avoir un "index" dans une table relationnelle, sauf par le truchement de "trigger" (onDelete: update TABLE set INDEX=INDEX-1 where INDEX>:old.INDEX, onInsert: :new.INDEX=select max(INDEX+1) from TABLE) qu'ils soient fait automatiquement, ou à la main.

    Mais dans tous les cas, c'est complètement inutile en SGBD (R ou non), et cela va à l'encontre des principes de SGBD (la gestion de transactions / rollback avec ce genre de colonne est quasi impossible à gérer).

    Donc si tu nous expliquais pourquoi tu voudrais un tel index.... ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/01/2009, 10h56
  2. ajouter données sans supprimer données existantes
    Par grimat dans le forum Débuter
    Réponses: 1
    Dernier message: 04/01/2009, 21h42
  3. Réponses: 1
    Dernier message: 04/01/2009, 17h41
  4. ADO Excel, Supprimer Données dans Fichier Fermé
    Par vaucluseimmo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/08/2008, 19h20
  5. methodologie pour Supprimer données dans base de données
    Par elkhy dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 26/04/2006, 18h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo