【问题标题】:NullPointerException while accessing SQLite from non-activity class从非活动类访问 SQLite 时出现 NullPointerException
【发布时间】:2013-05-11 14:28:55
【问题描述】:

非活动类访问SQLite时,得到NullPointerException

文件 -> SessionDB.java

public class SessionDB {

private SQLiteDatabase database;
private SQLiteHelper dbHelper;
private String[] allColumns = { SQLiteHelper.SESSION_ID,
  SQLiteHelper.SESSION_STRING };

public SessionDB(Context context) {
    dbHelper = new SQLiteHelper(context);
}

public void open() throws SQLException {
    database = dbHelper.getWritableDatabase();
}

public void createSession(String session_string) {
    ContentValues values = new ContentValues();
    values.put(SQLiteHelper.SESSION_STRING, session_string);
    database.insert(SQLiteHelper.SESSION_TABLE, null, values); // NullPointerException Here
}
}

文件 ->Live.java

public class Live {
    protected Context context;

    public Live(Context context) {
        this.context = context;
    }

    public accessOK {
        SessionDB ses = new SessionDB(context);
        ses.createSession("Sample"); // NullPointerException
    }

}

那么,最好的方法应该是什么?

【问题讨论】:

    标签: java android nullpointerexception null-pointer


    【解决方案1】:

    您似乎没有在任何地方调用 SessionDB.open()。这意味着您的数据库字段永远不会被初始化,因此当您调用 SessionDB.createSession() 时为 null。

    【讨论】:

    • 这应该作为评论添加。不是答案
    • 好的,我已经把它改写成声明了。
    • 即使现在也应该将其添加为评论。没有足够的细节将其发布为答案。添加更多细节或一些代码sn-ps。
    【解决方案2】:

    我在主题启动器的代码中添加了一行。现在它应该可以工作了。请检查一下。

    public class Live {
        protected Context context;
    
        public Live(Context context) {
            this.context = context;
        }
    
        public accessOK {
            SessionDB ses = new SessionDB(context);
            // You have missed call to open method here:
            ses.open();
            ses.createSession("Sample"); // NullPointerException
        }
    }
    

    【讨论】:

      【解决方案3】:

      文件 -> SessionDB.java 应该扩展 SQLiteOpenHelper

      我修改了代码

      public class SessionDB extends SQLiteOpenHelper {
      
          public static final String TABLE_NAME = "SESSION_TABLE";
          public static final String COLUMN_1 = "SESSION_ID";
          public static final String COLUMN_2 = "SESSION_STRING";
      
          private static final String DATABASE_NAME = "session.db";
          private static final int DATABASE_VERSION = 1;
      
          private SQLiteDatabase database;
      
          // Database creation sql statement
          private static final String CREATE_TABLE = "create table "
              + TABLE_NAME + "(" + COLUMN_1 + " integer primary key autoincrement," + COLUMN_2
              + " text);";
      
          public DataBase(Context context) {
              super(context, DATABASE_NAME, null, DATABASE_VERSION);
          }
      
          @Override
          public void onCreate(SQLiteDatabase database) {
          database.execSQL(CREATE_TABLE);     
      
          }
      
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          /*
           * Log.w(MySQLiteHelper.class.getName(),
           * "Upgrading database from version " + oldVersion + " to " + newVersion
           * + ", which will destroy all old data");
           */
          db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);       
          onCreate(db);
          }
      
          public void open() throws SQLException {
          database = this.getWritableDatabase();
          }
      
          public void close() {
          database.close();
          }
      
          public void createSession(String session_string) {
              ContentValues values = new ContentValues();
                  values.put(COLUMN_2, session_string);
                  database.insert(TABLE_NAME, null, values);
          }
      }
      

      文件 ->Live.java

      public class Live {
          protected Context context;
      
          public Live(Context context) {
              this.context = context;
          }
      
          public accessOK {
              SessionDB ses = new SessionDB(context);
          ses.open();
              ses.createSession("Sample");
          ses.close();
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        关于初始化Sqlite数据库后你最常调用open函数的类。 例如:

        Database database = new Database();
        database.open(); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-20
          • 2012-09-26
          • 2019-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多