我有这段代码:
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允许我插入具有相同名称的数据......问题是什么?
答案 0 :(得分:1)
UNIQUE(_id, nombre_nivel)
表示这些独立字段的组合是唯一的,而不是字段本身。
对于表上的每个UNIQUE约束,每行必须包含一个 由UNIQUE标识的列中唯一的值组合 约束
尝试
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
将是唯一的。