Jump to content

Archived

This topic is now archived and is closed to further replies.

Karly

Problème BDD sqlite

Recommended Posts

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 :


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 :



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 !

Share this post


Link to post
Share on other sites

Quand on récupère un Cursor, celui-ci est positionné avant la première ligne. Il faut donc le positionner sur la première ligne avant de récupérer une donnée

Donc, dans ton code (classe User), avant

String x = c.getString(c.getColumnIndex(DatabaseHelper.colLogin));

il faut que tu rajoutes

c.moveToFirst();

Share this post


Link to post
Share on other sites

Merci ! Dire que j'ai galéré pendant un bon bout de temps alors que j avais déjà utilisé ce code ! Je pensais qu on l utilisait que pour récupérer plusieurs données dans une boucles :P Encore merci !

Share this post


Link to post
Share on other sites





×
×
  • Create New...