无法从android中自己创建的sqlite数据库中获取数据

时间:2014-07-13 07:27:36

标签: android sqlite

我正在尝试从使用扩展到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;
}

}

2 个答案:

答案 0 :(得分:1)

p p是对的。我刚刚写了一篇关于最佳实践的大文档。不必要的现场状态很糟糕。你不需要:

SQLiteDatabase sql;

只需在两种方法中调用getReadableDatabase()。

这里是一个典型的例子,说明为什么本地字段可能不好。

如果是性能问题,额外的方法调用就像实际磁盘访问的1/10000000000那样。

答案 1 :(得分:1)

您的变量sql未初始化,因此您获得NPE。

为什么添加adddata()“解决”问题是因为该方法初始化变量。

最好不要将SQLiteDatabase作为成员变量。相反,在fetch()中初始化局部变量,如

SQLiteDatabase sql = getWritableDatabase();