我正在更改已发布应用的名称。
是否有一种快速安全的方法来更改通过AccountManager.addAccountExplicitly
创建的帐户名称,以便现有用户的现有信息保持不变。
如果没有,我如何在保留所有数据的同时手动更改帐户名称?
我会发布一个天真的方法来回复所有内容然后删除旧内容,但我相信有人会想出一个更好的方法(或者在我的方法中发现一些错误)。
答案 0 :(得分:7)
API v21为AccountManager
添加了renameAccount()
方法,如果有帮助的话。
来自文档:
这相当于删除现有帐户并添加新帐户 使用旧帐户的用户数据重命名帐户。
这意味着为了向后兼容,您必须手动删除该帐户,然后执行与之后创建新帐户(AccountManager.addAccountExplicitly()
和AccountManager.setUserData()
)相同的过程。
修改强> 如果您想在之后更新您的联系人以显示正确的帐户名称,请尝试使用此(未经测试的)代码:
ContentValues contentValues = new ContentValues();
contentValues.put(ContactsContract.RawContacts.ACCOUNT_NAME, "new account name");
getContext().getContentResolver().update(ContactsContract.RawContacts.CONTENT_URI,
contentValues,
ContactsContract.RawContacts.ACCOUNT_TYPE + " = ? AND " + ContactsContract.RawContacts.ACCOUNT_NAME + " = ?",
new String[]{"your account type", "old account name"});
答案 1 :(得分:0)
一种天真的方式来覆盖所有记录,逐个复制它们,并删除所有旧的东西......
我真的担心这种方法可能会对现实世界的用户造成失败。
private void naiveRename(ContentResolver resolver) {
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
Cursor cur = resolver.query(RawContacts.CONTENT_URI, null, RawContacts.ACCOUNT_NAME + "='"
+ "OLD NAME" + "'", null, null);
if (cur != null) {
// copy all data
while (cur.moveToNext()) {
Uri curUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
.build();
ContentProviderOperation.Builder builder = ContentProviderOperation
.newInsert(curUri);
for (int i = 0; i < cur.getColumnCount(); i++) {
String colName = cur.getColumnName(i);
if (RawContacts._ID.equals(colName) || RawContacts.VERSION.equals(colName)
|| RawContacts.CONTACT_ID.equals(colName)) {
// Skip - read only
} else if (RawContacts.ACCOUNT_NAME.equals(colName)) {
builder.withValue(RawContacts.ACCOUNT_NAME, "NEW NAME");
} else {
builder.withValue(colName, cur.getString(i));
}
}
operationList.add(builder.build());
}
// delete all old data
ContentProviderOperation.Builder builder = ContentProviderOperation
.newDelete(RawContacts.CONTENT_URI);
builder.withSelection(RawContacts.ACCOUNT_NAME + "='" + "OLD NAME" + "'", null);
try {
resolver.applyBatch(ContactsContract.AUTHORITY, operationList);
} catch (RemoteException e) {
// PANIC!
} catch (OperationApplicationException e) {
// OMG! WHAT TO DO?!
}
} else {
// LORDI!
}
}