Les Bases de données sous Android: SQLite3
SQLite est un système de base de donnée natif sous Android, donc pas nécessaire de l'installer. Il est possible de l'utiliser comme une base de données relationnelle dans vos applications. L'avantage par rapport aux PreferedShared est que la base de donnée est faite pour traiter des données structurées. J'écrirais dans la mesure du possible un article sur les PreferedShared. Vous pouvez toujours me rappeller si je vient a oublier. ok bon
SQLite est un système de base de donnée natif sous Android, donc pas nécessaire de l'installer. Il est possible de l'utiliser comme une base de données relationnelle dans vos applications. L'avantage par rapport aux PreferedShared est que la base de donnée est faite pour traiter des données structurées. J'écrirais dans la mesure du possible un article sur les PreferedShared. Vous pouvez toujours me rappeller si je vient a oublier. ok bon
Ahh Ahh, notre première application ne doit pas être le fameux hello_word qu'on rencotre partout, à dire vrai c'est vraiment démodé pour notre siècle.
Nous allons durant ce petit moment écrire une application de gestion des personnes. En effet il s'agit d'une apllication qui va nous permettre d'ajouter une nouvelle personne, de supprimer une personne que nous avons enregistré au préalable et modifier les informations d'une personne et enfin afficher la listes des personnes que nous avons enregistrées.
Ceci étant vous devez avoir les bases en programmation orienté objet et en SQL(Structured Query Language).
Nous allons utilisé les concepts propre à la programmation sous android suivants:
SQLiteOpenHelper: c'est la classe utilitaire qui va permettre gérer la connexion, création, évolution suivant les versions de votre programme d'une base de données.
SQLiteDatabase: c'est la classe qui nous fournit tous le nécessaire pour nos opération d'insertion, de suppression, de modification, bref elle nous permettra de manupuler nos données.
Ok let's go. Nous allons créer un nouveau projet dans notre IDE c-a-dire notre Android studio et nous lui donnons le nom suivante: PeopleManager.
SQLiteOpenHelper: c'est la classe utilitaire qui va permettre gérer la connexion, création, évolution suivant les versions de votre programme d'une base de données.
SQLiteDatabase: c'est la classe qui nous fournit tous le nécessaire pour nos opération d'insertion, de suppression, de modification, bref elle nous permettra de manupuler nos données.
Ok let's go. Nous allons créer un nouveau projet dans notre IDE c-a-dire notre Android studio et nous lui donnons le nom suivante: PeopleManager.
Une fois le projet crée , nous avons ceci:
ok. Nous avons là une prévisualisation de notre application sauf que là le hello_word est généré par default( Vous comprenez pourquoi le hello_word ne pouvait pas être notre première application).
La vue que nous avons ici est une prévisualisation du fichier activity_main.xml(la vue) qui est associé à l'activité Main_Activity.java .
Nous avons besoin d'une classe Personne pour l'objet model de notre application, on reviendra sur la vue tout à l'heure.
Voici le code de la classe personne:
package com.example.gasmyr.peoplemanager;
import java.util.Date;
/**
* Created by gasmyr on 1/5/15.
*/
public class People {
int people_id;
String fistname;
String lastname;
int age;
String phone;
String email;
String gender;
/**
*
* @param fname
* @param lname
* @param age
* @param phone
* @param email
* @param gender
* @param id
*/
public People(String fname, String lname,int age, String phone, String email, String gender, int id){
this.fistname=fname;
this.lastname=lname;
this.age=age;
this.phone=phone;
this.email=email;
this.gender=gender;
this.people_id=id;
}
/**
*
* @param fname
* @param lname
* @param age
* @param phone
* @param email
* @param gender
*/
public People(String fname, String lname,int age, String phone, String email, String gender){
this.fistname=fname;
this.lastname=lname;
this.age=age;
this.phone=phone;
this.email=email;
this.gender=gender;
}
/**
* ici le constructeur vide
*/
public People(){
}
/**
* les setters pour notre classe people
*
*/
public void setAge(int age) {
this.age = age;
}
public void setEmail(String email) {
this.email = email;
}
public void setFistname(String fistname) {
this.fistname = fistname;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setPeople_id(int people_id) {
this.people_id = people_id;
}
/**
* les getters pour notre classe people
*/
public String getEmail() {
return email;
}
public int getAge() {
return age;
}
public int getPeople_id() {
return people_id;
}
public String getFistname() {
return fistname;
}
public String getGender() {
return gender;
}
public String getLastname() {
return lastname;
}
public String getPhone() {
return phone;
}
}
ok. Nous avons là une prévisualisation de notre application sauf que là le hello_word est généré par default( Vous comprenez pourquoi le hello_word ne pouvait pas être notre première application).
La vue que nous avons ici est une prévisualisation du fichier activity_main.xml(la vue) qui est associé à l'activité Main_Activity.java .
Nous avons besoin d'une classe Personne pour l'objet model de notre application, on reviendra sur la vue tout à l'heure.
Voici le code de la classe personne:
package com.example.gasmyr.peoplemanager;
import java.util.Date;
/**
* Created by gasmyr on 1/5/15.
*/
public class People {
int people_id;
String fistname;
String lastname;
int age;
String phone;
String email;
String gender;
/**
*
* @param fname
* @param lname
* @param age
* @param phone
* @param email
* @param gender
* @param id
*/
public People(String fname, String lname,int age, String phone, String email, String gender, int id){
this.fistname=fname;
this.lastname=lname;
this.age=age;
this.phone=phone;
this.email=email;
this.gender=gender;
this.people_id=id;
}
/**
*
* @param fname
* @param lname
* @param age
* @param phone
* @param email
* @param gender
*/
public People(String fname, String lname,int age, String phone, String email, String gender){
this.fistname=fname;
this.lastname=lname;
this.age=age;
this.phone=phone;
this.email=email;
this.gender=gender;
}
/**
* ici le constructeur vide
*/
public People(){
}
/**
* les setters pour notre classe people
*
*/
public void setAge(int age) {
this.age = age;
}
public void setEmail(String email) {
this.email = email;
}
public void setFistname(String fistname) {
this.fistname = fistname;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setPeople_id(int people_id) {
this.people_id = people_id;
}
/**
* les getters pour notre classe people
*/
public String getEmail() {
return email;
}
public int getAge() {
return age;
}
public int getPeople_id() {
return people_id;
}
public String getFistname() {
return fistname;
}
public String getGender() {
return gender;
}
public String getLastname() {
return lastname;
}
public String getPhone() {
return phone;
}
}
Ok comme c'est facile, nous allons à present crée une nouvelle classe qui étend SQLiteOpenHelper et qui nous permettra de creation la base de donnée et ainsi que sa mise à jour si nécessaire.
Voici son code:
package com.example.gasmyr.peoplemanager;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by gasmyr on 1/5/15.
*/
public class PeopleBdHelper extends SQLiteOpenHelper{
public static final String DB_NAME = "people.db";
public static final int DB_VERSION = 1;
public static final String TABLE_NAME = "people";
public static final String PEOPLE_ID = "_id";
public static final String PEOPLE_FIRSTNAME = "firstname";
public static final String PEOPLE_LASTNAME = "lastname";
public static final String PEOPLE_AGE = "age";
public static final String PEOPLE_PHONE = "phone";
public static final String PEOPLE_EMAIL = "email";
public static final String PEOPLE_GENDER = "gender";
public static final String CREATE_TABLE_PERSONNE=" CREATE TABLE "
+ TABLE_NAME + "("
+ PEOPLE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
+ PEOPLE_FIRSTNAME + " TEXT NOT NULL , "
+ PEOPLE_LASTNAME + " TEXT NOT NULL , "
+ PEOPLE_AGE + " INTEGER NOT NULL , "
+ PEOPLE_PHONE + " TEXT NOT NULL, "
+ PEOPLE_EMAIL + " TEXT NOT NULL,"
+ PEOPLE_GENDER + "TEXT NOT NULL )";
public PeopleBdHelper(Context context){
super(context,DB_NAME,null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database){
database.execSQL(CREATE_TABLE_PERSONNE);
}
@Override
public void onUpgrade(SQLiteDatabase database,int oldVersion, int newVersion){
database.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME + ";" );
onCreate(database);
}
}
S'il y'a des incomprehensions faut signaler en laissant un commentaire.
La suite c'est la classe qui va nous permetre de manipuler nos données (les opérations CRUD), nous allons l' applélée PeopleCrud.java et à l'intérieur nous écrirons les mothodes pour l'ajout d'une personne, la supression, la modification, les listing, l'ouverture de la base de donnée ainsi que sa fermeture. Désolé j'aime pas trop la litérature, on y va:
voici son code :
package com.example.gasmyr.peoplemanager;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
/**
* Created by gasmyr on 1/5/15.
*/
public class PeopleCrud {
public static final String TABLE_NAME = "people";
public static final String PEOPLE_ID = "_id";
public static final String PEOPLE_FIRSTNAME = "firstname";
public static final String PEOPLE_LASTNAME = "lastname";
public static final String PEOPLE_AGE = "age";
public static final String PEOPLE_PHONE = "phone";
public static final String PEOPLE_EMAIL = "email";
public static final String PEOPLE_GENDER = "gender";
private SQLiteDatabase database;
private PeopleBdHelper peopleBdHelper;
public PeopleCrud(Context context){
peopleBdHelper=new PeopleBdHelper(context);
}
/**
* ici la methode pour établir la connexion en lecture et écriture à notre base de donnée
*/
public void open(){
database=peopleBdHelper.getWritableDatabase();
}
/**
* ici la methode pour fermer la connection
*/
public void close(){
database.close();
}
public SQLiteDatabase getDatabase(){
return database;
}
/**
* methode pour insérer une personne dans la bd
* @param people
* @return
*/
public long AddPeople(People people){
ContentValues values=new ContentValues();
values.put(PEOPLE_FIRSTNAME,people.getFistname());
values.put(PEOPLE_LASTNAME,people.getLastname());
values.put(PEOPLE_AGE,people.getAge());
values.put(PEOPLE_PHONE,people.getPhone());
values.put(PEOPLE_EMAIL,people.getEmail());
values.put(PEOPLE_GENDER,people.getGender());
return database.insert(TABLE_NAME,null, values);
}
public int deletePeople(People people) {
return database.delete(TABLE_NAME,
PEOPLE_ID + "=" + String.valueOf(people.getPeople_id()), null);
}
public int updatePeople(People people) {
ContentValues values=new ContentValues();
values.put(PEOPLE_FIRSTNAME,people.getFistname());
values.put(PEOPLE_LASTNAME,people.getLastname());
values.put(PEOPLE_AGE,people.getAge());
values.put(PEOPLE_PHONE,people.getPhone());
values.put(PEOPLE_EMAIL,people.getEmail());
values.put(PEOPLE_GENDER,people.getGender());
return database.update(TABLE_NAME, values,
PEOPLE_ID + "=" + String.valueOf(people.getPeople_id()), null);
}
public Cursor getAllPeopleAsCusor() {
String query = "SELECT * FROM " + TABLE_NAME;
Cursor cursor = database.rawQuery(query, null);
return cursor;
}
/**
* cette methode convertir le curseur en list de personne que nous pouvons manipulée.
* @param cursor
* @return
*/
private List<People> CursorToPeople(Cursor cursor) {
List<People> list = new ArrayList<People>();
People people;
if (cursor.moveToFirst()) {
do {
people = new People(); // faut voir l'utiliter du constructeur vide ici
people.setPeople_id(Integer.parseInt(cursor.getString(0)));
people.setFistname(cursor.getString(1));
people.setLastname(cursor.getString(2));
people.setAge(Integer.parseInt(cursor.getString(3)));
people.setPhone(cursor.getString(4));
people.setEmail(cursor.getString(5));
people.setGender(cursor.getString(6));
list.add(people);
} while (cursor.moveToNext());
}
return list;
}
}
Ok La suite c'est du côté de la vue. j'ai hate de voir le resultat.
Nous allons designer une vue pour tester la fonctionnalité d'ajout d'une nouvelle personne. Vous savez déjà qu'a chaque activité est associé une vue. Notre vue d'ajout ressemblera à ceci:
La suite c'est la classe qui va nous permetre de manipuler nos données (les opérations CRUD), nous allons l' applélée PeopleCrud.java et à l'intérieur nous écrirons les mothodes pour l'ajout d'une personne, la supression, la modification, les listing, l'ouverture de la base de donnée ainsi que sa fermeture. Désolé j'aime pas trop la litérature, on y va:
voici son code :
package com.example.gasmyr.peoplemanager;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
/**
* Created by gasmyr on 1/5/15.
*/
public class PeopleCrud {
public static final String TABLE_NAME = "people";
public static final String PEOPLE_ID = "_id";
public static final String PEOPLE_FIRSTNAME = "firstname";
public static final String PEOPLE_LASTNAME = "lastname";
public static final String PEOPLE_AGE = "age";
public static final String PEOPLE_PHONE = "phone";
public static final String PEOPLE_EMAIL = "email";
public static final String PEOPLE_GENDER = "gender";
private SQLiteDatabase database;
private PeopleBdHelper peopleBdHelper;
public PeopleCrud(Context context){
peopleBdHelper=new PeopleBdHelper(context);
}
/**
* ici la methode pour établir la connexion en lecture et écriture à notre base de donnée
*/
public void open(){
database=peopleBdHelper.getWritableDatabase();
}
/**
* ici la methode pour fermer la connection
*/
public void close(){
database.close();
}
public SQLiteDatabase getDatabase(){
return database;
}
/**
* methode pour insérer une personne dans la bd
* @param people
* @return
*/
public long AddPeople(People people){
ContentValues values=new ContentValues();
values.put(PEOPLE_FIRSTNAME,people.getFistname());
values.put(PEOPLE_LASTNAME,people.getLastname());
values.put(PEOPLE_AGE,people.getAge());
values.put(PEOPLE_PHONE,people.getPhone());
values.put(PEOPLE_EMAIL,people.getEmail());
values.put(PEOPLE_GENDER,people.getGender());
return database.insert(TABLE_NAME,null, values);
}
public int deletePeople(People people) {
return database.delete(TABLE_NAME,
PEOPLE_ID + "=" + String.valueOf(people.getPeople_id()), null);
}
public int updatePeople(People people) {
ContentValues values=new ContentValues();
values.put(PEOPLE_FIRSTNAME,people.getFistname());
values.put(PEOPLE_LASTNAME,people.getLastname());
values.put(PEOPLE_AGE,people.getAge());
values.put(PEOPLE_PHONE,people.getPhone());
values.put(PEOPLE_EMAIL,people.getEmail());
values.put(PEOPLE_GENDER,people.getGender());
return database.update(TABLE_NAME, values,
PEOPLE_ID + "=" + String.valueOf(people.getPeople_id()), null);
}
public Cursor getAllPeopleAsCusor() {
String query = "SELECT * FROM " + TABLE_NAME;
Cursor cursor = database.rawQuery(query, null);
return cursor;
}
/**
* cette methode convertir le curseur en list de personne que nous pouvons manipulée.
* @param cursor
* @return
*/
private List<People> CursorToPeople(Cursor cursor) {
List<People> list = new ArrayList<People>();
People people;
if (cursor.moveToFirst()) {
do {
people = new People(); // faut voir l'utiliter du constructeur vide ici
people.setPeople_id(Integer.parseInt(cursor.getString(0)));
people.setFistname(cursor.getString(1));
people.setLastname(cursor.getString(2));
people.setAge(Integer.parseInt(cursor.getString(3)));
people.setPhone(cursor.getString(4));
people.setEmail(cursor.getString(5));
people.setGender(cursor.getString(6));
list.add(people);
} while (cursor.moveToNext());
}
return list;
}
}
Ok La suite c'est du côté de la vue. j'ai hate de voir le resultat.
Nous allons designer une vue pour tester la fonctionnalité d'ajout d'une nouvelle personne. Vous savez déjà qu'a chaque activité est associé une vue. Notre vue d'ajout ressemblera à ceci:
Voici le code source du notre vue(activity_add_people.xml):
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.gasmyr.peoplemanager.PeopleAddActivity"
android:background="@drawable/bg9">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="30dp">
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textAlignment="center"
android:textSize="30dp"
android:elegantTextHeight="true"
android:text="@string/add_form"/>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="5dp"
android:background="@drawable/back2"></LinearLayout>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TableRow>
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/fname"
android:textSize="25dp"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/fname"/>
</TableRow>
<TableRow>
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/lname"
android:textSize="25dp"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/lname"/>
</TableRow>
<TableRow>
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/age"
android:textSize="25dp"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/age"/>
</TableRow>
<TableRow>
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/phone"
android:textSize="25dp"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/phone"/>
</TableRow>
<TableRow>
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/email"
android:textSize="25dp"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/email"/>
</TableRow>
<TableRow>
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/gender"
android:textSize="25dp"/>
<RadioGroup>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/male"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/female"/>
</RadioGroup>
</TableRow>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="10dp"
android:background="@drawable/back2"></LinearLayout>
<LinearLayout android:layout_width="fill_parent">
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TableRow>
<Button android:layout_width="fill_parent"
android:text="@string/cancel"
android:id="@+id/cancel"/>
<Button android:layout_width="fill_parent"
android:text="@string/save"
android:id="@+id/save"/>
</TableRow>
</TableLayout>
</LinearLayout>
</TableLayout>
</TableLayout>
Nous allons implementé juste la fonctionnalité d'ajout et l'article suivant nous permettra de realiser la fonctionnalité de listing. Nous allons donc placé un écouteur sur le bouton save qui nous permettra de réagir au clic et de recupérer les informations saisies par l'utilisateur.
voici le coe final de la classe PeopleAddActivity:
package com.example.gasmyr.peoplemanager;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
import java.util.ArrayList;
public class PeopleAddActivity extends Activity {
private RadioGroup genderGroupe;
private PeopleCrud peopleCrud;
private ArrayList<People> peopleArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_people_add);
peopleCrud= new PeopleCrud(getApplicationContext());
Button save=(Button)findViewById(R.id.save);
genderGroupe=(RadioGroup)findViewById(R.id.gender);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText fname=(EditText)findViewById(R.id.fname);
EditText lname=(EditText)findViewById(R.id.lname);
EditText age=(EditText)findViewById(R.id.age);
EditText phone=(EditText)findViewById(R.id.phone);
int tel= Integer.parseInt(phone.getText().toString());
EditText email=(EditText)findViewById(R.id.email);
RadioButton gender= (RadioButton)findViewById(genderGroupe.getCheckedRadioButtonId());
People people=new People(fname.getText().toString(),lname.getText().toString(),
tel ,phone.getText().toString(),
email.getText().toString(),gender.getText().toString());
peopleCrud.open();
peopleCrud.AddPeople(people);
}
});
Button cancel=(Button)findViewById(R.id.cancel);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
peopleArrayList=peopleCrud.getAllPeople,
Toast.makeText(getApplicationContext(),
"Taille de la liste" +peopleArrayList.size(),Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_people_add, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Et Voici le résultat sur mon l'émulateur HTC:
Le clic sur le bouton cancel nous affiche la taille de la liste des personnes enregistrées. comme ceci:
C'était bon pour un debut. la prochaine fois nous verrons quelque chose un peu plus complet en respectant les best practices de la programmation sous android. rappelons que le code écrit ici n'est pas très professionnelle car le but était de montrer comment utiliser les bases de données sous android. Un article sous les Bonnes pratiques en programmation sous android va bientôt surgit ainsi qu'un sesecond sur l'utilisation des Fragments( un concept introduit dans l'API 11 <<Android 3.0>> pour la modularité et la gestion des tailles d'écrans multiples comme les smartphones et les tablettes. ).
Laisser les commentaires si vous avez des incomprehensions, je suis à votre disposition chaque jour. Merci
Du courage Thomas Mougang
RépondreSupprimer