我准备为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上的第一个请求。
答案 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();