mardi 7 avril 2015

Sqlite data loss in Android

So I'm trying to build a Quiz application. I created the database and the tables, I stored some data and I displayed it. And it works as expected ! But, from time to time I find that all the data stored is lost (I think that happens when I open Eclipse and start the AVD, but I'm not sure).


Here is my DBHelper class where I have all the sql commands I need:



package com.example.quiz;


import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;

public class DBAdapter {

/* Proprietés de la base de données */
private static final String DATABASE_NAME = "Quiz.db";
private static final int DATABASE_VERSION = 2;

/* Table Catégorie */
private static final String TABLE_CATEGORIE = "Categorie";
private static final String CATEGORIE_ID = "idCategorie";
private static final String CATEGORIE_DESIGNATION = "designCategorie";
private static final String CATEGORIE_DESCRIPTION = "descCategorie";

private static final String CREATE_CATEGORIE = "CREATE TABLE Categorie (" +
"idCategorie integer primary key autoincrement, " +
"designCategorie Text, " +
"descCategorie Text)";

/* Table Cours */
private static final String TABLE_COURS = "Cours";
private static final String COURS_ID = "idCours";
private static final String COURS_DESIGNATION = "designCours";
private static final String COURS_CONTENU = "contenuCours";

private static final String CREATE_COURS = "CREATE TABLE Cours (" +
"idCours integer primary key autoincrement, " +
"designCours Text, " +
"contenuCours Text, " +
"idCategorie integer," +
"FOREIGN KEY (idCategorie) REFERENCES Categorie(idCategorie))";

/* Table Certification */
private static final String TABLE_CERTIFICATION = "Certification";
private static final String CERTIFICATION_ID = "idCertification";
private static final String CERTIFICATION_DESIGNATION = "designCertification";

private static final String CREATE_CERTIFICATION = "CREATE TABLE Certification (" +
"idCertification integer primary key autoincrement, " +
"designCertification Text, " +
"idCategorie integer, " +
"idCours integer, " +
"FOREIGN KEY (idCategorie) REFERENCES Categorie(idCategorie)" +
"FOREIGN KEY (idCours) REFERENCES Cours(idCours))";

/* Table Pile */
private static final String TABLE_PILE = "Pile";
private static final String PILE_ID = "idPile";
private static final String PILE_DESIGNATION = "designPile";

private static final String CREATE_PILE = "CREATE TABLE Pile (" +
"idPile integer primary key autoincrement, " +
"designPile Text, " +
"idCertification integer, " +
"FOREIGN KEY(idCertification) REFERENCES Certification(idCertification))";

/* Table Question */
private static final String TABLE_QUESTION = "Question";
private static final String QUESTION_ID = "idQuestion";
private static final String QUESTION_DESIGNATION = "designQuestion";

private static final String CREATE_QUESTION = "CREATE TABLE Question (" +
"idQuestion integer primary key autoincrement, " +
"designQuestion Text, " +
"idPile integer, " +
"FOREIGN KEY(idPile) REFERENCES Pile(idPile))";

/* Table ChoixQuestion */
private static final String TABLE_CHOIX_QUESTION = "ChoixQuestion";
private static final String CHOIX_QUESTION_ID = "idChoixQuestion";
private static final String CHOIX_QUESTION_NOM = "nomChoixQuestion";
private static final String CHOIX_QUESTION_IS_CORRECT = "isCorrectChoixQuestion";

private static final String CREATE_CHOIX_QUESTION = "CREATE TABLE ChoixQuestion (" +
"idChoixQuestion integer primary key autoincrement, " +
"nomChoixQuestion Text, " +
"isCorrectChoixQuestion integer, " +
"idQuestion integer, " +
"FOREIGN KEY(idQuestion) REFERENCES Question(idQuestion))";

/* Table Quiz */
private static final String TABLE_QUIZ = "Quiz";
private static final String QUIZ_ID = "idQuiz";
private static final String QUIZ_NIVEAU = "niveauQuiz";
private static final String QUIZ_DATE = "dateQuiz";
private static final String QUIZ_DUREE = "dureeQuiz";
private static final String QUIZ_MEILLEUR_NOTE = "meilleurNoteQuiz";

private static final String CREATE_QUIZ = "CREATE TABLE Quiz (" +
"idQuiz integer primary key autoincrement, " +
"niveauQuiz Text, " +
"dateQuiz Text, " +
"dureeQuiz integer, " +
"meilleurNoteQuiz integer, " +
"idCertification integer, " +
"FOREIGN KEY(idCertification) REFERENCES Certification(idCertification))";

/* Table Question_Quiz */
private static final String TABLE_QUESTION_QUIZ = "Question_Quiz";
private static final String QUESTION_QUIZ_IDQUESTION = "idQuestion";
private static final String QUESTION_QUIZ_IDQUIZ = "idQuiz";

private static final String CREATE_QUESTION_QUIZ = "CREATE TABLE Question_Quiz (" +
"idQuestion integer, " +
"idQuiz integer, " +
"FOREIGN KEY(idQuestion) REFERENCES Question(idQuestion)" +
"FOREIGN KEY(idQuiz) REFERENCES Quiz(idQuiz))";

private Context context;
private DBHelper helper;
private SQLiteDatabase db;

/* Requetes Select */
public static final String[] selectCategories = {CATEGORIE_ID + " as _id", CATEGORIE_DESIGNATION, CATEGORIE_DESCRIPTION};
public static final String[] selectCours = {COURS_ID, COURS_DESIGNATION, COURS_CONTENU, CATEGORIE_ID};
public static final String[] selectPile = {PILE_ID, PILE_DESIGNATION, CERTIFICATION_ID};
public static final String[] selectCertification = {CERTIFICATION_ID, CERTIFICATION_DESIGNATION, CATEGORIE_ID, COURS_ID};
public static final String[] selectQuiz = {QUIZ_ID, QUIZ_NIVEAU, QUIZ_DATE, QUIZ_DUREE, QUIZ_MEILLEUR_NOTE, CERTIFICATION_ID};
public static final String[] selectQuestion = {QUESTION_ID, QUESTION_DESIGNATION, PILE_ID};
public static final String[] selectChoixQuestion = {CHOIX_QUESTION_ID, CHOIX_QUESTION_NOM, CHOIX_QUESTION_IS_CORRECT, QUESTION_ID};
public static final String[] selectQuestionQuiz = {QUESTION_QUIZ_IDQUIZ, QUESTION_QUIZ_IDQUESTION, QUIZ_ID, QUIZ_NIVEAU, QUIZ_DATE, QUIZ_DUREE, QUIZ_MEILLEUR_NOTE, QUESTION_ID, QUESTION_DESIGNATION};

public DBAdapter(Context c) {
// TODO Auto-generated constructor stub
context = c;
helper = new DBHelper(c);
//c.deleteDatabase(DATABASE_NAME);
}

public DBAdapter open() {
db = helper.getWritableDatabase();
return this;
}

/* Ajouter Catégorie */
public long ajouterCategorie(String designation, String description){
ContentValues values = new ContentValues();
values.put(CATEGORIE_DESIGNATION, designation);
values.put(CATEGORIE_DESCRIPTION, description);
return db.insert(TABLE_CATEGORIE, null, values);
}

public String afficherCategorie(){
Cursor c = db.query(true, TABLE_CATEGORIE, selectCategories, null, null, null, null, null, null);
String message = "";
while(c.moveToNext()){
message += "Id Cat: " + c.getInt(0) + "\n" +
"Designation: " + c.getString(1) + "\n" +
"Desc: " + c.getString(2) + "\n";
}
return message;
}
/* Ajouter cours */
public long ajouterCours(String designation, String contenu, int id){
ContentValues values = new ContentValues();
values.put(COURS_DESIGNATION, designation);
values.put(COURS_CONTENU, contenu);
values.put(CATEGORIE_ID, id);
return db.insert(TABLE_COURS, null, values);
}

/* Modifier catégorie */
public int modifierCategorie(int id, String design, String desc){
ContentValues values = new ContentValues();
values.put(CATEGORIE_DESIGNATION, design);
values.put(CATEGORIE_DESCRIPTION, desc);

return db.update(TABLE_CATEGORIE, values, CATEGORIE_ID + "=" + id, null);
}


/* Ajouter Pile */
public long ajouterPile(String designation, int idCertif){
ContentValues values = new ContentValues();
values.put(PILE_DESIGNATION, designation);
values.put(CERTIFICATION_ID, idCertif);
return db.insert(TABLE_PILE, null, values);
}

public String afficherPile(){
Cursor c = db.query(true, TABLE_PILE, selectPile, null, null, null, null, null, null);
String message = "";
while(c.moveToNext()){
message += "Id: " + c.getInt(0) + "\n" +
"Designation: " + c.getString(1) + "\n" +
"idCertif: " + c.getInt(2);
}
return message;
}

/* Ajouter Certification */
public long ajouterCertification(String designation, int idCat, int idCours){
ContentValues values = new ContentValues();
values.put(CERTIFICATION_DESIGNATION, designation);
values.put(CATEGORIE_ID, idCat);
values.put(COURS_ID, idCours);
return db.insert(TABLE_CERTIFICATION, null, values);
}

public String afficherCertification(){
Cursor c = db.query(true, TABLE_CERTIFICATION, selectCertification, null, null, null, null, null, null);
String message = "";
while(c.moveToNext()){
message += "Id: " + c.getInt(0) + "\n" +
"Designation: " + c.getString(1) + "\n" +
"IdCat: " + c.getInt(2) + "\n" +
"ICours: " + c.getInt(3);
}
return message;
}

/* Ajouter QUESTION_QUIZ*/
public long ajouterQuestion_Quiz(int idQuestion, int idQuiz){
ContentValues values = new ContentValues();
values.put(QUESTION_QUIZ_IDQUESTION, idQuestion);
values.put(QUESTION_QUIZ_IDQUIZ, idQuiz);
return db.insert(TABLE_QUESTION_QUIZ, null, values);
}

public void supprimerTableQuestion_Quiz(){
db.execSQL("DELETE FROM " + TABLE_QUESTION_QUIZ);
}

public String afficherQuestion_Quiz(String niveau){
String[] where = {"Question_Quiz.idQuestion", "Question_Quiz.idQuiz", niveau};

String sql = "SELECT designQuestion FROM Question, Quiz, Question_Quiz " +
"WHERE Question.idQuestion = Question_Quiz.idQuestion " +
"AND Quiz.idQuiz = Question_Quiz.idQuiz " +
"AND Quiz.niveauQuiz = '" + niveau + "'";

Cursor c = db.rawQuery(sql, null);
String message = "";
while(c.moveToNext()){
message += "design: " + c.getString(0) + "\n";
}
return message;
}


public Cursor getAllQuestionsParNiveau(String niveau){

String sql = "SELECT designQuestion FROM Question, Quiz, Question_Quiz " +
"WHERE Question.idQuestion = Question_Quiz.idQuestion " +
"AND Quiz.idQuiz = Question_Quiz.idQuiz " +
"AND Quiz.niveauQuiz = '" + niveau + "'";

return db.rawQuery(sql, null);
}

/*public String afficherQuestion_Quiz(String niveau){
String[] where = {"Question_Quiz.idQuestion", "Question_Quiz.idQuiz", niveau};

String sql = "SELECT * FROM Question_Quiz ";

Cursor c = db.rawQuery(sql, null);
String message = "";
while(c.moveToNext()){
message += "Quiz: " + c.getInt(0) + "\n" +
"Question: " + c.getInt(1) + "\n";
}
return message;
}
*/
/* Ajouter Quiz */
public long ajouterQuiz(String niveau, String date, int duree, int meileurNote, int idCertif){
ContentValues values = new ContentValues();
values.put(QUIZ_NIVEAU, niveau);
values.put(QUIZ_DATE, date);
values.put(QUIZ_DUREE, duree);
values.put(QUIZ_MEILLEUR_NOTE, meileurNote);
values.put(CERTIFICATION_ID, idCertif);
return db.insert(TABLE_QUIZ, null, values);
}

public String afficherQuiz(){
Cursor c = db.query(true, TABLE_QUIZ, selectQuiz, null, null, null, null, null, null);
String message = "";
while(c.moveToNext()){
message += "Id: " + c.getInt(0) + "\n" +
"Niveau: " + c.getString(1) + "\n" +
"Date: " + c.getString(2) + "\n" +
"Duree: " + c.getInt(3) + "\n" +
"Meilleur note: " + c.getInt(4) + "\n" +
"Certif: " + c.getInt(5);
}
return message;
}

/* Ajouter Question */
public long ajouterQuestion(String designation, int idPile){
ContentValues values = new ContentValues();
values.put(QUESTION_DESIGNATION, designation);
values.put(PILE_ID, idPile);
return db.insert(TABLE_QUESTION, null, values);
}

public String afficherQuestion(){
Cursor c = db.query(true, TABLE_QUESTION, selectQuestion, null, null, null, null, null, null);
String message = "";
while(c.moveToNext()){
message += "Id: " + c.getInt(0) + "\n" +
"Designation: " + c.getString(1) + "\n" +
"IdPile: " + c.getInt(2);
}
return message;
}

/* Ajouter Choix Question */
public long ajouterChoixQuestion(String designation, int isCorrect, int idQuestion){
ContentValues values = new ContentValues();
values.put(CHOIX_QUESTION_NOM, designation);
values.put(CHOIX_QUESTION_IS_CORRECT, isCorrect);
values.put(QUESTION_ID, idQuestion);
return db.insert(TABLE_CHOIX_QUESTION, null, values);
}

public String afficherChoixQuestion(){
Cursor c = db.query(true, TABLE_CHOIX_QUESTION, selectChoixQuestion, null, null, null, null, null, null);
String message = "";
while(c.moveToNext()){
message += "Id: " + c.getInt(0) + "\n" +
"Designation: " + c.getString(1) + "\n" +
"IsCorrect: " + c.getInt(2) + "\n" +
"idQuestion: " + c.getInt(3) + "\n";
}
return message;
}


public int modifierChoixQuestion(int idChoix, String designation, int isCorrect, int idQuestion){
ContentValues values = new ContentValues();
values.put(CHOIX_QUESTION_NOM, designation);
values.put(CHOIX_QUESTION_IS_CORRECT, isCorrect);
values.put(QUESTION_ID, idQuestion);
return db.update(TABLE_CHOIX_QUESTION, values, CHOIX_QUESTION_ID + "=" + idChoix, null);
}

public Cursor getAllCategories(){
return db.query(true, TABLE_CATEGORIE, selectCategories, null, null, null, null, null, null);
}

public String afficherCours(){
Cursor c = db.query(true, TABLE_COURS, selectCours, null, null, null, null, null, null);
String message = "";
while(c.moveToNext()){
message += "Id Cours: " + c.getInt(0) + "\n" +
"Designation: " + c.getString(1) + "\n" +
"Contenu: " + c.getString(1) + "\n" +
"Id Cat: " + c.getInt(3) + "\n";
}
return message;
}

public void close() {
helper.close();
}

private static class DBHelper extends SQLiteOpenHelper{

public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}

@SuppressLint("NewApi")
@Override
public void onConfigure(SQLiteDatabase _db) {
// TODO Auto-generated method stub
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
_db.setForeignKeyConstraintsEnabled(true);
} else {
_db.execSQL("PRAGMA foreign_keys=ON");
}
}

