2010-09-21 7 views
19

Je voudrais mettre à jour ma base de données sql lite avec la méthode update-native de la classe SQLiteDatabase d'android.mettre à jour la base de données sql avec ContentValues ​​et la méthode de mise à jour

ContentValues dataToInsert = new ContentValues();       
dataToInsert.put("name", "flo"); 
dataToInsert.put("location", "flotown"); 
String where = "id" + "=" + id; 
try{  
    db.update(DATABASE_TABLE, dataToInsert, where, null); 
} 
catch (Exception e){ 
    String error = e.getMessage().toString(); 
} 

mais je reçois l'erreur suivante: android.database.sqlite.SQLiteException: près de "15": erreur de syntaxe:, lors de la compilation: UPDATE emplacement matable SET = ?, name =? WHERE id = 2010-09-21 15: 05: 36.995

Je ne sais pas quel devrait être le problème. D'une certaine manière, les valeurs n'arrivent pas dans l'instruction sql. J'ai fait presque la même chose avec la méthode d'insertion et cela a fonctionné très bien.

beaucoup thx, florian

+5

Je sais que c'est ancien poste, mais vous ne devriez jamais utilisateur « id » utilisation « _id » au lieu. "_id" est un identifiant commun pour les bases de données sous Android et recommandé. – Jona

Répondre

45

Vous utilisez la fonction de mise à jour erronée. Cela devrait être comme ceci:

String where = "id=?"; 
String[] whereArgs = new String[] {String.valueOf(id)}; 

db.update(DATABASE_TABLE, dataToInsert, where, whereArgs); 

Les chaînes du tableau whereArgs sont remplacées par chaque '?' dans la variable où.

ie. si vous aviez où = "name =? ET type =? alors le premier '?' serait obtenir remplacé par whereArgs [0] et le second par whereArgs [1]

+0

"Impossible d'invoquer toString() sur le type primitif long" – Mirko

+1

@Mirko: Utilisez 'Long.toString (id)' à la place! –

4

En fait, il vous suffit d'ajouter des apostrophes à votre clause where donc il devrait être:.. (note

String where = "id='" + id + "'" 

: cependant, ce n'est pas la meilleure pratique, car elle laisse théoriquement ouverte aux attaques par injection)

0

fait exactement ce que vous écrit est correct. La syntaxe est correcte. Mais vous devez vérifier ces derniers. chaîne où = « id » + "=" + id; Dans la déclaration ci-dessus "id" devrait être le type et le numéro d'identification devrait être int. Et si id est un type de texte, suivez @Adam javin answer.

0

J'ai une autre approche

public boolean updateEmployee(TalebeDataUser fav) { 

    SQLiteDatabase database = dbHelper.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DBHelper.COLUMN_ID, fav.getId()); 
    contentValues.put(DBHelper.COLUM_AD, fav.getAd()); 
    contentValues.put(DBHelper.COLUMN_NUMARA, fav.getNumara()); 
    contentValues.put(DBHelper.COLUMN_YURD_ID, fav.getYurtID()); 
    contentValues.put(DBHelper.COLUMN_EGITIM_ID, fav.getEgitimTur()); 
    contentValues.put(DBHelper.COLUMN_TEL, fav.getTel()); 
    contentValues.put(DBHelper.COLUMN_EMAIL, fav.getEmail()); 
    contentValues.put(DBHelper.COLUMN_ADDRESS, fav.getAdres()); 

    String whereClause = DBHelper.COLUM_AD + " = ? AND " + DBHelper.COLUMN_NUMARA + " = ? "; 
    final String whereArgs[] = {fav.getAd(), String.valueOf(fav.getNumara())};// old nameler taranıyor 
    int affectedRows = database.update(DBHelper.TABLE_NAME_OGR, contentValues, whereClause, whereArgs); 
    return affectedRows > 0; 
} 
Questions connexes