我正在尝试从使用扩展到Sqliteopenhelper类的类创建的数据库中获取数据并将其放到listview中,但是在我的activity类中使用数据库类的fetch()函数时出现错误。请帮我解释为什么在" cursor = demo1.fetch();"仅限行.....但当我包含用于在数据库中添加数据的行demo1.adddata()行时,应用程序运行时不会出现任何错误....
mainactivity.java
public class mainactivity extends Activity{
Listview list;
Cursor cursor;
database demo1;
String[] str;
int count;
adapterdemo adapter;
protected void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.list);
demo1 = new database(getApplicationContext());
//demo1.adddata();
cursor = demo1.fetch();
count = cursor.getCount();
str = new String[count];
cursor.moveToFirst();
for(int i=0;i<count;i++)
{
str[i] = cursor.getString(0);
Toast.makeText(getApplicationContext(), str[i], 3000).show();
cursor.moveToNext();
}
adapter= new adapterdemo(this, str);
list.setAdapter(adapter);
}}
database.java
public class database extends SQLiteOpenHelper {
SQLiteDatabase sql;
public database(Context context) {
super(context, "Template", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
String query = "Create table smstemp(sms_Template Text)";
arg0.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
public void adddata() {
// TODO Auto-generated method stub
sql = this.getReadableDatabase();
ContentValues cv = new ContentValues();
cv.put("sms_Template", "wait....");
sql.insert("smstemp", null, cv);
}
public Cursor fetch() {
// TODO Auto-generated method stub
Cursor c = sql.query("smstemp", new String[]{"sms_Template"}, null,null, null, null, null);
return c;
}
}
答案 0 :(得分:1)
SQLiteDatabase sql;
只需在两种方法中调用getReadableDatabase()。
这里是一个典型的例子,说明为什么本地字段可能不好。
如果是性能问题,额外的方法调用就像实际磁盘访问的1/10000000000那样。
答案 1 :(得分:1)
您的变量sql
未初始化,因此您获得NPE。
为什么添加adddata()
“解决”问题是因为该方法初始化变量。
最好不要将SQLiteDatabase
作为成员变量。相反,在fetch()
中初始化局部变量,如
SQLiteDatabase sql = getWritableDatabase();