Bonjour,
J'ai besoin d'une BDD SQLITE contenant les coordonnées de points géographiques (entre 1000 et 2000 WP aéronautiques) et j'ai donc trouvé le moyen de transférer une base opérationnelle du dossier asset au dossier /data/data/package_name/databases avec un code dérivé de :
http://www.reigndesign.com/blog/usin...-applications/
Avant de passer à l'étape mobile réel (SPICA) j'ai bien sûr utilisé l'émulateur.
Ce transfert fonctionne de façon aléatoire et je me dis qu'il serait bien plus simple d'exploiter directement la base sur la sdcard à laquelle il est facile d'accéder ( avec MountUSB, merci MrDuChnok).
J'ai donc modifié mon code en conséquence et hélas, plantage.
le LogCat dit :
J'ai observé que le message n'est pas toujours exactement lié à la cause du pb. La table WP existe bien et ce genre de requête a parfaitement fonctionné avec l'émulateur quand la base était dans [B]/data/data/package_name/databases[/B
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 03-24 09:05:42.315: ERROR/AndroidRuntime(3832): android.database.sqlite.SQLiteException: no such table: WP: , while compiling: SELECT _id , Code ,Type , LatE6 , LonE6 , Infos FROM WP WHERE Code = 'LFOU'
Ci dessous le code de la classe qui contient le SQLiteOpenHelper :
J'utilise cette classe depuis l'activity avec ;
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
76
77
78
79
80
81
82 package org.SimpleGpsNav02.riAndroid; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class WpBdd { private static String DB_PATH = "/sdcard/"; private static String DB_NAME = "WP01-BddSqliteOK.db"; private static final int DB_VERSION = 1; private WpBddHelper mDbHelper; private static SQLiteDatabase myDataBase; private final Context myContext; private static class WpBddHelper extends SQLiteOpenHelper { WpBddHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase arg0) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } } //private Context myContext; // constructeur public WpBdd(Context context ) { this.myContext = context; } public Cursor searchDb(String req) throws SQLException { Cursor ret = myDataBase.rawQuery(req , null); if (ret != null) { ret.moveToFirst(); } return ret; } /** * Open the database. If it cannot be opened, try to create a new * instance of the database. If it cannot be created, throw an exception to * signal the failure * * @return this (self reference, allowing this to be chained in an * initialization call) * @throws SQLException if the database could be neither opened or created */ public WpBdd openDB() throws SQLException { mDbHelper = new WpBddHelper(myContext); myDataBase = mDbHelper.getReadableDatabase(); return this; } public void close() { mDbHelper.close(); } }
dans le onCreate
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mDbHelper = new WpBdd(this);
puis :
pour l'ouvrir. Ces 2 opérations se déroulent correctement (sous l'oeil du debug).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mDbHelper.openDB();
Cela se gâte quand je veux faire une requête (la version ci dessous est simplifiée) :
Avec le plantage et le message du Logcat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 strReq = "SELECT _id , Code ,Type , LatE6 , LonE6 , Infos FROM WP WHERE Code = 'LFOU';" ; Cursor ret = mDbHelper.searchDb(strReq) ; // la base a été ouverte en début de proc et fermée à la fin de la proc
Pour éviter de chercher sans espoir de trouver, la question est : peut-on employer une base SQLITE dans ces conditions ? Si la réponse est non, c'est bien dommage mais je partirai sur une autre voie et chercherai un moyen fiable de rapatrier la base dans /data/data/package_name/databases.
Mais cette voie me parait aussi bordée d'épines, car :
> sur le mobile réel, l'explorateur de fichier du DDMS ne montre pas l'arborescence /data/data/package_name/databases le dossier data semble vide. Par contre, on voit bien la sdcard et la BBD qui y est stockée.
> je ne sais pas (encore) accéder au dossier asset pour y déposer la base ....
Merci par avance pour votre aide ...
Partager