Android 通过listview更新联系人备注
我想向联系人添加布尔属性。为了存储此属性,我注意到我可以使用自己的mimetype存储自定义注释 所以我创建了一个显示所有联系人的列表视图。listview包含一个复选框和一个文本字段。当复选框的状态改变时,我想更新联系人Android 通过listview更新联系人备注,android,listview,contacts,Android,Listview,Contacts,我想向联系人添加布尔属性。为了存储此属性,我注意到我可以使用自己的mimetype存储自定义注释 所以我创建了一个显示所有联系人的列表视图。listview包含一个复选框和一个文本字段。当复选框的状态改变时,我想更新联系人 public static final String MY_MIME_TYPE = "vnd.android.cursor.item/vnd.myapp.boolean_property"; @Override protected void onCreate(Bundle
public static final String MY_MIME_TYPE = "vnd.android.cursor.item/vnd.myapp.boolean_property";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
ContactsContract.Contacts.DISPLAY_NAME);
setListAdapter(new MyAdapter(this, c));
getListView().setItemsCanFocus(false);
}
public class MyAdapter extends SimpleCursorAdapter implements OnCheckedChangeListener {
public MyAdapter(Context context, Cursor contactCursor) {
super(context, R.layout.my_item, contactCursor, new String[] { Contacts._ID, Contacts.DISPLAY_NAME },
new int[] { R.id.myName });
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] noteWhereParams = new String[] { cursor.getString(cursor.getColumnIndex(Contacts._ID)),
MY_MIME_TYPE };
Cursor noteCur = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, noteWhere,
noteWhereParams, null);
CheckBox isTrue = (CheckBox) view.findViewById(R.id.isTrue);
TextView myName = (TextView) view.findViewById(R.id.myName);
isTrue.setOnCheckedChangeListener(null);
if (noteCur.moveToFirst()) {
int note = noteCur.getInt(noteCur.getColumnIndex(ContactsContract.Data.DATA1));
isTrue.setChecked(note != 0);
} else {
isTrue.setChecked(false);
}
isTrue.setOnCheckedChangeListener(this);
noteCur.close();
isTrue.setTag(cursor.getString(cursor.getColumnIndex(Contacts._ID)));
myName.setText(cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME)));
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
CheckBox c = (CheckBox) buttonView;
String id = (String) c.getTag();
try {
ContentValues values = new ContentValues();
values.put(ContactsContract.Data.DATA1, isChecked ? "1" : "0");
values.put(ContactsContract.Data.RAW_CONTACT_ID, id);
Cursor rawContactsCursor = getContentResolver().query(RawContacts.CONTENT_URI,
new String[] { RawContacts._ID }, RawContacts.CONTACT_ID + "=?",
new String[] { String.valueOf(id) }, null);
if (rawContactsCursor.moveToFirst()) {
do {
int rawID = rawContactsCursor.getInt(0);
int mod = Pilots.this.getContentResolver().update(
ContactsContract.Data.CONTENT_URI,
values,
ContactsContract.Data.RAW_CONTACT_ID + "=" + rawID + " AND "
+ ContactsContract.Data.MIMETYPE + "= '" + MY_MIME_TYPE + "'", null);
if (mod == 0) {
values.put(ContactsContract.Data.MIMETYPE, MY_MIME_TYPE);
MyActivity.this.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
}
} while (rawContactsCursor.moveToNext());
}
rawContactsCursor.close();
} catch (Exception e) {
Log.v(this.getClass().getName(), "save failed", e);
}
}
}
上述代码在更新联系人时失败。我不知道为什么。感谢您的帮助
Thx您可能需要添加一些错误消息、堆栈跟踪、Android日志副本等,任何可能有助于描述错误的内容:)使用Eclipse中的
adb logcat
、DDMS或DDMS透视图来检查logcat并查看与您的故障相关的堆栈跟踪。令人遗憾的是没有异常。。。只是没有更新。哇。。关于Android联系人的另一个未回答的问题。。我注意到的一点是“update”返回实际更新的行数——这并不意味着它不存在。顺便说一句,插入是否有效?您可能需要添加一些错误消息、堆栈跟踪、Android日志副本等,任何可能有助于描述错误的内容:)使用adb logcat
,DDMS,或者Eclipse中的DDMS透视图来检查LogCat并查看与失败相关的堆栈跟踪。。。只是没有更新。哇。。关于Android联系人的另一个未回答的问题。。我注意到的一点是“update”返回实际更新的行数——这并不意味着它不存在。顺便说一句,插页有用吗?