2016-06-17 3 views
0

У меня есть этот код:ID SQLite не Autoincrement

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

Но я не знаю, почему идентификатор не Autoincrement и Колум идентификатор и Колум nombre_nivel уникальны, но дб позволяет мне вставить данные с то же имя ... в чем проблема?

ответ

1

UNIQUE(_id, nombre_nivel) означает, что сочетание этих независимых полей уникально, а не сами поля.

для каждого уникального ограничения на таблицу, каждая строка должна содержать уникальную комбинацию значений в столбцах, определенных 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)) 
+0

Вот и все! Большое спасибо! –

+0

Но идентификатор всегда равен 0. https://gyazo.com/18cd89ac69b41db86a63abac0a93712e –

+0

Я тестировал его, отлично работает. Убедитесь, что вы уронили ранее существовавшую таблицу, чтобы она была создана снова. Вы можете добавить базу данных, чтобы проверить ее. – m0skit0

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 будет autoincremented.

Столбец nombre_nivel будет уникальным.

+0

Спасибо за помощь, но id всегда равно 0, и я не знаю, почему это происходит:/Локальный скажите мне это: https://gyazo.com/18cd89ac69b41db86a63abac0a93712e –

Смежные вопросы