Créer une base sqlite dans android

Alors bon, j’en vois qui trépignent au fond du blog, sur l’article précédent qui utilise un ContentProvider.

Voici donc une petite procédure simple pour créer une base de données dans votre application google android et ce de façon, disons … propre.

L’intérêt de stocker des machins dans une base de données android, c’est en général de partager les données avec d’autres éventuelles applications, sinon, autant utiliser des objets non persistants … enfin on voit l’idée.
Pour créer ma base, je n’ai besoin que d’une classe en plus de mon Activity, un ContentProvider.

Voilà ma classe (ho pas de mérite, avec Eclipse, ça se monte tout seul !) :

public class MyProvider2 extends ContentProvider {
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}
}


Pour charger notre ContentProvider au démarrage de l’application, il faut le déclarer dans le fichier manifest AndroidManifest.xml :

        
            
                
                
            
        
		
    

Attention au nommage, comme ce fichier est lu par le plugin qui génère automatiquement une partie du code Java, il ne validera pas le document si par exemple la classe Java MyProvider n’existe pas dans le projet. Dans notre cas, on ne recopie pas bêtement puisque la classe ci dessus s’appelait MyProvider2 …

Juste pour voir, on peut lancer l’activité principale (oui oui vous avez été malins, vous n’avez pas créé une classe comme ça dans le vent, mais vous avez créé un projet Android et donc vous avez une activité par défaut, le monde est bien fait).
Je vais jeter un oeil dans Eclipse au contenu de mon application, il faut pour ça ouvrir la Vue File Explorer :
android_file_explorer
Quand on explore cette vue, on déplie notre package dans /data/data :
android_file_explorer_project1

Rien de nouveau à priori, on continue.

Dans notre classe ContentProvider, nous allons ajouter cette classe interne :

	private SQLiteDatabase formationDB;
	private static final String DATABASE_NAME = "Formation";
	private static final String DATABASE_TABLE = "filieres";
	private static final int DATABASE_VERSION = 1;
	private static final String DATABASE_CREATE = "create table "
			+ DATABASE_TABLE + " (_id integer primary key autoincrement, "
			+ "title text not null, description text not null);";

	private static class DatabaseHelper extends SQLiteOpenHelper {

		public DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w("Content provider database",
					"Upgrading database from version " + oldVersion + " to "
							+ newVersion + ", which will destroy all old data");
			db.execSQL("DROP TABLE IF EXISTS titles");
			onCreate(db);

		}

	}

On enregistre et on re-lance l’application.
On peut rester de nouveau notre File Explorer android, rien de nouveau …
Et c’est normal.

Pour charger le ContentProvider et créer la base de données sqlite associée, il faut implémenter la méthode onCreate() de notre classe :

	@Override
	public boolean onCreate() {
		Context context = getContext();
		DatabaseHelper dbHelper = new DatabaseHelper(context);
		formationDB = dbHelper.getWritableDatabase();
		return (formationDB == null) ? false : true;
	}

C’est l’appel à la méthode getWritableDatabase() qui lance la création de la base si elle n’existe pas.
En effet, nous pouvons lancer de nouveau notre application et constater dans le file explorer que notre base sqlite a été créée dans le répertoire databases de notre projet :
android_file_explorer_project2

Notre base de données sqlite android est créée et nous pouvons l’interroger, par exemple avec le shell adb de l’émulateur (une fois l’émulateur lancé bien entendu) :

>adb shell

cd data/data
cd com.oxiane.content.providernew.android
# ls
ls
databases
lib
# cd databases
cd databases
# ls
ls
Formation
# sqlite3 Formation
sqlite3 Formation
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> .tables
.tables
android_metadata  filieres
sqlite> select * from filieres;
select * from filieres;
sqlite> insert into filieres values (null, "filière JAVA", "Le développement objet avec Java et JavaEE");
insert into filieres values (null, "filière JAVA", "Le développement objet avec Java et JavaEE");
sqlite> select * from filieres;
select * from filieres;
1|filière JAVA|Le développement objet avec Java et JavaEE
sqlite>

Voilà, la base est prête. Il ne reste plus qu’à renseigner correctement les URI pour y accéder, pour ça il faudra passer par les UriMatcher.
Les éléments importants qu’il faut ensuite traiter sont par exemple les différentes tables (ici nous n’en avons créé qu’une seule) et la construction des requêtes qui renvoient des objets de type Cursor.

La formation Android chez OXiane

Alain