IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème BDD SQLite


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    etuidiant
    Inscrit en
    Octobre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : etuidiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 64
    Points : 50
    Points
    50
    Par défaut Problème BDD SQLite
    Salut à tous, j'essaye d'utiliser une base de données sqlite mais j'ai un petit probleme au niveau d'une de mes méthodes ou la requete ne passe pas ... je ne comprend pas bien le probleme voici le code de ma dbhelper :

    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
     
    public class DatabaseHelper extends SQLiteOpenHelper{
     
    	static final String dbName = "DB_snsr"; // nom de la bdd
    	private static final int DATABASE_VERSION = 1; // Version BDD (a incrémenter lorsque l'on modifie sa BDD)
     
    	/* TABLE USER */
    	static final String userTable = "Users";
     
    	static final String colUserID = "UserID";
    	static final String colLogin = "UserLogin";
    	static final String colPwd = "UserPwd";
     
     
    	public DatabaseHelper(Context context) {
    		super(context, dbName, null,DATABASE_VERSION);
     
    	}
     
    	public void onCreate(SQLiteDatabase db) {
    		// TODO Auto-generated method stub
     
    		db.execSQL("CREATE TABLE " + userTable + " (" + colUserID
    				+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + colLogin
    				+ " TEXT, " + colPwd + " TEXT)");
     
    		// Inserts pre-defined user
    		InsertPreUser(db);
     
    	}
     
    	void InsertPreUser(SQLiteDatabase db) {
    		// TODO Auto-generated method stub
     
    		ContentValues cv = new ContentValues();
    		cv.put(colUserID, 1);
    		cv.put(colLogin, "Karl");
    		cv.put(colPwd, "Karl");
    		db.insert(userTable, colUserID, cv);
    	}
     
     
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		// TODO Auto-generated method stub
     
    		db.execSQL("DROP TABLE IF EXISTS " + userTable);
     
    		onCreate(db);
     
    	}
     
     
     
    }
    ensuite j'ai une classe USER ou je veux mettre des méthodes static pour pouvoir interagir avec la base de données :

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
     
    public class User {
     
    	private long id;
    	private String login;
    	private String pwd;
     
     
    	/* TABLE USER */
    	static final String userTable = "Users";
     
    	static final String colUserID = "UserID";
    	static final String colLogin = "UserLogin";
    	static final String colPwd = "UserPwd";
     
    	// ////////////////
    	/* Constructeur */
    	// ////////////////
     
    	public User(long id, String login, String pwd) {
     
    		this.id = id;
    		this.login = login;
    		this.pwd = pwd;
     
     
    	}
     
    	// ////////////////////
    	/* Getter et Setter */
    	// ////////////////////
     
    	public long getId() {
    		return id;
    	}
     
    	public void setId(long id) {
    		this.id = id;
    	}
     
    	public String getLogin() {
    		return login;
    	}
     
    	public void setLogin(String login) {
    		this.login = login;
    	}
     
    	public String getPwd() {
    		return pwd;
    	}
     
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
     
    	// ////////////////////
    	/*	   METHODES	     */
    	// ////////////////////
     
     
    	public static long VerifUser4(Context con) {
     
    		DatabaseHelper dbh=new DatabaseHelper(con);
     
    		SQLiteDatabase db= dbh.getWritableDatabase();
     
    		Cursor c = db.rawQuery("Select * from "+ userTable, null);
     
    		long x= c.getCount();
    		db.close();
    		return x; // valeur impossible
    	}
     
     
    	// Static comme ca on doit pas instancier l'objet pour utiliser la fonction
    	public static String VerifUser2(Context con) {
     
    		DatabaseHelper dbh=new DatabaseHelper(con);
     
    		SQLiteDatabase db= dbh.getWritableDatabase();	
     
    		Cursor c = db.rawQuery("Select * from "+ userTable, null);	
     
    		if (c != null && c.getCount() > 0) {
     
    		String x = c.getString(c.getColumnIndex(DatabaseHelper.colLogin));
     
    		try{
    		return x;
    		}catch(Exception e){
     
    			return "foirage";} 
    		}
    		db.close();
     
    		return "blabla";
    	}
    }

    ma méthode VerifUser4 renvoie bien "1" donc il y a bien des données dans ma BDD parcontre je recois cette erreur avec verifUser2 :
    android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

    Donc un probleme a ce niveau là : c.getColumnIndex(DatabaseHelper.colLogin)

    mais il me parait logique de mettre "DatabaseHelper.colLogin" que j ai vu dans mal d'exemples ... Sinon je sais que le plus simple serait de mettre ma méthode dans le Dbhelper mais vu qu'il y aura beaucoup plus de table et donc beaucoup plus de méthode, j préfère les mettre dans les bonne classe directement ...

    Est ce que quelqu'un aurait une solution ?? Merci d'avance !

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je n'ai pas de solution miracle... on dirait qu'il ne trouve pas la colonne en question et comme tu ne geres pas le cas, (-1 sur le getIndex) tu choppes une runtime exception...

    Le try il sert pas à grand chose, d'ailleurs eclipse devrait mettre un gros warning (erreur chez moi) pour un try inutile autour d'un code qui n’envoie pas d'exception !

    Bon... sinon, il existe une règle de SGBD: on ne fait *jamais* de "select *"... La raison est que: ca peut être lent pour par grand chose, et surtout que rien ne force la BD à renvoyer les colonnes toujours dans le même ordre (bon c'est quand même le cas, soit, mais en général "on ne sait pas comment les colonnes seront retournées").

    Essayes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try {
        Cursor c = db.rawQuery("Select "+DatabaseHelper.colLogin+" from " + userTable, null);
        if (c != null && c.getCount() > 0) {
            c.moveToFirst();
            return c.getString(0);
        }
    } catch(Exception e) {
       Log.e("MonApp","Foirage",e);
    }
    Enfin, derniere remarque, on a pour habitude de mettre les static final en majuscules (comme les enums), histoire de bien différencier d'une variable/fonction.
    Et effectivement, je mettrais plutot les statiques dans l'objet User... et non dand DbHelper...

    Haaa oui... j'oubliai, pour l'identifiant je te conseille vivement d'utiliser "_ID" pour la colonne, la raison étant que ca t'évitera de surcharger tout un tas de truc pour utiliser les CursorAdapter et autres database content providers...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre du Club
    Homme Profil pro
    etuidiant
    Inscrit en
    Octobre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : etuidiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 64
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Je n'ai pas de solution miracle... on dirait qu'il ne trouve pas la colonne en question et comme tu ne geres pas le cas, (-1 sur le getIndex) tu choppes une runtime exception...

    Le try il sert pas à grand chose, d'ailleurs eclipse devrait mettre un gros warning (erreur chez moi) pour un try inutile autour d'un code qui n’envoie pas d'exception !

    Bon... sinon, il existe une règle de SGBD: on ne fait *jamais* de "select *"... La raison est que: ca peut être lent pour par grand chose, et surtout que rien ne force la BD à renvoyer les colonnes toujours dans le même ordre (bon c'est quand même le cas, soit, mais en général "on ne sait pas comment les colonnes seront retournées").

    Essayes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try {
        Cursor c = db.rawQuery("Select "+DatabaseHelper.colLogin+" from " + userTable, null);
        if (c != null && c.getCount() > 0) {
            c.moveToFirst();
            return c.getString(0);
        }
    } catch(Exception e) {
       Log.e("MonApp","Foirage",e);
    }
    Enfin, derniere remarque, on a pour habitude de mettre les static final en majuscules (comme les enums), histoire de bien différencier d'une variable/fonction.
    Et effectivement, je mettrais plutot les statiques dans l'objet User... et non dand DbHelper...

    Haaa oui... j'oubliai, pour l'identifiant je te conseille vivement d'utiliser "_ID" pour la colonne, la raison étant que ca t'évitera de surcharger tout un tas de truc pour utiliser les CursorAdapter et autres database content providers...


    Un grand merci d'avoir pris le temps de regarder mon code ;-) en fait j ai trouver l'erreur, comme tu l as toi même un indiqué : quand on récupère un Cursor, il est positionné avant la première ligne donc j'ai ajouté c.moveToFirst();

    Je n utiliserait pas de select * dans mon programme c'était juste pour un test et j'ai bien mi des "as _id" pour les identifiants sauf que colLogin n'est pas la clé primaire :p (bien qu'elle pourait l'être). Et pour les try catch j en avait mi juste pour repérer l'erreur (au lieu de betement regarder dans le LogCat oui oui je sais )

    Encore merci !!

Discussions similaires

  1. Problème de requête BDD SQLite
    Par torres02 dans le forum Android
    Réponses: 4
    Dernier message: 27/04/2015, 00h20
  2. [WM17] Problème avec tables de BDD SQLite
    Par tveniere dans le forum Windev Mobile
    Réponses: 6
    Dernier message: 04/10/2013, 08h22
  3. Réponses: 2
    Dernier message: 04/03/2013, 17h29
  4. Problème BDD bizarre
    Par helter_skelter dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 25/07/2005, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo