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 :
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'
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

Ci dessous le code de la classe qui contient le SQLiteOpenHelper :
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();
    }
 
}
J'utilise cette classe depuis l'activity avec ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
mDbHelper = new WpBdd(this);
dans le onCreate

puis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
mDbHelper.openDB();
pour l'ouvrir. Ces 2 opérations se déroulent correctement (sous l'oeil du debug).

Cela se gâte quand je veux faire une requête (la version ci dessous est simplifiée) :
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
Avec le plantage et le message du Logcat.

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 ...