Introduction

The most prevelant usage is loading all address book contents synchronously and the working with the loaded data set, e.g. by calling "find" methods or even iterating over the whole contact pool.

Aside from often needlessly loading the all contacts into memory in every application accessing the address book, the synchronous I/O either meant blocking the application or introducing unexpected re-entrancy when the address book plugins were using nested event loops to process jobs without returning from the called function.

Warning

Akonadi's job based API is capable of doing synchronous execution as well, so one might be tempted to use this instead of the signal/slot approach shown on this page. The recommendation is to only use this as an intermediate step at best, the potential re-entrancy due to the nested event loop can lead to hard to debug problems.

Common Usage Patterns

Most usage patterns involve one of the KABC::AddressBook's "find" methods. Their functionality is now mostly available through Akonadi::ContactSearchJob

Find By Uid

A common use case is to look for a contact object by its identifier, e.g. acquired by user selection somewhen in the past.
The code to do that usually looks like this:
KABC::AddressBook *addressBook = KABC::StdAddressBook::self();

KABC::Addressee contact = addressBook->findByUid( uidString );

The equivalent using Akonadi API looks like this
Akonadi::ContactSearchJob *job = new Akonadi::ContactSearchJob( this );
job->setQuery( Akonadi::ContactSearchJob::ContactUid, uidString );

Sometimes it is necessary to transport some context from the method which creates the job to the result slot. A convenient way to do this is using the job's setProperty() method.

Find By Email

Another common use case is searching for matching contacts by email address. The code for that with KABC classes is almost identical:
KABC::AddressBook *addressBook = KABC::StdAddressBook::self();

KABC::Addressee contact = addressBook->findByEmail( emailString );

Unsurprisingly, the Akonadi code looks also quite similar to the previous use case:
Akonadi::ContactSearchJob *job = new Akonadi::ContactSearchJob( this );
job->setQuery( Akonadi::ContactSearchJob::Email, emailString );

Who Am I

Another use case for KABC::AddressBook is not directly available in Akonadi:
KABC::AddressBook *addressBook = KABC::StdAddressBook::self();

KABC::Addressee contact = addressBook->whoAmI();

Note

Even this had its shortcomings, because this depends on the users adding themselves to the address book and marking the respective entry as "this is me".

Concrete use cases this has been deployed for are getting the user's full name and/or their email address, which might be better served by using KDE's identity management instead, see KPIMIdentities::IdentityManager.

It contains the identity users can configure in the Systemsettings module for personal information, so if there is data yet, the application can just embed the respective KCM in a dialog and let the user configure this centrally for all of KDE.

Modifying A Contact

When using KABC::StdAddressBook, modifying a contact (for example one retrieved by findByUid()) worked like this:
addressBook->insertAddressee( contact );

With Akonadi, the application will need the Akonadi::Item or at least the item's identifier.
Assuming the contact got retrieved using ContactSearchJob, consider keeping the item or Item::id() around, see ContactSearchJob::items().