Android: SQLite - insertWithOnConflict
Je fais appel insertWithOnConflict, à l'aide de SQLiteDatabase.CONFLICT_IGNORE. Toutefois, lorsqu'un conflit se produit "-1" est renvoyée au lieu de l'id de la ligne existante. Comment puis-je corriger cela?
La création de la Table:
EDIT :
String CREATE_CATEGORY_TABLE = "CREATE TABLE "+TABLE_CATEGORY+"(" +
BaseColumns._ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
KEY_CATEGORY_NAME+" TEXT UNIQUE" +
")";
db.execSQL(CREATE_CATEGORY_TABLE);
Instruction Insert:
ContentValues values = new ContentValues();
values.put(KEY_CATEGORY_NAME, name);
int catID = (int) db.insertWithOnConflict(TABLE_CATEGORY, null, values, SQLiteDatabase.CONFLICT_IGNORE);
Une valeur de retour -1 signifie qu'une erreur s'est produite. Est-il aussi renvoie -1 si vous insérez un unique (non contradictoires) ligne?
Borland : Non. Non contradictoires insérez sera de retour le bon id de ligne.
Borland : Non. Non contradictoires insérez sera de retour le bon id de ligne.
OriginalL'auteur meeeee | 2012-09-11
Vous devez vous connecter pour publier un commentaire.
insertWithOnConflict, à l'aide de SQLiteDatabase.CONFLICT_IGNORE ne fonctionne pas comme prévu et devrait probablement être évités que par cette question:
https://code.google.com/p/android/issues/detail?id=13045
OriginalL'auteur Tom
SQLiteDatabase.CONFLICT_IGNORE commentaire est censé fonctionner de la même façon que l'on avait observé. Tout en essayant d'insérer, si il n'y a aucun conflit d'affilée, puis il insère une nouvelle ligne avec les valeurs de donnée et renvoie l'id de la ligne nouvellement insérée. D'autre part, si il y a déjà une ligne en conflit (avec la même clé unique), puis les valeurs entrantes sera ignorée et la ligne existante sera conservée et puis la valeur de retour sera -1 pour indiquer un conflit. Pour connaître plus de détails et de comprendre comment gérer cette valeur de retour, veuillez lire Android/SQLite: Insert mise à Jour des colonnes de la table pour garder l'identifiant
OriginalL'auteur tony m
Android attend de la colonne de clé primaire pour être appelé
_id
. Peut-être la cause: depuis que la colonne n'existe pas, il ne peut pas retourner la valeur et renvoie -1.OriginalL'auteur znat
La solution de contournement que j'ai utilisé est à l'aide de
insertOrThrow
au lieu deinsertWithOnConflict
, et explicitement attraperSQLiteConstraintException
. Vous devez explicitement l'attraper, car il hérite deRuntimeException
.J'ai eu à utiliser cette solution de contournement car
insert
était un dump de la base de données pour les journaux lorsqu'il y a conflit, ce qui était inacceptable.OriginalL'auteur Ariel Cabib
Je suis toujours en mesure d'obtenir la ligne insérée dans la base de données, le CONFLICT_IGNORE ne fonctionne pas comme prévu @Tom est juste, mais je ne suis pas sûr que ce problème a été résolu
OriginalL'auteur user2664843