@Override
public void onOpen(SQLiteDatabase _db) {
// TODO Auto-generated method stub
super.onOpen(_db);
if (!_db.isReadOnly()) {
// Enable foreign key constraints
_db.execSQL("PRAGMA foreign_keys=ON;");
}
}

@Override
public void onCreate(SQLiteDatabase _db) {
// TODO Auto-generated method stub
try{
_db.execSQL(CREATE_CATEGORIE);
_db.execSQL(CREATE_COURS);
_db.execSQL(CREATE_CERTIFICATION);
_db.execSQL(CREATE_PILE);
_db.execSQL(CREATE_QUESTION);
_db.execSQL(CREATE_CHOIX_QUESTION);
_db.execSQL(CREATE_QUIZ);
_db.execSQL(CREATE_QUESTION_QUIZ);
}
catch(SQLException se){
System.out.println(se.getMessage());
}
}

@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
/*_db.execSQL("DROP TABLE IF EXISTS " + TABLE_CATEGORIE);
_db.execSQL("DROP TABLE IF EXISTS " + TABLE_COURS);
_db.execSQL("DROP TABLE IF EXISTS " + TABLE_CERTIFICATION);
_db.execSQL("DROP TABLE IF EXISTS " + TABLE_PILE);
_db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUESTION);
_db.execSQL("DROP TABLE IF EXISTS " + TABLE_CHOIX_QUESTION);
_db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUIZ);
_db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUESTION_QUIZ);

onCreate(_db);*/
}

}


}


