黑马程序员技术交流社区

标题: Android下数据库的问题 [打印本页]

作者: dongdong5982    时间: 2014-3-26 12:40
标题: Android下数据库的问题
本帖最后由 dongdong5982 于 2014-3-26 19:43 编辑

在写一个Android下的数据库,数据库已经建立好了,想要将一个表中行数返回(也就是说这张表里有多少条记录),表名为person,但是运行时老有空指针错误,请问一下应该怎样修改?

  1.         public int getTotalCount() {
  2.                 SQLiteDatabase db= helper.getWritableDatabase();
  3.                 Cursor cursor = db.query("person", null, null, null, null, null, null);
  4.                 return cursor.getCount();
  5.         }
复制代码




作者: dongdong5982    时间: 2014-3-26 15:30
又沉了,谁给回答一下啊
作者: 王松松    时间: 2014-3-26 17:13
本帖最后由 王松松 于 2014-3-26 17:25 编辑

试一下这句代码:
Cursor cursor = db.rawQuery("select * from person",null);// 其实结果一样
:L

我想说的是,你的代码点错了,你获取的是一个可写database
改为:
SQLiteDatabase database = dbOpenHelper.getReadableDatabase();

作者: 霍振鹏    时间: 2014-3-26 17:19
那我觉得这行代码有问题:(取出来的cursor为null)
Cursor cursor=db.query("person",null,null,null,null,null,null);
我没试(我现在没这个环境    你可以参考一下)
第一个参数是表名,第二个参数是要查询的列名,我觉得你把第二个参数写上试试
Cursor cursor=db.query("person",new String[]{_id,name}),null,null,null,null,null)


行不行都让我知道一下,,谢了
作者: syusikoku    时间: 2014-3-26 17:28
加一个判断,if(cursor.moveToLast)试一下。意思是如果游标可以移动到下一位的时候再取出数据。你的数据库都没有数据。应该会出现空指针的异常。
作者: dongdong5982    时间: 2014-3-26 18:23
王松松 发表于 2014-3-26 17:13
试一下这句代码:
Cursor cursor = db.rawQuery("select * from person",null);// 其实结果一样

试了一下,还是报原来的错误
  1. 03-26 06:22:51.130: E/AndroidRuntime(1963): Caused by: java.lang.NullPointerException
复制代码

作者: dongdong5982    时间: 2014-3-26 18:27
霍振鹏 发表于 2014-3-26 17:19
那我觉得这行代码有问题:(取出来的cursor为null)
Cursor cursor=db.query("person",null,null,null,null,n ...

试了一下,还是不行啊,我该谢谢你
作者: dongdong5982    时间: 2014-3-26 18:28
syusikoku 发表于 2014-3-26 17:28
加一个判断,if(cursor.moveToLast)试一下。意思是如果游标可以移动到下一位的时候再取出数据。你的数据库都 ...

使用adb shell进入数据库查询过了,有数据的
作者: 王松松    时间: 2014-3-26 18:48
dongdong5982 发表于 2014-3-26 18:23
试了一下,还是报原来的错误

SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
换这句代码还有问题??
作者: dongdong5982    时间: 2014-3-26 18:49
最后我试了一下,即使把第4行代码改为:
  1. return 50;
复制代码

最终还是会抛出空指针异常。我定义了一个成员变量,在onCreate()里,对这个成员变量使用getTotalCount()进行赋值,这样做的话就对了。具体为什么还不知道,猜想应该是程序内容的执行顺序,还没有对数据进行初始化时就使用了它
作者: dongdong5982    时间: 2014-3-26 18:52
王松松 发表于 2014-3-26 18:48
SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
换这句代码还有问题??

嗯,还有问题,不过应该不是代码的问题,而是逻辑的问题。
这个方法是DAO里的一个方法,是由其它调用的,应该是代码内部没有对它进行初始化,还没有执行到这一句,代码有地方就用了这个返回值。
声明为成员变量就好了,在onCreate()里进行初始化
作者: dongdong5982    时间: 2014-3-26 18:55
王松松 发表于 2014-3-26 18:48
SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
换这句代码还有问题??

继承BaseAdapter,里面有个getCount()方法,我想在这个方法里得到DAO里的返回值。结果空指针了,修改成下面的就没事了

  1. public class MainActivity extends Activity {

  2.         ListView lv;
  3.         PersonDao dao;
  4.         TextView tv_id;
  5.         TextView tv_name;
  6.         TextView tv_number;
  7.         int totalCount;

  8.         @Override
  9.         protected void onCreate(Bundle savedInstanceState) {
  10.                 super.onCreate(savedInstanceState);
  11.                 setContentView(R.layout.activity_main);

  12.                 lv = (ListView) findViewById(R.id.lv);
  13.                
  14.                 lv.setAdapter(new myAdapter());
  15.                 dao = new PersonDao(MainActivity.this);
  16.                 totalCount = dao.getTotalCount();

  17.         }

  18.         public class myAdapter extends BaseAdapter {

  19.                 @Override
  20.                 public int getCount() {
  21.                         return totalCount;
  22.                 }

  23.                 @Override
  24.                 public Object getItem(int position) {
  25.                         return null;
  26.                 }

  27.                 @Override
  28.                 public long getItemId(int position) {
  29.                         return 0;
  30.                 }

  31.                 @Override
  32.                 public View getView(int position, View convertView, ViewGroup parent) {
  33.                        
  34.                         List<Person> persons= dao.findAll();
  35.                         Person person = persons.get(position);
  36.                         LinearLayout ll_list_item = (LinearLayout) View.inflate(MainActivity.this, R.layout.list_item, null);
  37.                         tv_id = (TextView) ll_list_item.findViewById(R.id.tv_id);
  38.                         tv_name = (TextView) ll_list_item.findViewById(R.id.tv_name);
  39.                         tv_number = (TextView) ll_list_item.findViewById(R.id.tv_number);
  40.                         tv_id.setText("id:" + person.getId());
  41.                         tv_name.setText("name:" + person.getName());
  42.                         tv_number.setText("number" + person.getNumber());
  43.                         return ll_list_item;
  44.                 }
  45.         }

  46. }
复制代码

作者: syusikoku    时间: 2014-3-26 21:10
private BlackListDb helper;

    // 希望在该对象创建的时候数据库对象就已经被初始化出来了
    // 所以我们使用构造方法来解决
    public BlackListDbDao(Context context) {
        helper = new BlackListDb(context);
    }

    /**
     * 查询指定号码在黑名单列表中是否存在
     *
     * @param interceptNumber
     *            要查询的号码
     * @return 返回是否存在
     */
    public boolean findNumberIsExist(String interceptNumber) {
        boolean isExist = false; // 默认的时候是不存在的
        SQLiteDatabase database = helper.getReadableDatabase();
        Cursor cursor = database.query("blacklist", null, "number=?",
                new String[] { interceptNumber }, null, null, null);
        while (cursor.moveToNext()) {
            // 如果游标可以移动到下一位,就说明该号码存在,就返回true
            isExist = true;
        }
        cursor.close();
        database.close();
        return isExist;
    }
贴上这段代码给你参照一下。希望能帮的上你。这几天学习任务紧,不能帮你做测试了。不好意思啊。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2