2013-05-11 38 views
0

虽然从非活性类访问SQLite的,越来越NullPointerExceptionNullPointerException异常,同时访问非活动类的SQLite

文件 - >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 
    } 

} 

那么,什么sh应该做到这一点的最佳方式?

回答

0

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

+0

这应该被添加为注释。不是一个答案 – Raghunandan 2013-05-11 14:32:31

+0

好吧,我已经把它改写成一个声明。 – reavowed 2013-05-11 14:34:26

+0

即使现在这应该被添加为评论。没有足够的细节将其作为答案发布。添加更多的细节或一些代码片段。 – Raghunandan 2013-05-11 14:35:39

0

我在主题首字母的代码中添加了一行。现在它应该工作。请检查它。

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

文件 - > 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(); 
    } 

} 
0
在类

初始化之后你最调用的Sqlite数据库打开函数。 例如:

Database database = new Database(); 
database.open(); 
相关问题