Android的SQLite的java.lang.nullpointer例外 [英] Android Sqlite java.lang.nullpointer exception

查看:173
本文介绍了Android的SQLite的java.lang.nullpointer例外的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Android中SQLite的日食,但它给了我在功能createEntry一个显示java.lang.NullPointerException。我使用的SQLite Questoid经理试图查看数据库文件并它只与创建该表。哪里的错误?

 公共类的Transact {    公共静态最后弦乐KEY_ROWID =_id;
    公共静态最后弦乐KEY_TAG =saved_tag​​;    私有静态最后弦乐DATABASE_NAME =MyDatabaseName;
    私有静态最后弦乐DATABASE_TABLE =tagsTable;
    私有静态最终诠释DATABASE_VERSION = 1;    私人DbHelper ourHelper;
    私人最终上下文ourContext;
    私人SQLiteDatabase ourDatabase;    私有静态类DbHelper扩展SQLiteOpenHelper {        公共DbHelper(上下文的背景下){
            超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
        }        @覆盖
        公共无效的onCreate(SQLiteDatabase DB){
            // TODO自动生成方法存根
            db.execSQL(
                    CREATE TABLE+ DATABASE_TABLE +(+ KEY_ROWID +INTEGER PRIMARY KEY AUTOINCREMENT,+ KEY_TAG +TEXT NOT NULL);
                    );
        }        @覆盖
        公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
            // TODO自动生成方法存根
            db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE);
            的onCreate(DB);        }
    }    公众的Transact(上下文C){
        ourContext = C;
    }    公众的Transact打开()抛出的SQLException {
        ourHelper =新DbHelper(ourContext);
        ourHelper.getWritableDatabase();
        返回此;
    }    公共无效的close(){
        ourHelper.close();
    }    众长createEntry(字符串tagword){
        // TODO自动生成方法存根
        ContentValues​​ CV =新ContentValues​​();
        cv.put(KEY_TAG,tagword);
        返回ourDatabase.insert(DATABASE_TABLE,,品种);
    }    公共字符串的getData(){
        // TODO自动生成方法存根
        的String [] =列新的String [] {KEY_ROWID,KEY_TAG};
        光标C = ourDatabase.query(DATABASE_TABLE,列,NULL,NULL,NULL,NULL,NULL);
        字符串结果=;
        INT iRow = c.getColumnIndex(KEY_ROWID);
        INT ITAG = c.getColumnIndex(KEY_TAG);
        为(c.moveToFirst();! c.isAfterLast(); c.moveToNext()){
         结果=结果+ c.getString(iRow)++ c.getString(ITAG)+\\ n;
        }        返回null;
    }}

code从Main.java类中的添加按钮:

 情况下R.id.addDB:    布尔doneAdd =真;
    尝试{
        。字符串标记= textTag.getText()的toString();
        办理入境=新的Transact(Main.this);
        entry.open();
        entry.createEntry(标签);
        entry.close();    }赶上(例外五){
        字符串错误= e.toString();
        对话D =新的对话框(本);
        d.setTitle(错误);
        TextView的电视=新的TextView(本);
        tv.setText(错误);
        d.setContentView(电视);
        d.show();
        doneAdd = FALSE;
    }最后{
        如果(doneAdd){
            对话D =新的对话框(本);
            d.setTitle(做加法);
            TextView的电视=新的TextView(本);
            tv.setText(成功);
            d.setContentView(电视);
            d.show();
        }
    }
打破;


解决方案

您正在使用 ourDatabase 变量没有初始化它。因此,不仅插入你会得到 NullPointerException异常无处不在,你使用 ourDatabase 变量

您可以使用类似的构造如下。

  SQLiteDatabase DB = context.openOrCreateDatabase(DATABASE_NAME,
                Context.MODE_PRIVATE,NULL);

I am using SQLite in Android eclipse, however it gives me a java.lang.nullpointerexception in the function createEntry. I tried using Questoid SQLite manager to view the database file and it does show up with the table created. Where's the bug?

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;
    }

}

Code for the add button from Main.java class:

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;

解决方案

You are using ourDatabase variable without initializing it. So not only insert you will get nullpointerexception everywhere where you are using ourDatabase variable

you can use something like following in constructor.

SQLiteDatabase db = context.openOrCreateDatabase(DATABASE_NAME,
                Context.MODE_PRIVATE, null);

这篇关于Android的SQLite的java.lang.nullpointer例外的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