我正在尝试直接从我的应用程序更新我的电话簿的联系人。我可以添加和删除联系人,但是更新什么也没做!
在插入之后或当我抓住联系人时,我将收集CONTACT_ID(又称_ID)。
这是我的更新代码:
public void update(Relation r)
{
Log.e("", ""+r.getBook_id());
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
Builder builder = ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI);
builder.withValue(RawContacts.ACCOUNT_TYPE, null);
builder.withValue(RawContacts.ACCOUNT_NAME, null);
ops.add(builder.build());
// Name
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())});
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName()+ " " +r.getLastName());
ops.add(builder.build());
// Number
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())});
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber());
builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
ops.add(builder.build());
// Picture
try
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(r.getPhoto()));
ByteArrayOutputStream image = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image);
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())});
builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray());
ops.add(builder.build());
}
catch (Exception e)
{
e.printStackTrace();
}
// Update
try
{
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (Exception e)
{
e.printStackTrace();
}
}
r.getBook_id()
给我当前联系人的_ID值。 r.getFirstName()
并r.getLastName()
给我联系人的名字。
r.getPhoto()
给我他的照片uri。最后r.getNumber()
给我他的电话号码。
Log行为我提供了正确的_ID值,我认为问题不出在这里。我做错什么了吗?
谢谢。
问候。
V.
整个源代码:
/**
* Uses the Contacts API to load contacts from the phonebook.
*
*/
public class ContactUtils
{
static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.STARRED,
ContactsContract.Contacts.TIMES_CONTACTED,
ContactsContract.Contacts.CONTACT_PRESENCE,
ContactsContract.Contacts.PHOTO_ID,
ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.HAS_PHONE_NUMBER,
};
private Activity context;
static final int CARD_LIMIT = 50;
/**
* Constructor
*
* @version 1.0
* @since 2012-03-28
* @param context Context of the running activity
*/
public ContactUtils(Activity context)
{
super();
this.context = context;
}
/**
* Returns a list of all the contacts in the phonebook
*
* @version 1.0
* @since 2012-03-28
* @return Returns a list of all the contacts in the phonebook
*/
public ArrayList<Relation> loadContacts()
{
String select = "((" + ContactsContract.Contacts.DISPLAY_NAME + " NOTNULL) AND (" + ContactsContract.Contacts.HAS_PHONE_NUMBER + " == 1))";
Cursor c = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
context.startManagingCursor(c);
ArrayList<Relation> cList = new ArrayList<Relation>();
int a = 0;
Relation relation;
while (c.moveToNext() && a<CARD_LIMIT)
{
relation = new Relation();
relation.setBook_id(new Integer(c.getString(0)).intValue());
String[] name_splitted = c.getString(1).split(" ");
relation.setFirstName(name_splitted[0]);
if (name_splitted.length > 1) relation.setLastName(name_splitted[1]);
ArrayList<String> numbers = getPhoneNumbers(c.getString(0));
relation.setNumber(numbers.size() > 0 ? numbers.get(0) : "" );
relation.setConcept("Any");
relation.setPhoto(loadContactPhoto(c) == null ? "android.resource://com.orange.rd.kramer/drawable/default_photo" : loadContactPhoto(c));
cList.add(relation);
a++;
}
c.close();
return cList;
}
/**
* Returns an uri pointing to the contact's photo
*
* @version 1.0
* @since 2012-03-28
* @param cursor Cursor on a specific contact
* @return Returns an uri pointing to the contact's photo
*/
private String loadContactPhoto(Cursor cursor)
{
if (cursor.getString(5) != null)
{
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, cursor.getInt(0));
return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY).toString();
}
return null;
}
/**
* Returns a list of all phone numbers that belong to the given contact
*
* @version 1.0
* @since 2012-03-28
* @param id Id of the given contact
* @return Returns a list of all phone numbers that belong to the given contact
*/
private ArrayList<String> getPhoneNumbers(String id)
{
ArrayList<String> phones = new ArrayList<String>();
Cursor pCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
while (pCur.moveToNext())
{
phones.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
pCur.close();
return(phones);
}
/**
* Inserts the given relation into the stock phone book
*
* @version 1.0
* @since 2012-03-28
* @param r Relation to be added into the stock phone book
*/
public void insert(Relation r)
{
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
Builder builder = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI);
builder.withValue(RawContacts.ACCOUNT_TYPE, null);
builder.withValue(RawContacts.ACCOUNT_NAME, null);
ops.add(builder.build());
// Name
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName().replace(" ", "-")+ " " +r.getLastName().replace(" ", "-"));
ops.add(builder.build());
// Number
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber());
builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
ops.add(builder.build());
// Picture
try
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(r.getPhoto()));
ByteArrayOutputStream image = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image);
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray());
ops.add(builder.build());
}
catch (Exception e)
{
e.printStackTrace();
}
// Add the new contact
try
{
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (Exception e)
{
e.printStackTrace();
}
String select = "(" + ContactsContract.Contacts.DISPLAY_NAME + " == \"" +r.getFirstName().replace(" ", "-")+ " " +r.getLastName().replace(" ", "-")+ "\" )";
Cursor c = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
context.startManagingCursor(c);
if (c.moveToNext())
{
r.setBook_id(new Integer(c.getString(0)).intValue());
}
else
{
r.setBook_id(-1);
}
}
/**
* Updates the given relation in the stock phone book
*
* @version 1.0
* @since 2012-03-28
* @param r Relation to be updated in the stock phone book
*/
public void update(Relation r)
{
Log.e("", ""+r.getBook_id());
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
Builder builder = ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI);
builder.withValue(RawContacts.ACCOUNT_TYPE, null);
builder.withValue(RawContacts.ACCOUNT_NAME, null);
ops.add(builder.build());
// Name
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())});
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName().replace(" ", "-")+ " " +r.getLastName().replace(" ", "-"));
ops.add(builder.build());
// Number
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())});
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber());
builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
ops.add(builder.build());
// Picture
try
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(r.getPhoto()));
ByteArrayOutputStream image = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image);
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())});
builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray());
ops.add(builder.build());
}
catch (Exception e)
{
e.printStackTrace();
}
// Update
try
{
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* Deletes the given relation from the stock phone book
*
* @version 1.0
* @since 2012-03-28
* @param r Relation to be removed from the stock phone book
*/
public void delete(Relation r)
{
Cursor pCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{""+r.getBook_id()}, null);
while (pCur.moveToNext())
{
String lookupKey = pCur.getString(pCur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
context.getContentResolver().delete(uri, null, null);
}
}
}
最后,我发现了如何更新联系人,这是update方法的代码:
public void update()
{
int id = 1;
String firstname = "Contact's first name";
String lastname = "Last name";
String number = "000 000 000";
String photo_uri = "android.resource://com.my.package/drawable/default_photo";
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
// Name
Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{String.valueOf(id), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE});
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastname);
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstname);
ops.add(builder.build());
// Number
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?"+ " AND " + ContactsContract.CommonDataKinds.Organization.TYPE + "=?", new String[]{String.valueOf(id), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_HOME)});
builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number);
ops.add(builder.build());
// Picture
try
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.parse(photo_uri));
ByteArrayOutputStream image = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image);
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{String.valueOf(id), ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE});
builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray());
ops.add(builder.build());
}
catch (Exception e)
{
e.printStackTrace();
}
// Update
try
{
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (Exception e)
{
e.printStackTrace();
}
}
该字段id
是将新联系人插入数据库时返回的原始联系人ID。这是获取此ID的代码:
ContentProviderResult[] res;
try
{
res = KramerApplication.getInstance().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
if (res != null && res[0] != null)
{
String uri = res[0].uri.getPath().substring(14);
r.setBook_id( new Integer(uri).intValue() );
}
}
catch (Exception e)
{
e.printStackTrace();
}
如果您想进一步了解如何插入/删除联系人,请查看我的第一个问题。
系统更新 可使用以下任何方法更新PSP™主机的系统软件。 [透过因特网更新] 使用透过因特网下载之更新数据执行更新的方法。 使用此方法执行更新时,需先与网络联机。有关与网络联机的详情,请参阅(设定) > (网络设定) > [Infrastructure模式]。 [透过储存媒体更新] 使用保存至储存媒体(如主机内存、UMD™、Memory Stick™或其他媒体)之更新数据执行更新的方法。 重要
通过路由器连接到网络,只要设置 /etc/rc.conf 文件中的 eth0 字段为 dhcp 或者 固定IP。如果通过 ADSL(PPPoE) 拨号上网,则要执行pppoe-setup 脚本,设置 ADSL 连接,然后通过以下命令连接/断开网络: /etc/rc.d/adsl start /etc/rc.d/adsl stop 更新 Archlinux 系统 (需要 root 权限,如果是普
长话短说,我需要在我的标准联系人中更新一个自定义字段,该字段在更新一个不同的、不相关的自定义对象后触发。我曾试图编写一个触发器,将字段值从自定义对象传递给联系人,但我不断收到各种错误,其中最近的一个错误让我感到困惑。最终目标是从Passing\u Field\uu c更新Passing\uu c。 我收到了一个意外的标记:“(”for(Contact C:行)上的错误。它太简单了,我想不出来。 下
问题内容: 我想在具有多个联接的语句中更新表。虽然我知道联接的顺序并不重要(除非您使用的是优化程序提示),但我还是以某种最直观的方式对它们进行了排序。但是,这导致我要更新的表不是我开始使用的表,并且我无法更新它。 我想做的一个虚拟例子是: 这里有许多关于使用联接进行更新的帖子,但是它们总是首先更新表。我知道这在SQL Server中是可能的,希望在MySQL中也可能! 问题答案: MySQL中的多
问题内容: 我正在尝试使用ht的数据更新表tr。两者都有几乎相同的列。因此,为了进行测试,我运行了此查询。 给出129行检查没问题,然后我将更新查询运行为-> 查询成功返回:受影响的行数为4134 有人可以指导我哪里出了问题以及如何解决。 问题答案: 在Postgres中,这有点复杂。但是,我质疑你的逻辑。似乎a是不正确的,因为您正在检查第一个表不是。因此,这 似乎 可以捕获您的逻辑: 该子句是偶
我想更新我下载的Android SDK,目前Eclipse无法加载SDK管理器,所以我可以选择API并下载最新的,SDK管理器中也有更新其他有用内容的选项。 那么现在做什么更新呢? 这是我当前下载并工作的SDK结构,无法直接访问SDK管理器: 那么如何更新Android SDK?