Blog

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

admin

Written by

The author didnt add any Information to his profile yet

  • antroïd

    Bonjour et merci pour ces bons tutos clairs et utiles sur androïd.

    J’ai simplement une petite question sur la toute dernière partie. Est-ce possible d’accéder à la base de données comme vous l’indiquez sur le téléphone lui-même (et comment), moi j’ai un ‘permission denied’ au moment ou je rentre sqlite3 ..(phone : HTC desire)

    Si vous pouvez m’aiguiller, ça serait cool (sinon c’est pas grave :).
    Merci !

  • aboudard

    Hello !
    Il existe des sites qui causent des accès directs en ligne de commande à ton Device (par opposition à l’émulateur).
    Moi je n’ai pas testé ce genre d’accès, mais en gros c’est identique.
    J’espère que tu as pu trouver une réponse, sinon je peux regarder ça !

    Alain

  • Oussema_naifer

    SVP j’ai un petit probleme comment on peut voir le contenue de Formation ????

  •  salut !
    le contenu de la formation, il faut suivre la formation pour le voir :)
    normalement tu as tout le code nécessaire ici pour implémenter ta base de données.
    voudrais-tu un projet type à importer dans eclipse ?

  • Oussema_naifer

    SVP Alain Boudard en peut cree plusieur table dans la base ..si oui comment on peut construire un relation entre les table de la base??Mer6 b11 pour la reponse :))

  •  Salut,
    Tu peux créer autant de tables que tu veux, il suffit d’enrichir ton instruction SQL
    Dans l’exemple fourni, tu auras donc plusieurs commandes de ce type :
    db.execSQL(TABLE1_CREATE);db.execSQL(TABLE2_CREATE);

    Après, tu peux implémenter les clé étrangères, SQLite les prend en charge, mais tout dépend de la version d’android visiblement, ce n’est pas le cas sur toutes les versions !

    http://www.sqlite.org/foreignkeys.html

  • samar

    Slt ,merci bcp pr ce tuto et j’ai des questions concernat sqlite,comment utiliser les bases sqlite externe , comment le extraire les data de bd formation? , comment créer copier interne de cette bd externe? thank you :)

  • Salut,
    A priori les données dans Android sont privées aux applications, tu ne peux pas accéder à n’importe quelle base de donnée externe à une application, à moins de réaliser le content provider qui expose ces données.

    J’imagine qu’on pourrait essayer d’ouvrir un fichier sqlite qui serait sur la sdcard, mais je n’ai jamais essayé.

    Je vois que certains ont tenté l’aventure, mais c’est vrai que je trouve ça assez moyen.

    http://stackoverflow.com/questions/4433208/android-use-sqlite-database-on-sd-card-not-using-internal-android-data-store-a

    Si tu voulais juste copier le fichier, c’est possible, car normalement on a l’accès aux dossiers de l’application :

    http://stackoverflow.com/questions/5699437/how-to-copy-file-from-asset-folder-to-database-folder-in-android

  • tak

    Bonjour Alain,

    SVp, j’ai besoin de créer un formulaire, puis sauvegarder les données saisies dans une base sqlite

    Merci de m’aider, et si c’est possible je voudrais un projet type à importer dans eclipse,

    Merci encore une fois

  • Salut !

    Alors disons que si tu n’as pas encore créé d’application avec un formulaire et du code qui récupère les données saisies, il faudrait commencer par là !

    Après, il faut regarder les méthodes de la classe DatabaseHelper pour faire tes enregistrements.

    Tu as un tuto sur cette page :

    http://www.tutos-android.com/contentprovider-android

  • tak

    Merci bien je vais essayer :) une dernière question svp, est ce que je trouve la base dans la mémoire de mon device? si oui où je peux la trouver ??
    je vous remercie encore une fois ^_^

  • Alors la base peut être récupérée facilement depuis eclipse dans le File Explorer, tu as la procédure ici :

    http://www.mysamplecode.com/2011/06/android-emulator-sqlite-database.html

    Là c’est pour un émulateur Android, mais c’est pareil avec un device.
    Attention, si tu n’es pas root sur ton device, tu ne pourras pas y accéder !

  • tak

    aaah d’accord, j’ai compiler toujours mon application avec une tablette et non pas avec un émulateur, et j’ai rien trouvez, je pense toujours qu’il y a un bug à mon code, je vais tester maintenant avec un émulateur,
    Merci :)