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 :

Gestion Base de données SQLite


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 23
    Points : 12
    Points
    12
    Par défaut Gestion Base de données SQLite
    Bonjour à tous,

    Je voudrais créer une application pour m’entraîner avec une bonne base de données SQLite (Plusieurs tables seront liées entre elles).

    Voici quelques caractéristiques de ma BDD:
    -Lors de la création des tables, des données seront ajoutées de base mais l'utilisateur pourra en rajouter grâce à l'application.
    -C'est une application avec plusieurs activités et elles servent presque tous à ajouter, modifier ou lire des données.
    -Mon application aura des modifications de la base de données dans quelques mois mais les utilisateurs ont ajouté des données qui ne faut surtout pas supprimer lors de la mise a jour (imaginons que je commercialise mon application... ) .

    Je poste donc sur ce forum pour vous demander des conseils et des exemples (surtout des exemples ) pour gérer plusieurs tables proprement, j'ai fouillé sur le net mais je n'ai trouvé que des informations pour une seule table :'(.

    Merci d'avance pour votre aide,
    Bonne soirée

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Points : 134
    Points
    134
    Par défaut
    Voici un tuto qui traite du sujet sqlite avec plusieurs tables. Si tu rencontres des problèmes au cours tu peux revenir poster ce qui te bloque. Prends la peine le soin et le temps de le comprendre. Autrement tu trouveras pas ici de solutions prémâchées.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Salut et merci pour ta réponse Mstreatboy,

    J'ai regardé ton lien mais imaginons que j'ai 10 tables, si j'écris tous dans une seule classe comme indiqué, ça risque de faire un peu brouillon :s

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Points : 134
    Points
    134
    Par défaut
    Qu'est ce qui t'empêche ensuite de créer autant de classes métiers (classes DAO) que tu le souhaites pour séparer tes traitements si tu comprends le paradigme des db avec SQLlite?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Alors en fait tu me conseil de faire un truc dans ce genre


    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
    36
    37
    38
    39
    40
    41
    42
     
    public class DatabaseHelper extends SQLiteOpenHelper {
     
        private static final int DATABASE_VERSION = 1;
        private static final String DATABASE_NAME = "TEST";
     
    	private Table1 table1;
    	private Table2 table2;
    	private Table3 table3;
     
        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
    		table1 = new Table1(this);
    		table2 = new Table2(this);
    		table3 = new Table3(this);
        }
     
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(Table1.CREATE_TABLE);
            db.execSQL(Table2.CREATE_TABLE);
            db.execSQL(Table3.CREATE_TABLE);
        }
     
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + Table1.TABLE);
            db.execSQL("DROP TABLE IF EXISTS " + Table2.TABLE);
            db.execSQL("DROP TABLE IF EXISTS " + Table3.TABLE);
            onCreate(db);
        }
     
    	public Table1 getTable1() {
    		return table1;
    	}
     
    	public Table2 getTable2() {
    		return table2;
    	}
     
    	public Table3 getTable3() {
    		return table1;
    	}
    }

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public class Table1 { 
    	private static final String TABLE_TODO = "todos";
    	private static final String KEY_ID = "id";
    	private static final String KEY_CREATED_AT = "created_at";
    	private static final String KEY_TODO = "todo";
        private static final String KEY_STATUS = "status";
     
    	private static final String CREATE_TABLE= "CREATE TABLE "
                + TABLE_TODO + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TODO
                + " TEXT," + KEY_STATUS + " INTEGER," + KEY_CREATED_AT
                + " DATETIME" + ")";
     
    	private DataBaseHelper m_dbh;
     
    	public Table1(DataBaseHelper dbh) {
    		m_dbh = dbh;
    	}
     
    	public long createToDo(Todo todo, long[] tag_ids) {
            SQLiteDatabase db = m_dbh.getWritableDatabase();
     
            ContentValues values = new ContentValues();
            values.put(KEY_TODO, todo.getNote());
            values.put(KEY_STATUS, todo.getStatus());
            values.put(KEY_CREATED_AT, getDateTime());
     
            // insert row
            long todo_id = db.insert(TABLE_TODO, null, values);
     
            // insert tag_ids
            for (long tag_id : tag_ids) {
                createTodoTag(todo_id, tag_id);
            }
     
            return todo_id;
        }
     
        public Todo getTodo(long todo_id) {
            SQLiteDatabase db = m_dbh.getReadableDatabase();
     
            String selectQuery = "SELECT  * FROM " + TABLE_TODO + " WHERE "
                    + KEY_ID + " = " + todo_id;
     
            Cursor c = db.rawQuery(selectQuery, null);
     
            if (c != null)
                c.moveToFirst();
     
            Todo td = new Todo();
            td.setId(c.getInt(c.getColumnIndex(KEY_ID)));
            td.setNote((c.getString(c.getColumnIndex(KEY_TODO))));
            td.setCreatedAt(c.getString(c.getColumnIndex(KEY_CREATED_AT)));
     
            return td;
        }
    }
    ps: Je n'ai pas testé ce code, j'ai juste modifié le code du lien que tu m'as donné.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Puis a chaque update ou select, utiliser la méthode getWritableDatabase() ou getReadableDatabase() n'est pas très optimiser car ces méthodes ferment l’accès à la base (si elle est déjà ouverte) et recréer un accès.
    Elles prennent donc un certain temps à s’exécuter.

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Points : 134
    Points
    134
    Par défaut
    Quel est l'intérêt de garder active une connexion à ta base quand tu finis tes traitements. Bref voici un code que j'ai écrit moi mm. J'espère que cette fois ça t'éclaircira. (désolé pr le délai des réponses j'ai été indisponible)


    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
    public class DbHelper extends SQLiteOpenHelper{
     
    	public DbHelper(Context context) {
    		super(context, "meetme.db", null, 1);
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		db.execSQL("Create Table if not EXISTS Contact (idcontact text not null, pseudo text null, badgepic text null, statut text null, lagitude )");
    		db.execSQL("Create table if not EXISTS Message(body text null, direction text not null, owner text not null, datemessage integer null)");
    		db.execSQL("Create table if not EXISTS Typepreference(idtypepref int not null, libtypepref text)");
    		db.execSQL("Create table if not EXISTS Preference(idpreference int not null, libpreference text)");
    	}
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
     
    		db.execSQL("Drop table if EXISTS Contact");
    		db.execSQL("Drop table if EXISTS Message");
    		db.execSQL("Drop table if EXISTS Preference");
    		db.execSQL("Drop table if EXISTS Typepreference");
    		onCreate(db);
     
    	}	
    }
    Ensuite pour tes traitements métier:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    public class Db {
    	Context ctx;
    	SQLiteDatabase db;
    	DbHelper dbh;
     
     
     
     
     
    	public Db(Context ctx){
    		this.ctx = ctx;
    		this.dbh = new DbHelper(ctx);
    	}
     
    	public Db open(){
     
    		this.db = dbh.getWritableDatabase();
    		return this;
    	}
     
    	public void close(){
    		if (db.isOpen())
    			db.close();
    	}
    //Méthode pour ajouter un message dans la base de données
    	public void addMessage(Message msg){
     
    		ContentValues message = new ContentValues();
    		message.put("body", msg.getBody());
    		message.put("direction", msg.getIsIncoming().toString());
    		message.put("owner", msg.getOwnerId());
    		db.insert("Message", null, message);
     
    	}
     
     
     
    	//Méthode pour ajouter un contact
    	public boolean addContact(Contact c){
     
    		ContentValues contact = new ContentValues();
    		contact.put("idcontact", c.getIdContact());
    		contact.put("pseudo", c.getPseudonyme());
    		if(!contactExists(c.getIdContact()))
    		if (db.insert("Contact", null, contact)!=-1)
    			return true;
    		return false;
     
    	}
     
    	//Méthode  pour récupérer la liste  des contacts
    	public List<Contact> getContacts(){
    		Cursor cursor = db.query("Contact", null, null, null, null, null, null);
    		List<Contact> contacts= new ArrayList<Contact>();
    		if(cursor.moveToFirst())
    			do{
    				Contact c = new Contact();
    				c.setIdContact(cursor.getString(0));
    				c.setPseudonyme(cursor.getString(1));
    				contacts.add(c);
    			}while(cursor.moveToNext());
    		return contacts;
    	}
    }
    Dans ton activité tu utilises une instance de la classe Db et tu appelles les méthodes open et close avant et après les transaction.

Discussions similaires

  1. Eclipse + gestion base de données
    Par fanette dans le forum Eclipse Java
    Réponses: 11
    Dernier message: 04/11/2018, 19h41
  2. Réponses: 6
    Dernier message: 08/10/2013, 20h31
  3. Gestion Base de données SQLITE
    Par Thethros dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 25/06/2011, 04h23
  4. Gestion Base de Données
    Par deeperpaul dans le forum Excel
    Réponses: 1
    Dernier message: 13/12/2007, 20h51
  5. Classe de gestion de base de données SQLITE
    Par Munkey74 dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 1
    Dernier message: 09/08/2007, 16h50

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