2012-06-08 3 views
3

Je suis prêt à développer ma deuxième application pour Android, et je veux utiliser la base de données. Mais je suis bloqué par une erreur.java.lang.NullPointerException erreur sur une requête

C'est la classe:

public class MyDatabase { 

    SQLiteDatabase mDb; 
    DbHelper mDbHelper; 
    Context mContext; 
    private static final String DB_NAME="epsoftsms";//nome del db 
    private static final int DB_VERSION=1; //numero di versione del nostro db 

    public MyDatabase(Context ctx){ 
      mContext=ctx; 
      mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION); //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)  
    } 

    public void open(){ //il database su cui agiamo è leggibile/scrivibile 


     mDb=mDbHelper.getWritableDatabase(); 

    } 

    public void close(){ //chiudiamo il database su cui agiamo 
      mDb.close(); 
    } 


    //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione 
    // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento 


    public void inserimentoParametri(String parametro,String valore){ //metodo per inserire i dati 
      ContentValues cv=new ContentValues(); 
      cv.put(ParametriMetaData.PARAMETRO, parametro); 
      cv.put(ParametriMetaData.VALORE, valore); 
      mDb.insert(ParametriMetaData.TAB_PARAMETRI, null, cv); 
    } 

    public Cursor listaParametri(){ //metodo per fare la query di tutti i dati 



     return mDb.query(ParametriMetaData.TAB_PARAMETRI, null,null,null,null,null,null); 



    } 

    static class ParametriMetaData { // i metadati della tabella, accessibili ovunque 
      static final String TAB_PARAMETRI = "parametri"; 
      static final String PARAMETRO = "_parametro"; 
      static final String VALORE = "valore"; 

    } 

    private static final String CREA_TAB_PARAMETRI = "CREATE TABLE IF NOT EXISTS " //codice sql di creazione della tabella 
        + ParametriMetaData.TAB_PARAMETRI + " (" 
        + ParametriMetaData.PARAMETRO+ " text primary key, " 
        + ParametriMetaData.VALORE + " text not null);"; 

    private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db 

      public DbHelper(Context context, String name, CursorFactory factory,int version) { 
        super(context, name, factory, version); 
      } 

      public SQLiteDatabase getWritableDatabase() { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella 
        _db.execSQL(CREA_TAB_PARAMETRI); 
      } 

      @Override 
      public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione 

      } 

    } 


} 

Et cela fait partie des principaux intéressés:

final MyDatabase db=new MyDatabase(getApplicationContext()); 
    db.open(); //apriamo il db 



    if (db.listaParametri().getCount()==0) 
    { 


    } 

Lorsque je lance l'application, il renvoie les erreurs suivantes:

06-08 14:04:40.197: E/AndroidRuntime(1149): Uncaught handler: thread main exiting due to uncaught exception 
06-08 14:04:40.207: E/AndroidRuntime(1149): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.axiomatic.epsoft.sms/it.axiomatic.epsoft.sms.EpsoftSMSActivity}: java.lang.NullPointerException 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.access$1800(ActivityThread.java:112) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.os.Looper.loop(Looper.java:123) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at java.lang.reflect.Method.invoke(Method.java:521) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at dalvik.system.NativeStart.main(Native Method) 
06-08 14:04:40.207: E/AndroidRuntime(1149): Caused by: java.lang.NullPointerException 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at it.axiomatic.epsoft.sms.MyDatabase.listaParametri(MyDatabase.java:50) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at it.axiomatic.epsoft.sms.EpsoftSMSActivity.onCreate(EpsoftSMSActivity.java:30) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  ... 11 more 

Quelle est le problème? Tnx et pardonnez-moi pour une erreur, c'est ma première requête sur Stackoverflow.

+0

Apparemment 'mDbHelper.getWritableDatabase()' renvoie null; vous devez comprendre pourquoi. Vos paramètres pour le constructeur d'aide sont peut-être faux. –

+0

Je suis désolé mais qu'est-ce que vous voulez dire par "vos paramètres pour le constructeur d'aide sont faux"? –

+0

@Barak a donné la bonne réponse - voir ci-dessous! –

Répondre

7

Ceci est votre problème:

 public SQLiteDatabase getWritableDatabase() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

Vous redéfinissant la méthode de classe SQLiteDatabase getWritableDatabase et ne rien faire dans ce (ne pas ouvrir la base de données ou quoi que ce soit) et retour nulle, de sorte que cela conduit à un NPE.

Supprimez cette méthode et votre NPE devrait disparaître.

+0

JE VOUS CONVIENT DROIT !!!! TNX !!!!! –

1

Avec le code que vous nous avez montré, la seule possibilité est que SQLiteDatabase mDb est nulle lorsque vous appelez listaParametri. Êtes-vous sûr de créer l'objet avant d'appeler listaParametri?

+0

J'appelle la fonction db.open et ne renvoie jamais d'erreur. Mais comment puis-je savoir que le db est ouvert? Je n'ai rien trouvé de compréhensible :( –

0
// open or close database with create statement 
LD_ConstantData.db=openOrCreateDatabase(LD_ConstantData.dbName,SQLiteDatabase.CREATE_IF_NECESSARY,null); 
LD_ConstantData.sql = new LD_MySqlOpenHelper(LD_Multi.this, LD_ConstantData.dbName, null, 1); 
String sql="CREATE TABLE if not exists "+ LD_ConstantData.Table+"("+LD_ConstantData.colId+" INTEGER PRIMARY KEY AUTOINCREMENT,"+LD_ConstantData.coluserid+" TEXT NOT NULL,"+LD_ConstantData.colFirstName+" TEXT NOT NULL,"+LD_ConstantData.colLastName+" TEXT NOT NULL);"; 
LD_ConstantData.sql.create_table(sql);  
LD_ConstantData.db.close(); 
// for insert data 
    LD_ConstantData.sql = new LD_MySqlOpenHelper(context, database_name, null, database_version); 
     LD_ConstantData.db = LD_ConstantData.sql.getReadableDatabase(); 
LD_ConstantData.db.execSQL("INSERT INTO "+LD_ConstantData.Table +" VALUES(NULL,'"+userid+"','"+userfirstname+"','"+userlastname+"');"); 
     LD_ConstantData.db.close(); 
Questions connexes