最近在做一个东西,用到了通讯录,就把通讯录的东西又复习了一遍,在学习的过程中遇到了一个问题,编译器一直报空指针异常,贴上代码讲解:
public void startQuery1() { ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex("contact_id")); System.out.println(id); Cursor dataCursor = resolver.query(dataUri, null, null, null, null); while(dataCursor.moveToNext()){ String data1 = dataCursor.getString(dataCursor.getColumnIndex("data1")); String mimetype = dataCursor.getString(dataCursor.getColumnIndex("mimetype")); data1 = data1==null?"wu":data1; System.out.println(data1); System.out.println(mimetype); } dataCursor.close(); } cursor.close(); }
在打印id这一行,一直报空指针异常,就是获取到的id为空,我用模拟器编译的时候发现没问题,我就很奇怪,于是连上手机把手机里面的/data/data/com.android.providers.contacts/databases/contacts2.db(联系人数据都在这个表里面)弄出来,一看,原来我的contact_id是直接从3开始的(我删除过一些联系人导致,而增加联系人的时候id是自动增长的),所以才会一个也没打印直接报错了。于是我加了一个判断,如果是空就不打印,这样就解决了。
然后现在是所有的数据都读出来了,我们要拿到我们想要的数据就要做一个筛选,我们常用的联系人字段在mimetypes表里面,上面已经获取出来了mimetype,
我们通过判断mimetype可以筛选到我们要的数据,这就不多说了。