Android的SQLite的java.lang.nullpointer例外 [英] Android Sqlite java.lang.nullpointer exception
问题描述
我使用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屋!