你好, 我从SQL数据库开始,我有这个错误
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor
android.database.sqlite.SQLiteDatabase.query(java.lang.String,
java.lang.String[], java.lang.String, java.lang.String[], java.lang.String,
java.lang.String, java.lang.String)' on a null object reference
at francoisdexemple.compteurdepointtarot.GamesBDD.find_joueur_or_create(GamesBDD.java:273)
第273行=
Cursor c = bdd.query(TABLE_GAME, new String[]{COL_ID_JOUEUR, COL_NOM_JOUEUR},
COL_NOM_JOUEUR + "= " + nom_joueur, null, null, null, null);
这是我使用数据库的课程。 (我在这里删除了一些不必要的代码)
GameBDD.java:
public class GamesBDD {
private static final int VERSION_BDD = 1;
private static final String NOM_BDD = "games.db";
private static final String TABLE_GAME = "table_GAME";
private static final String COL_ID_GAME = "ID";
private static final int NUM_COL_ID_GAME = 0;
private static final String COL_NB_JOUEURS = "Nb joueurs";
private static final int NUM_COL_NB_JOUEURS =1;
private static final String COL_ID_JOUEURS = "Noms des joueurs";
private static final int NUM_COL_ID_JOUEURS = 2;
private static final String COL_ID_TOUR = "Numéro du tour";
private static final int NUM_COL_ID_TOUR =3;
private static final String COL_PRENEUR = "Preneur";
private static final int NUM_COL_PRENEUR =4;
private static final String COL_CONTRAT = "Contrats";
private static final int NUM_COL_CONTRAT =5;
private static final String COL_BOUTS = "Bouts";
private static final int NUM_COL_BOUTS =6;
private static final String COL_PETIT = "0";
private static final int NUM_COL_PETIT =7;
private static final String COL_21 = "0";
private static final int NUM_COL_21 = 8;
private static final String COL_ESXCUSE = "0";
private static final int NUM_COL_ESXCUSE = 9;
private static final String COL_POINTS = "Points";
private static final int NUM_COL_POINTS =10;
private static final String COL_JOUEUR_APPELE = "Joueurs appelé";
private static final int NUM_COL_JOUEUR_APPELE =11;
private static final String COL_JOUEUR_1 ="j1";
private static final int NUM_COL_JOUEUR_1=12;
private static final String COL_JOUEUR_2="j2";
private static final int NUM_COL_JOUEUR_2=13;
private static final String COL_JOUEUR_3="j3";
private static final int NUM_COL_JOUEUR_3=14;
private static final String COL_JOUEUR_4="j4";
private static final int NUM_COL_JOUEUR_4=15;
private static final String COL_JOUEUR_5="j5";
private static final int NUM_COL_JOUEUR_5=16;
private static final String TABLE_JOUEURS ="table_JOUEURS";
private static final String COL_ID_JOUEUR ="ID";
private static final int NUM_COL_ID_JOUEUR =0;
private static final String COL_NOM_JOUEUR ="Nom Joueur";
private static final int NUM_COL_NOM_JOUEUR =1;
private static SQLiteDatabase bdd;
private BaseSQL BaseSQL;
public GamesBDD(Context context){
//On créer la BDD et sa table
BaseSQL = new BaseSQL(context, NOM_BDD, null, VERSION_BDD);
}
public void open(){
//on ouvre la BDD en écriture
bdd = BaseSQL.getWritableDatabase();
}
public void close(){
//on ferme l'accès à la BDD
bdd.close();
}
public SQLiteDatabase getBDD(){
return bdd;
}
//break in code
public int find_joueur_or_create (String nom_joueur)
{
//Récupère dans un Cursor les valeur correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre)
***Cursor c = bdd.query(TABLE_GAME, new String[]{COL_ID_JOUEUR, COL_NOM_JOUEUR},
COL_NOM_JOUEUR + "= " + nom_joueur, null, null, null, null);***
//si aucun élément n'a été retourné dans la requête, on renvoie null
if (c.getCount() == 0) {
Log.d("BDD", "FAIL RECHERCHE : aucun joueur trouvé ...");
return create_joueur(nom_joueur).getId();
}
//Sinon on se place sur le premier élément
c.moveToFirst();
//On créé un livre
//on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
Joueur joueur = new Joueur(Integer.parseInt(c.getString(NUM_COL_ID_JOUEUR)),c.getString(NUM_COL_NOM_JOUEUR));
//On ferme le cursor
c.close();
return joueur.getId();
}
public Joueur create_joueur(String nom_joueur){
final SQLiteStatement stmt = bdd
.compileStatement("SELECT MAX("+ COL_ID_GAME +") FROM"+ TABLE_JOUEURS );
int id = Integer.parseInt( stmt.simpleQueryForString());
//Création d'un ContentValues (fonctionne comme une HashMap)
ContentValues values = new ContentValues();
//on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
values.put(COL_ID_JOUEUR, id);
values.put(COL_NOM_JOUEUR, nom_joueur);
//on insère l'objet dans la BDD via le ContentValues
bdd.insert(TABLE_JOUEURS, null, values);
return new Joueur(id,nom_joueur);
}
}
和BaseSQL.java
public class BaseSQL extends SQLiteOpenHelper {
private static final String TABLE_GAME = "table_GAME";
private static final String COL_ID_GAME = "ID";
private static final String COL_NB_JOUEURS = "Nb joueurs";
private static final String COL_ID_TOUR = "Numéro du tour";
private static final String COL_PRENEUR = "Preneur";
private static final String COL_CONTRAT = "Contrats";
private static final String COL_BOUTS = "Bouts";
private static final String COL_PETIT = "Petit";
private static final String COL_21 = "21";
private static final String COL_ESXCUSE = "Escuse";
private static final String COL_POINTS = "Points";
private static final String COL_JOUEUR_APPELE = "Joueurs appelé";
private static final String COL_JOUEUR_1 ="j1";
private static final String COL_JOUEUR_2="j2";
private static final String COL_JOUEUR_3="j3";
private static final String COL_JOUEUR_4="j4";
private static final String COL_JOUEUR_5="j5";
private static final String TABLE_JOUEURS ="table_JOUEURS";
private static final String COL_ID_JOUEURS ="ID";
private static final String COL_NOMS_JOUEURS ="Noms des joueurs";
private static final String Table1 = "CREATE TABLE " + TABLE_GAME + " ( Partie numéro :"
+ COL_ID_GAME + " , Nombre de joueurs : " + COL_NB_JOUEURS + ". Numéro du tour : "
+ COL_ID_TOUR + ", le preneur est : "+ COL_PRENEUR + "il a fait une "+ COL_CONTRAT +" avec " +COL_BOUTS + " : "+COL_PETIT+" et "+COL_21+" et "+COL_ESXCUSE+
". Il a fait "+COL_POINTS+" avec " +COL_JOUEUR_APPELE +". Les joueurs sont :"+COL_JOUEUR_1+","+COL_JOUEUR_2+","+COL_JOUEUR_3+","+COL_JOUEUR_4+","+COL_JOUEUR_5+");";
private static final String Table2 =" CREATE TABLE "+ TABLE_JOUEURS +" ( ID du joueur " + COL_ID_JOUEURS +", nom du joueur : "+COL_NOMS_JOUEURS+");";
public BaseSQL(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//on créé la table à partir de la requête écrite dans la variable CREATE_BDD
db.execSQL(Table1);
db.execSQL(Table2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//On peut fait ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer
//comme ça lorsque je change la version les id repartent de 0
Log.w(BaseSQL.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE " + TABLE_GAME + ";");
db.execSQL("DROP TABLE " + TABLE_JOUEURS + ";");
onCreate(db);
}
}
我确定这是一个错误,谢谢你的帮助!
答案 0 :(得分:0)
在下面一行中,bdd为空: -
bdd.query(
使用null对象引用,您尝试执行查询。
在执行查询之前,您没有调用以下方法: -
public void open(){
//on ouvre la BDD en écriture
bdd = BaseSQL.getWritableDatabase();
}
所以,bdd保持为null。