5

公開されているアプリの名前を変更します。

AccountManager.addAccountExplicitlyを介して作成されたアカウント名を変更して、既存の情報が既存のユーザーに対してそのまま残るようにするための迅速で安全な方法はありますか?

そうでない場合は、すべてのデータを保持しながら、アカウント名を手動で変更するにはどうすればよいですか?

すべてをコピーしてから古いものを削除するという私の素朴なアプローチの答えを投稿しますが、誰かがより良いものを思い付くと確信しています(または私のメソッドのいくつかのバグを見つけます)。

4

2 に答える 2

8

API v21は、それが役立つ場合は、にrenameAccount()メソッドを追加しました。AccountManager

ドキュメントから:

これは、既存のアカウントを削除し、古いアカウントのユーザーデータを使用して名前を変更した新しいアカウントを追加することと同じです。

つまり、下位互換性のために、アカウントを手動で削除し、後で新しいアカウント(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"});
于 2015-02-18T09:40:36.963 に答える
0

すべてのレコードを調べ、それらを1つずつコピーし、古いものをすべて削除するという単純なアプローチ...

この方法は実際のユーザーでは失敗する可能性があるのではないかと心配しています。

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!
        }
    }
于 2012-10-25T16:09:34.370 に答える