And here is MainActivity:



package com.example.quiz;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

private Button quiz;
private Button pile;
private Button cours;
private Button quitter;

private Context context = this;
private DBAdapter adapter;
private Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

try{
adapter = new DBAdapter(context);
adapter.open();
adapter.ajouterCategorie("Java", "POO, jeux, animations, DAO, ...");
adapter.ajouterCategorie("Linux", "Commandes de bases, Shell, gestion des fichiers, ...");
adapter.ajouterCategorie("Reseaux", "Administration, adressages, sécurité, ...");
adapter.ajouterCategorie("C#", "DAO, débogage, multithreading, ...");

adapter.ajouterCours("Java", "Contenu java", 1);
adapter.ajouterCertification("Certification JAVA", 1, 1);
adapter.ajouterPile("Java", 1);
adapter.ajouterQuiz("Débutant", "29/03/2015", 1, 0, 1);
adapter.ajouterQuestion("C'est quoi un objet static?", 1);
adapter.ajouterChoixQuestion("C'est un objet constant", 0, 1);
adapter.ajouterChoixQuestion("C'est un objet accessible partout", 1, 1);
adapter.ajouterChoixQuestion("C'est un objet abstrait", 0, 1);
adapter.ajouterChoixQuestion("C'est un objet non instancié", 0, 1);

adapter.ajouterQuestion("Qui n'est pas une boucle??", 1);
adapter.ajouterChoixQuestion("for", 0, 1);
adapter.ajouterChoixQuestion("break", 1, 1);
adapter.ajouterChoixQuestion("while", 0, 1);
adapter.ajouterChoixQuestion("do while", 0, 1);
adapter.ajouterQuestion_Quiz(1, 1);
adapter.ajouterQuestion_Quiz(2, 1);
adapter.ajouterQuestion_Quiz(1, 2);
adapter.ajouterQuestion_Quiz(1, 3);
adapter.ajouterQuestion_Quiz(1, 4);
adapter.ajouterQuestion_Quiz(1, 5);
}
catch(SQLException se){
Toast.makeText(this, "Erreur !", Toast.LENGTH_LONG).show();
}

quiz = (Button)findViewById(R.id.btnQuiz);
pile = (Button)findViewById(R.id.btnPile);
cours = (Button)findViewById(R.id.btnCours);
quitter = (Button)findViewById(R.id.btnQuitter);

quiz.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
intent = new Intent(MainActivity.this, CategoriesQuiz.class);
startActivity(intent);
}
});

pile.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
intent = new Intent(MainActivity.this, PilesQuiz.class);
startActivity(intent);
}
});

cours.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
intent = new Intent(MainActivity.this, CoursQuiz.class);
startActivity(intent);
}
});

quitter.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
System.exit(0);
}
});
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
adapter.close();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}


Aucun commentaire:

Enregistrer un commentaire