3

我已准备好为 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 上的第一个请求。

4

3 回答 3

7

这是你的问题:

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

您正在覆盖 SQLiteDatabase 类getWritableDatabase方法并且在其中什么都不做(不打开数据库或任何东西)返回 null,因此会导致 NPE。

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

于 2012-06-08T12:33:39.243 回答
1

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

于 2012-06-08T12:21:34.607 回答
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();
于 2012-06-08T12:32:28.027 回答