Android Sqlite java.lang.nullpointer异常

dun*_*ter 0 java eclipse sqlite android

我在Android eclipse中使用SQLite,但它在函数createEntry中给了我一个java.lang.nullpointerexception.我尝试使用Questoid SQLite管理器来查看数据库文件,它确实显示了创建的表.错误在哪里?

public class Transact {

    public static final String KEY_ROWID = "_id";
    public static final String KEY_TAG = "saved_tag";

    private static final String DATABASE_NAME = "MyDatabaseName";
    private static final String DATABASE_TABLE = "tagsTable";
    private static final int DATABASE_VERSION = 1;

    private DbHelper ourHelper;
    private final Context ourContext;
    private SQLiteDatabase ourDatabase;

    private static class DbHelper extends SQLiteOpenHelper{

        public DbHelper(Context context){
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(
                    "CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_TAG + " TEXT NOT NULL);"
                    );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
            onCreate(db);

        }
    }

    public Transact(Context c ){
        ourContext = c;
    }

    public Transact open() throws SQLException{
        ourHelper = new    DbHelper(ourContext);
        ourHelper.getWritableDatabase();
        return this;
    }

    public void close(){
        ourHelper.close();
    }

    public long createEntry(String tagword) {
        // TODO Auto-generated method stub
        ContentValues cv = new ContentValues();
        cv.put(KEY_TAG, tagword);
        return ourDatabase.insert(DATABASE_TABLE, "", cv);
    }

    public String getData() {
        // TODO Auto-generated method stub
        String[] columns = new String[]{KEY_ROWID, KEY_TAG};
        Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
        String result = "";
        int iRow = c.getColumnIndex(KEY_ROWID);
        int iTag = c.getColumnIndex(KEY_TAG);
        for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
         result = result + c.getString(iRow) + " " + c.getString(iTag) + "\n";     
        }

        return null;
    }

}
Run Code Online (Sandbox Code Playgroud)

Main.java类中添加按钮的代码:

case R.id.addDB:

    boolean doneAdd = true;
    try{
        String tag = textTag.getText().toString();
        Transact entry = new Transact(Main.this);
        entry.open();
        entry.createEntry(tag);
        entry.close();

    }catch(Exception e){
        String error = e.toString();
        Dialog d = new Dialog(this);
        d.setTitle("Error");
        TextView tv = new TextView(this);
        tv.setText(error);
        d.setContentView(tv);
        d.show();
        doneAdd = false;
    }finally{
        if(doneAdd){
            Dialog d = new Dialog(this);
            d.setTitle("Addition done");
            TextView tv = new TextView(this);
            tv.setText("Success");
            d.setContentView(tv);
            d.show();
        }
    }
break;
Run Code Online (Sandbox Code Playgroud)

sti*_*ike 5

您正在使用ourDatabase变量而不初始化它.所以不仅插入你将到达nullpointerexception你使用ourDatabase变量的任何地方

你可以在构造函数中使用类似的东西.

SQLiteDatabase db = context.openOrCreateDatabase(DATABASE_NAME,
                Context.MODE_PRIVATE, null);
Run Code Online (Sandbox Code Playgroud)