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 :

Remplir une table vide d'une database avec des éléments d'une autre table


Sujet :

Android

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Remplir une table vide d'une database avec des éléments d'une autre table
    Bonjour,

    Je me confronte en ce moment à une étape de taille de mon application et je me sens complétement débordée par la tache, j'aimerais donc avoir quelques conseils pour savoir si je vais dans la bonne direction !

    Détails de mon application :
    A/ En simplifiant, mon application permet d'ouvrir une listview dans laquelle le contenu d'une table de ma base de données est visualisable. Par exemple, l'utilisateur clique sur un bouton "Restaurants", la listview s'ouvre et affiche tous les résultats associés stockés dans la table "Poi" de ma database.
    B/ Lorsque l'utilisateur clique sur un élément de la listview, une nouvelle activité s'ouvre avec des infos relatives à l'élément en question. Il y a un bouton (inactif pour le moment) "Ajouter aux Favoris" qui permettra de sauvegarder ce résultat dans une autre table de ma database (la table "Favoris".

    Détails de ma base de données :
    Il y a trois tables:
    - android_metadata (formalité)
    - Poi : elle contient des milliers d'éléments et n'est pas censée être modifiée
    - Favoris : elle ne contient aucun élément, j'y ai juste créé les colonnes qui m'intéressent. Ça sera à l'utilisateur d'y rajouter des éléments via le boutons "Ajouter aux Favoris".

    Concernant mon code :
    Toute la partie communication avec la table "Poi" marche parfaitement, j'essaie désormais d'y ajouter le code nécessaire pour permettre d'ajouter des éléments dans la table "Favoris". Voici quelques éléments de mon code:

    A/ DatabaseHelper :
    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
     
    public class DatabaseHelper extends SQLiteOpenHelper {
     
    	private static String DB_NAME = "POIfinal";
    	private static int DB_VERSION = 1;
    	private static String DB_PATH = "/data/data/com.example.asiatypeapplicationbeta/databases/";
    	private static String TAG = DatabaseHelper.class.getSimpleName();
     
    	private SQLiteDatabase myDatabase;
    	private Context myContext;
     
    	public DatabaseHelper(Context context){
    		super(context, DB_NAME, null, DB_VERSION);
    		this.myContext = context ;
    	}
    // Puis (je ne détaille pas vu qu'a priori cette partie là n'a pas à être changée, à part le "readable" qui deviendra "writable" vu que la table favoris est accessible en écriture:
    createDatabase() {}
    checkDatabase() {}
    copyDatabase() {}
    openDatabase() {}
    onCreate() {}
    onUpgrade() {}
    B/ DatabaseAdapter :
    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
     
    public class DatabaseAdapter {
     
    	public static final String DATABASE_POITABLE = "tblpoisurvey";
     
    	public static final String KEY_ROWID = "_id";
    	public static final String COL_NAME = "name";
    	public static final String COL_CAT1 = "cat1";
    	public static final String COL_CAT2 = "cat2";
    	public static final String COL_CAT3 = "cat3";
    	public static final String COL_SUBCAT = "subcat";
    	public static final String COL_STREET = "street";
    	public static final String COL_WEBSITE = "website";
    	public static final String COL_REMARKS = "remarks";
    	public static final String COL_TELEPHONE = "telephoneNo";
    	public static final String COL_MOBILE = "mobileNo";
    	public static final String COL_PRICE = "priceLevel";
    	public static final String COL_DATEFRIENDLY = "dateFriendly";
    	public static final String COL_PAYMENT = "paymentOptions";
    	public static final String COL_CUISINE = "cuisine";
     
    // .....
     
    public Cursor findPoiInTable(String categoryInterval) {
    		String where = COL_CAT1 + " IN " + categoryInterval + " OR " + COL_CAT2
    				+ " IN " + categoryInterval + " OR " + COL_CAT3 + " IN " + categoryInterval;
     
    		Cursor c = myDatabase.query(DATABASE_POITABLE, new String[] { KEY_ROWID,
    				COL_NAME, COL_STREET, COL_WEBSITE, COL_PAYMENT, COL_TELEPHONE,
    				COL_PRICE, COL_REMARKS, COL_DATEFRIENDLY, COL_MOBILE}, where, null, null,
    				null, COL_NAME);
    		return c;
    	}

    C/ La classe "Tblfavorites" correspondant à ma nouvelle table "Favoris" :

    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 Tblfavorites implements BaseColumns {
     
    	// private constructor
    	private Tblfavorites()
    	{
     
    	}
    	public static final Uri CONTENT_URI = Uri.parse("content://com.example.asiatypeapplicationbeta.FavoritesProvider");
    	public static final String FAV_ID = "_id" ;
    	public static final String FAV_NAME = "name";
    	public static final String FAV_CAT1 = "cat1" ;
    	public static final String FAV_CAT2 = "cat2" ;
    	public static final String FAV_CAT3 = "cat3" ;
    	public static final String FAV_STREET = "street" ;
    	public static final String FAV_WEBSITE = "website" ;
    	public static final String FAV_REMARKS = "remarks" ;
    	public static final String FAV_TELEPHONE = "telephoneNo" ;
    	public static final String FAV_MOBILE = "mobileNo" ;
    	public static final String FAV_PRICE = "priceLevel" ;
    	public static final String FAV_DATEFRIENDLY = "dateFriendly" ;
    	public static final String FAV_PAYMENT = "paymentOptions" ;
    	public static final String FAV_CUISINE = "cuisine" ;
     
    }
    D/ Une classe "FavoritesProvider" qui me sera indispensable d'après ce que j'ai lu ici et là :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    public class FavoritesProvider extends ContentProvider {
     
    	public static final String AUTHORITY = "com.example.asiatypeapplicationbeta";
    	public static final String FAVORITES_TABLE = "tblfavorites" ;
    	private DatabaseHelper dbHelper;
    	private static HashMap<String, String> FavoritesProjectionMap;
    	static
    	{
    		FavoritesProjectionMap = new HashMap<String,String>();
    		FavoritesProjectionMap.put(Tblfavorites.FAV_CAT1, Tblfavorites.FAV_CAT1);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_CAT2, Tblfavorites.FAV_CAT2);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_CAT3, Tblfavorites.FAV_CAT3);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_CUISINE, Tblfavorites.FAV_CUISINE);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_MOBILE, Tblfavorites.FAV_MOBILE);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_ID, Tblfavorites.FAV_ID);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_NAME, Tblfavorites.FAV_NAME);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_PAYMENT, Tblfavorites.FAV_PAYMENT);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_STREET, Tblfavorites.FAV_STREET);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_TELEPHONE, Tblfavorites.FAV_TELEPHONE);
    		FavoritesProjectionMap.put(Tblfavorites.FAV_WEBSITE, Tblfavorites.FAV_WEBSITE);
    	}
     
    	@Override
    	public int delete(Uri uri, String selection, String[] selectionArgs) {
    		SQLiteDatabase db = dbHelper.getWritableDatabase();
            int count = db.delete(FAVORITES_TABLE, selection, selectionArgs);
            db.close();
            return count;
    	}
     
    	@Override
    	public String getType(Uri arg0) {
     
    		return null;
    	}
     
    	@Override
    	public Uri insert(Uri uri, ContentValues values) {
    		SQLiteDatabase db = dbHelper.getWritableDatabase();
            long rowId = db.insert(FAVORITES_TABLE, null, new ContentValues(values));
            db.close();
            if (rowId > 0) 
            {
                Uri favUri = ContentUris.withAppendedId(Tblfavorites.CONTENT_URI, rowId);
                getContext().getContentResolver().notifyChange(favUri, null);
                return favUri;
            }
     
            throw new SQLException("Failed to insert row into " + uri);
    	}
     
    	@Override
    	public boolean onCreate() {
    		dbHelper = new DatabaseHelper(getContext());
    		return true;
    	}
     
    	@Override
    	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
    			String sortOrder) {
    		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
            qb.setTables(FAVORITES_TABLE);
            qb.setProjectionMap(FavoritesProjectionMap);
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            return qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
    	}
     
    	@Override
    	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 
    	{
    		return 0;
    	}
     
    }

    Mes questions :
    A/ Une classe "FavoritesProvider" est-elle réellement indispensable pour passer du contenu de ma table "Poi" à ma table "Favoris" ? Si oui, faudrait-il aussi que je créé une classe "PoiProviders" pour sélectionner le contenu des éléments de ma table Poi ?
    B/ Auriez vous des exemples ou pistes concernant la façon dont se rédige une méthode "addElement()" permettant d'ajouter un élément d'une table à une autre table? Dans quelle classe cette méthode devrait elle être définie puisque qu'elle fait référence aux deux tables (DatabaseAdapter, comme mes query pour la table "Poi" ?)

    Je suis vraiment preneuse pour tout conseils, je viens de finir ma classe FavoritesProvider mais maintenant je suis perdue et ne sais pas quelle est la prochaine étape...

    Merci infiniment pour toute aide, n'hésitez pas à me demander pour des infos supplémentaires !

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Bonjour,

    Je pense que tu n'es pas loin.
    Je ne vois pas réellement ce qui te bloque.

    Une fois que tu as ton objet affiché, lorsque la personne clique sur ajouter aux favoris, il te suffit de faire un insert!
    Le bouton devient alors supprimer des favoris et lors du clique, il te suffit de faire un delete!


    Petite astuce, pourquoi re stockes tu toutes les infos de ta table Poi? Il te suffit de stocker l'identifiant. Avec celui ci, tu peux facilement récupérer ton Poi en faisant une requête getById par exemple.

    Concernant tes questions d'architecture, effectivement il est préférable pour des questions d'organisation, d'avoir la compositions suivante:
    - une classe databaseHelper,
    - une classe bean pour les Poi,
    - une classe dao (provider pour toi) pour les requêtes Poi (contient getById),
    - une classe bean pour les Favoris,
    - une classe dao (provider pour toi) pour les requêtes Favoris (insert, delete, getAll).
    Ce n'est qu'un conseille et il existe encore plusieurs autres possibilités propre ou non.


    J'espère que cela t'aidera.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour David,

    En effet, ton message m'aide et m'a fait réaliser l'une des grosses failles de mon application dans la façon dont les différents objets sont appelés et utilisés et l'importance de l'utilisation de la méthode getById. C'est quelque chose que je ne sais pas encore faire, donc pour le moment je vais continuer à faire comme j'ai fait avec ma première table POI, et quand ça marchera j'optimiserai. Faire puis parfaire... !

    Voila les quelques changements que j'ai faits en réponse à tes conseils :

    A/ Lorsque l'on arrive sur la page de l'objet et qu'on clique sur Add to Favorites:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     OnClickListener poi_favoritesbutton_listener = new OnClickListener(){
    			@Override
    			public void onClick(View v) {
    				DatabaseAdapter.insertInTable(ID_NAME, ID_CAT1, ID_CAT2, ID_CAT3, ID_CUISINE);
    			}
    		};
    B/ Dans la classe DatabaseAdapter, on trouve justement cette méthode insertInTable() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static long insertInTable(String ID_NAME, String ID_CAT1,
    			String ID_CAT2, String ID_CAT3, String ID_CUISINE) {
    		ContentValues data = new ContentValues();
    		data.put(FAV_NAME, ID_NAME);
    		data.put(FAV_CAT1, ID_CAT1);
    		data.put(FAV_CAT2, ID_CAT2);
    		data.put(FAV_CAT3, ID_CAT3);
    		data.put(FAV_CUISINE, ID_CUISINE);
    		if (myDatabase == null) {
     
    		}
    		return myDatabase.insert("DATABASE_FAVTABLE", null, data);
    	}
    Les deux problèmes sont que :
    - d'abord je n'utilise pas du tout les deux classes Tblfavorites et FavoritesProvider faisant le lien entre le contenu des objets et l'application (mais bon ça à la limite je peux me pencher dessus plus tard). Je pourrai virer ces deux classes, ça ne changerait rien. Pourtant, elles devraient servir ?!
    - ensuite, lorsque j'essaye d'ouvrir une listview avec le contenu de cette base de données, j'ai une NullPointerException liée à mon simpleCursorAdapter. C'est un autre sujet, mais étant donné que le code que j'utilise marchait pour ma table POI et ne marche plus pour celui là, j'imagine qu'il y a un problème avec cette nouvelle table.

    D'où une simple question :
    Comment vérifier si le contenu est effectivement ajouté à la table de ma base de données ? Il y a-t-il un moyen simple de contrôler l'état de ma bdd?

    Merci beaucoup !

  4. #4
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Oui il y a un moyen plus que simple

    SQLITE DATABASE BROWSER

    Ce logiciel te permet de lire une base de données SQLite.

    Il te suffit de récupérer le fichier via DDMS si tu es sur émulateur et de l'ouvrir avec ce programme pour voir ce qu'il contient.

Discussions similaires

  1. Création de Menu avec des éléments d'une table
    Par devalender dans le forum MkFramework
    Réponses: 9
    Dernier message: 18/10/2014, 15h39
  2. Réponses: 3
    Dernier message: 20/10/2009, 09h02
  3. Réponses: 1
    Dernier message: 08/10/2008, 15h30
  4. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  5. Liaison avec des images dans une table
    Par ValérieBruxelles dans le forum Access
    Réponses: 5
    Dernier message: 25/11/2005, 14h21

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