2015-08-23 1 views
-3

Здравствуйте, я начать с базой данных SQL и у меня есть эта ошибкаAndroid базы данных с нулевым 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

В строке ниже BDD равен нуль: -

bdd.query (

С нулевой ссылкой на объект, который вы пытаетесь выполнить запрос

Вы не звоните. ниже метода до выполнения запроса: -

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

Итак, bdd остается как null.

+0

Да, но как создать экземпляр базы данных SQL, он не создает экземпляр какой-либо программы для установки приложения? Это то, что ускользает от меня. Мне просто нужно открыть пробел раньше? – filol

+0

Да, это так, я такой глупый! – filol

+0

Хорошо, поэтому ваша проблема решена ;-) –

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