ID SQLite没有自动增量

时间:2016-06-17 16:34:47

标签: android sqlite unique

我有这段代码:

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;
    }
}

但是我不知道为什么id没有自动增量和colum id和colum nombre_nivel是唯一的但是db允许我插入具有相同名称的数据......问题是什么?

2 个答案:

答案 0 :(得分:1)

UNIQUE(_id, nombre_nivel)表示这些独立字段的组合是唯一的,而不是字段本身。

  

对于表上的每个UNIQUE约束,每行必须包含一个   由UNIQUE标识的列中唯一的值组合   约束

Source

尝试

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))

答案 1 :(得分:0)

更新您的字段TABLA_PUNTUACIONES以包含以下SQL

CREATE TABLE puntuaciones (
  _id INTEGER PRIMARY KEY,
  nombre_juego TEXT NOT NULL,
  nombre_nivel TEXT NOT NULL,
  puntos INTEGER NOT NULL,
  UNIQUE (nombre_nivel) ON CONFLICT FAIL
);

_id将自动增量。

nombre_nivel将是唯一的。