我认为可以使用一些问题的几个问题。到目前为止,我有一个应用程序在Android联系人数据库中查询某些类型的数据(目前是DISPLAY_NAME,NUMBER和ADDRESS)。然后我想用我的游标查询的结果填充ListView。我的问题是,我使用了3个单独的游标来获取数据,我想将所有3个集合绑定到我的ListView行中的条目(R.id.contact_name,R.id.contact_number,R。 id.contact_address)。
我不确定如何使用3种不同的光标进行此操作,在浏览了过去几天之后我无法找到任何真正的指导,除了像使用&#之类的几个短语34; MergeCursor?"(sp)或尝试将数据库表连接在一起。另外,我不想在onCreate()中填充我的列表。我想在AsyncTask的doInBackground()中进行,因为有些用户可能有很多很多联系人,而且我不想阻止已经发生的UI线程。但是当我尝试在Async中实现填充时,Eclipse给了我很多关于SimpleCursorAdapter的错误。这是我目前的代码。关于如何改进这种架构并解决我遇到的问题的任何指导都将非常感谢,谢谢!
public class Contacts extends ListActivity {
private static final String TAG = "Contacts";
Cursor c, pCur, addrCur;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Uri contacts = ContactsContract.Contacts.CONTENT_URI;
ContentResolver cr = getContentResolver();
String[] projection = new String[] { ContactsContract.Data.DISPLAY_NAME };
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
Log.d(TAG, "Getting Display Names....");
// Query the Contacts Content Provider for ONLY Contacts that have phone
// numbers
// listed
c = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, null,
sortOrder);
// Get their display names
if (c.getCount() > 0) {
// While there is more data
while (c.moveToNext()
&& Integer
.parseInt(c.getString(c
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
String id = c.getString(c
.getColumnIndex(ContactsContract.Contacts._ID));
String name = c
.getString(c
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
// Query Phone Numbers Next
/*
* if (Integer .parseInt(c.getString(c
* .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
* > 0) { Log.d(TAG, "Getting Phone Numbers"); pCur = cr.query(
* ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
* ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" ,
* new String[]{id}, null); while (pCur.moveToNext()) {
*
* String phone_number = pCur .getString(pCur
* .getColumnIndex(ContactsContract
* .CommonDataKinds.Phone.NUMBER)); } pCur.close(); Log.d(TAG,
* "Finished Getting Phone Numbers...."); }
*/
// Query the Addresses
Log.d(TAG, "Getting Addresses....");
String addrWhere = ContactsContract.Data.CONTACT_ID
+ " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] addWhereParams = new String[] {
id,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE };
addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null,
null, null, null);
while (addrCur.moveToNext()) {
String poBox = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
String street = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
String city = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String state = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
String postalCode = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
String country = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String type = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
}
addrCur.close();
Log.d(TAG, "Finished Getting Addresses....");
}
}
// new loadContacts().execute(TAG);
final int[] TO = { R.id.contact_name };
final String[] FROM = new String[] { ContactsContract.Contacts.DISPLAY_NAME };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.contact_item, c, FROM, TO);
setListAdapter(adapter);
// adapter.changeCursor(pCur);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
c.moveToPosition(position);
String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Toast.makeText(this, "You Selected " + name, Toast.LENGTH_SHORT).show();
//Toast t = Toast.makeText(Contacts.this, "You Selected " + position, Toast.LENGTH_SHORT);
//t.show();
}
}
答案 0 :(得分:0)
MergeCursor更适用于将一个查询的结果与另一个查询的结果相连。可以把它想象成更多的行,而不是更多的列。
如果您要从多个来源提取,因为您希望每个查询中的列(一个电话号码,另一个电话号码),您要使用的是CursorJoiner。 CursorJoiner将允许您使用相同的主键排序两个游标,并使用每个父游标所需的列创建一个新的Cursor。链接文档中包含简要的操作概述。
祝你好运!编辑:要回答关于在单独的线程上运行查询的问题,一个好的起点是阅读Loaders。