Jessica MC Jessica MC - 5 months ago 22
Android Question

ID SQLite doesn't autoincrement

I have this code:

package com.example.jessi.moopooh;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

/**
* Created by jessi on 17/06/2016.
*/
public class BDJuego extends SQLiteOpenHelper {
private static final String NOMBRE_BD = "bdmoopooh.db";
private static final int VERSION_BD = 1;
private static final String TABLA_PUNTUACIONES = "CREATE TABLE puntuaciones" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nombre_juego TEXT NOT NULL, nombre_nivel TEXT NOT NULL, puntos INTEGER NOT NULL, UNIQUE(_id, nombre_nivel))";

public BDJuego(Context context) {
super(context, NOMBRE_BD, null, VERSION_BD);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLA_PUNTUACIONES);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLA_PUNTUACIONES);
onCreate(db);

}

public void insertarPuntuaciones(String nombre_juego, String nombre_nivel, int puntos) {
SQLiteDatabase db = getWritableDatabase();
if(db != null){
ContentValues valores = new ContentValues(); //como su nombre indica es un almacenador de un conjunto de datos
//valores.put("_id", id);
valores.put("nombre_juego", nombre_juego);
valores.put("nombre_nivel", nombre_nivel);
valores.put("puntos", puntos);
db.insert("puntuaciones", null, valores);
db.close();
}
}

//Este método no sé si lo usaré
public void modificarPuntuaciones(int id,String nombre_juego, String nombre_nivel, int puntos){
SQLiteDatabase db = getWritableDatabase();
ContentValues valores = new ContentValues();
// valores.put("_id", id);
valores.put("nombre_juego", nombre_juego);
valores.put("nombre_nivel", nombre_nivel);
valores.put("puntos", puntos);
db.update("puntuaciones", valores, "_id=" + id, null);
db.close();
}
//Este método no sé si lo usaré
public void borrarPuntuaciones(int id) {
SQLiteDatabase db = getWritableDatabase();
db.delete("puntuaciones", "_id="+id, null);
db.close();
}
//Recuperar solo una puntuacion. No sé si lo usaré
public Puntuaciones recuperarPuntuacion(int id) {
SQLiteDatabase db = getReadableDatabase();
String[] valores_recuperar = {"_id", "nombre_juego", "nombre_nivel", "puntos"};
Cursor c = db.query("contactos", valores_recuperar, "_id=" + id,
null, null, null, null, null); // El método query nos devolverá un Cursor que podremos recorrer para recuperar todos los registros de la base de datos
if(c != null) {
c.moveToFirst();
}
Puntuaciones puntuaciones = new Puntuaciones(c.getString(1),
c.getString(2), c.getInt(3));
db.close();
c.close();
return puntuaciones;
}

//Recuperar todas las puntuaciones
public List<Puntuaciones> recuperarTodasLasPuntuaciones() {
SQLiteDatabase db = getReadableDatabase();
List<Puntuaciones> lista_puntuaciones = new ArrayList<Puntuaciones>();
String[] valores_recuperar = {"_id", "nombre_juego", "nombre_nivel", "puntos"};
Cursor c = db.query("puntuaciones", valores_recuperar,
null, null, null, null, null, null);
c.moveToFirst();
do {
Puntuaciones puntuaciones = new Puntuaciones(c.getString(1),
c.getString(2), c.getInt(3));
lista_puntuaciones.add(puntuaciones);
} while (c.moveToNext());
db.close();
c.close();
return lista_puntuaciones;
}
}


But I don't know why id doesn't autoincrement and colum id and colum nombre_nivel are unique but the db allow me insert data with the same name... what is the problem?

Answer

UNIQUE(_id, nombre_nivel) means the combination of those independent fields are unique, not the fields themselves.

For each UNIQUE constraint on the table, each row must contain a unique combination of values in the columns identified by the UNIQUE constraint.

Source

Try with

CREATE TABLE puntuaciones(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nombre_juego TEXT NOT NULL, nombre_nivel TEXT NOT NULL, puntos INTEGER NOT NULL, UNIQUE(nombre_nivel))
Comments