查询的java.lang.NullPointerException错误

时间:2012-06-08 12:15:11

标签: java android sqlite

我准备为android开发我的第二个应用程序,我想使用数据库。但我被错误阻止了。

这是班级:

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

            }

    }


}

这是主要感兴趣的一部分:

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



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


   }

当我启动应用程序时,它会返回以下错误:

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

有什么问题? Tnx并原谅我的一些错误,这是我在Stackoverflow上的第一个请求。

3 个答案:

答案 0 :(得分:7)

这是你的问题:

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

您正在重写SQLiteDatabase类getWritableDatabase方法并且不执行任何操作(不打开数据库或其他任何内容)返回null,这样就会导致NPE。

删除该方法,您的NPE应该消失。

答案 1 :(得分:1)

使用您向我们展示的代码,唯一的可能性是当您调用listaParametri时SQLiteDatabase mDb为null。在调用listaParametri之前,您确定要创建对象吗?

答案 2 :(得分: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();