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 :
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 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() {}
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" :
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 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" ; }
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 !
Partager