2016-06-17 7 views
0

を自動インクリメントしません:ID SQLiteの私はこのコードを持っている

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はユニークですが、デシベルは私が持つデータを挿入できるように同じ名前...問題は何ですか?

答えて

1

UNIQUE(_id, nombre_nivel)は、これらの独立したフィールドの組み合わせがフィールド自体ではなくユニークであることを意味します。

テーブル上の各固有の制約のために、各行は、一意 制約によって指定された列の値の ユニークな組み合わせを含んでいなければなりません。

Source

SQLを含むように、あなたのフィールド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(nombre_nivel)) 
+0

これだけです!どうもありがとう! –

+0

しかし、IDは常に0です。https://gyazo.com/18cd89ac69b41db86a63abac0a93712e –

+0

私はそれを試して、うまく動作します。既存のテーブルを削除して再度作成するようにしてください。あなたはそれをチェックするためにデータベースを引き出すことができます。 – m0skit0

0

で試してみてください:

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は一意になります。

+0

助けてくれてありがとうIDが常に0で、私はなぜこれが起こるのかわからない:/ logcatは私にこれを言う:https://gyazo.com/18cd89ac69b41db86a63abac0a93712e –

関連する問題