Hi Dmitri,

Would you please help point out how's new group structure? Something similar
as groupmembership table in previous relese. Thanks a lot in advance!

On Thu, Nov 5, 2009 at 10:47 AM, Dmitri Plotnikov <[email protected]>wrote:

> Hi Jake,
>
> The database structure is actually extremely straightforward:
>
> "Contacts" represents an aggregated contact
> "RawContacts" represents a contact as it was inserted by the sync adapter.
>  RawContact has a CONTACT_ID field that binds it to a Contact.
> "Data" represents everything about a RawContact: emails, phone numbers,
> notes, birthday, high school graduation year, you name it.  Data has a
> RAW_CONTACT_ID field that binds it a  RawContact.  The other important field
> is MIMETYPE.  That's what determines the kind of data stored in a Data row.
>  Everything else is just convenience API.
>
> So here's the most common way of inserting a data row:
>
> values.put(Data.RAW_CONTACT_ID, rawContactId);
> values.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
> values.put(Note.NOTE, "Blah blah blah");
> resolver.insert(Data.CONTENT_URI, null, values);
>
> I hope this helps.
>
> - Dmitri
>
>
> On Wed, Nov 4, 2009 at 6:11 PM, jak. <[email protected]> wrote:
>
>> Thank you Dmitri,
>>
>> Your response was very helpful. Along with that, and the sample you
>> posted on another thread about using both Contact Apis from one app,
>> I've gotten most of the way there. It is much appreciated.
>>
>> I'm still however having some problems that I'm hard pressed to find a
>> solution for.
>> I'd be grateful if anyone could help me.
>>
>> The biggest challenge I'm  having with this API is that it's hard for
>> me to picture how the tables are laid out so I know which URI to query
>> to get the parts of the contact that I'm interested in.
>> I found to get the email address for a contact I'm looking at I can
>> query the uri:ContactsContract.CommonDataKinds.Email.CONTENT_URI,
>> looking at rows of the contact id i'm interested in.
>>
>> However to get the note from the same contact I can't use a similar
>> pattern, because there is no
>> ContactsContract.CommonDataKinds.Note.CONTENT_URI
>> The Note type exists in CommonDataKinds but it doesn't have an
>> associated CONTENT_URI.
>>
>> I'm finding it very frustrating to use this API because every time I
>> go to try to pull out another piece of data from the contact, the
>> method to access it seems to change (as I can't find a consistent way
>> to get a given field from a contact). And the documentation never
>> describes how these keys, tables, and URIs are related. Basically the
>> ContactsContract documentation just gives you a giant list of Objects
>> containing constants that describe indexes into some database that is
>> basically a black box without some basic documentation.
>>
>> I'm I the only one that finds this frustrating?
>>
>> Thanks again for your help.
>>
>> -Jake
>>
>> On Nov 2, 5:24 pm, Dmitri Plotnikov <[email protected]> wrote:
>> > You can always delegate contact creation to the Contacts app using the
>> > ContactsContract.Intents.UI.Insert intent with extras. This will show
>> the
>> > edit UI.
>> >
>> > If you want to explicitly create the contact by yourself, that's now a
>> bit
>> > tricky because Android 2.0 support multiple accounts.
>> >
>> > First of all, you will need to figure out which account you want to
>> create
>> > the contact in. Get a list of all available accounts from
>> AccountManager:
>> >
>> > AccountManager am = AccountManager.get(getContext());
>> > Account[] accounts = am.getAccounts();
>> >
>> > Also, get a list of all sync adapters and find the ones that support
>> > contacts:
>> >
>> > SyncAdapterType[] syncs
>> > = ContentResolver.getContentService().getSyncAdapterTypes();
>> >
>> > for (SyncAdapterType sync : syncs) {
>> >      if (ContactsContract.AUTHORITY.equals(sync.authority) &&
>> > sync.supportsUploading()) {
>> >           contactAccountTypes.add(sync.accountType);
>> >      }
>> >
>> > }
>> >
>> > Now you have a list of all accounts and a list of account types that
>> support
>> > contacts.  So here's your account list:
>> >
>> > for (Account acct: accounts) {
>> >    if (contactAccountTypes.contains(acct.type)) {
>> >       contactAccounts.add(account);
>> >    }
>> >
>> > }
>> >
>> > If the contactAccounts list contains nothing - use accountType = null
>> and
>> > accountName = null
>> > If it contains exactly one account, use it.
>> > If it contains multiple accounts, build a dialog and ask the user which
>> > account to use.
>> >
>> > From here on it gets easier.
>> >
>> > Let's start with a more traditional method.  Insert a raw contact first:
>> >
>> > ContentValues values = new ContentValues();
>> > values.put(RawContacts.ACCOUNT_TYPE, accountType);
>> > values.put(RawContacts.ACCOUNT_NAME, accountName);
>> > Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI,
>> > values);
>> > long rawContactId = ContentUris.parseId(rawContactUri);
>> >
>> > Then insert the name:
>> >
>> > values.clear();
>> > values.put(Data.RAW_CONTACT_ID, rawContactId);
>> > values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
>> > values.put(StructuredName.DISPLAY_NAME, "Some Body");
>> > getContentResolver().insert(Data.CONTENT_URI, values);
>> >
>> > You are done.
>> >
>> > Now here's a much better way to do the same.  Use the
>> > new ContentProviderOperation API, which will ensure that the raw contact
>> and
>> > its name are inserted at the same time.
>> >
>> > ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
>> > ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
>> >         .withValue(RawContacts.ACCOUNT_TYPE, accountType)
>> >         .withValue(RawContacts.ACCOUNT_NAME, accountName)
>> >         .build());
>> >
>> > ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
>> >         .withValueBackReference(Data.RAW_CONTACT_ID, 0)
>> >         .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
>> >         .withValue(StructuredName.DISPLAY_NAME, "Some Body")
>> >         .build());
>> >
>> > getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
>> >
>> > I hope this helps.
>> > - Dmitri
>> >
>> >
>> >
>> > On Mon, Nov 2, 2009 at 4:23 PM, jak. <[email protected]> wrote:
>> > > Hello,
>> >
>> > > I'm currently working on porting our Android app to 2.0 but I'm having
>> > > a rather hard time figuring out what is required to interact with the
>> > > new Contacts API.
>> > > I'm using reflection to decide whether the new API is available, if it
>> > > is I attempt to use the new features, otherwise I fall back to our old
>> > > methods.
>> >
>> > > However, I'm having a hard time finding analogs to the old
>> > > functionality in the new API.
>> > > For example in the past I was adding contacts to the database from an
>> > > external text source by creating a ContentValues object, filling it
>> > > with information on the contact and then adding it with a call to:
>> > > Contacts.People.createPersonInMyContactsGroup(...);
>> >
>> > > i.e.:
>> > > ...
>> >
>> > > ContentValues personValues = new ContentValues();
>> > > personValues.put(Contacts.People.NAME, "Some Body");
>> > > Uri personUri = Contacts.People.createPersonInMyContactsGroup
>> > > (curContext().getContentResolver(), personValues);
>> >
>> > > ...
>> > > How can I achieve the same goal in the new API?
>> >
>> > > I appreciate all the hard work going into improving the APIs but I
>> > > must admit I'm a bit frustrated by the lack of documentation and
>> > > examples.
>> > > I realize we have plenty of Javadocs on developer.android.com to
>> > > reference, but those only really show us what the new interfaces are.
>> > > I'm having a really hard time finding any discussion in terms of how
>> > > the new API is intended to be used.
>> >
>> > > Any help would be greatly appreciated!
>> > > Thanks!
>> >
>> > > --
>> > > You received this message because you are subscribed to the Google
>> > > Groups "Android Developers" group.
>> > > To post to this group, send email to
>> [email protected]
>> > > To unsubscribe from this group, send email to
>> > > [email protected]<android-developers%[email protected]><android-developers%2Bunsubs
>> [email protected]>
>> > > For more options, visit this group at
>> > >http://groups.google.com/group/android-developers?hl=en
>>
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Android Developers" group.
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]<android-developers%[email protected]>
>> For more options, visit this group at
>> http://groups.google.com/group/android-developers?hl=en
>>
>
>  --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]<android-developers%[email protected]>
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>



-- 
Best regards,
MTM
Contacts GroupU - Group your Android Contacts
http://contacts-groupu.appspot.com

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to