J'ai la classe d'assistance DB suivante:
public int studentExists(String studid) {
Cursor dataCount = mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=" + studid, null);
dataCount.moveToFirst();
int count = dataCount.getInt(0);
dataCount.close();
return count;
}
J'utilise cela dans mon application pour voir si un identifiant d'étudiant a déjà été entré.
Cela fonctionne bien lorsque les identifiants d'étudiant sont ints (346742), mais chaque fois que j'essaie d'ajouter un identifiant alphanumérique (PB3874), il ferme l'application.
Erreur:
06-13 18: 22: 20.554: ERREUR/AndroidRuntime (8088): Android.database.sqlite.SQLiteException: aucune colonne de ce type: pb3874:, lors de la compilation: sélectionnez le nombre (*) à partir de la table usable où studid = pb3874
Je ne pense pas que ce soit un problème de type de données (parce que j'utilise le type de texte):
private static final String DATABASE_CREATE =
"create table usertable (_id integer primary key autoincrement, "
+ "studid text not null);";
Mais je ne comprends pas pourquoi l'erreur indique no such column: pb3874
car j'essaie simplement de sélectionner cette valeur dans la colonne studid. Et aussi pourquoi cela fonctionne parfaitement pour toute valeur int. Quelqu'un a un conseil de résolution de problème?
Ce qui se passe ici, c'est que SQLite pense que "pb3874" est en réalité un nom de colonne, plutôt qu'un littéral chaîne/texte.
Pour spécifier qu'il s'agit d'un littéral de texte, vous devez vous assurer que votre valeur de texte est encadrée par les guillemets simples appropriés:
Pour empêcher les attaques par injection SQL, utilisez une requête paramétrée chaque fois que vous prenez des entrées de l'utilisateur:
("select count(*) from usertable where " + KEY_STUDID + "=?", studid);
Sans paramétrage (très déconseillé lors de la saisie de l'utilisateur):
("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null);
La raison pour laquelle vos valeurs numériques n'ont pas produit ceci: SQLite a converti ces littéraux numériques pour vous.
Vous devez citer 'pb3874' (guillemets simples) si vous l'incluez dans la chaîne SQL.
Je pense que vous avez obtenu la réponse de Antlersoft ou de p.campbell à la formulation correcte de la requête, comme suit:
mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=?", studid);
Cela devrait (1) résoudre votre problème et (2) vous protéger contre les injections SQL
Aussi, je ne suis pas sûr que
dataCount.getInt(0);
est la meilleure chose à faire ... vous devriez probablement utiliser getColumnIndex
pour vous assurer d'obtenir les bonnes données ...
pour STRING, placez-le entre '' ('sasas')
select * from bio where email = 'sasas'