带有SQL

时间:2015-08-23 18:52:28

标签: java android sql database sqlite

你好, 我从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);
}

}

我确定这是一个错误,谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

在下面一行中,bdd为空: -

  

bdd.query(

使用null对象引用,您尝试执行查询。

在执行查询之前,您没有调用以下方法: -

 public void open(){
        //on ouvre la BDD en écriture
        bdd = BaseSQL.getWritableDatabase();
    }

所以,bdd保持为null。