316
C
HAPTER
16 
Data: actions, preferences, files, SQLite, and addresses
1
Make changes to individual properties or to multivalues (using the mutable 
multivalue).
2
Use 
ABRecordSetValue
to save the value to your local copy of the Address Book.
3
Use 
ABAddressBookSave
to save your local changes to the real Address Book 
database.
We won’t be covering the setter side of things (which you can find out about in the 
“Address Book Programming Guide for iPhone 
OS
”), but we’re going to use many of 
the getter functions in the next section. 
16.5.3 Querying the Address Book
Our first exploration of the Address Book will use the plain Address Book framework 
to access the Address Book and look up many of the values. This is shown in listing 16.10. 
It centers on a simple application with two objects built in Interface Builder: a 
UISearchBar
and a 
UITextView
(with an 
IBOutlet
called 
myText
).
We haven’t used search bars before, but they’re a simple way to enter search text. 
You set the search bar’s delegate, and then respond to appropriate messages. In this 
case, our program responds to the 
searchBarSearchButtonClicked:
delegate 
method, and then looks up the information that was entered.
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[searchBar resignFirstResponder];
ABAddressBookRef addressBook = 
ABAddressBookCreate();  
CFIndex abPCount = 
ABAddressBookGetPersonCount(addressBook);    
CFIndex abGCount = 
ABAddressBookGetGroupCount(addressBook);     
CFArrayRef searchResults = ABAddressBookCopyPeopleWithName(addressBook,
(CFStringRef)searchBar.text);  
myText.text = [NSString stringWithString:@"Possible Completions:"];
for (int i=0; i < CFArrayGetCount(searchResults); i++) {
ABRecordRef thisPerson = 
CFArrayGetValueAtIndex(searchResults, i);
myText.text = [myText.text stringByAppendingFormat:@"\n\n%@",
(NSString *)ABRecordCopyCompositeName
(thisPerson)];                        
CFStringRef thisJob = ABRecordCopyValue(thisPerson,
kABPersonJobTitleProperty);                                 
CFStringRef thisOrg = ABRecordCopyValue(thisPerson,
kABPersonOrganizationProperty);                           
if (thisJob != NULL && thisOrg != NULL) {
myText.text = [myText.text stringByAppendingFormat:
@"\n%@ of %@",thisJob,thisOrg];
}
Listing 16.10 An example of looking up information in the Address Book
Copies 
Address Book
B
Counts Address 
Book entries
C
D
Searches Address Book
Gets personal 
record
E
Prints full name
F
Gets other 
properties
G
Licensed to Nick Wood <nwood888@yahoo.com>
Change pdf file to jpg online - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
change pdf to jpg format; .pdf to jpg
Change pdf file to jpg online - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
change pdf to jpg file; change from pdf to jpg on
317
Accessing the Address Book
ABMultiValueRef thisPhones = ABRecordCopyValue(thisPerson,
kABPersonPhoneProperty);  
if (thisPhones != NULL) {
for (int j = 0; j <ABMultiValueGetCount(thisPhones); j++) {
myText.text = [myText.text stringByAppendingFormat:
@"\n%@: %@", (NSString *)
ABMultiValueCopyLabelAtIndex(thisPhones, j),
(NSString *)
ABMultiValueCopyValueAtIndex
(thisPhones, j)];        
}
}
}
myText.text = [myText.text stringByAppendingFormat:@"\n\nThere are %ld
records and %ld groups in this address book.",abPCount,abGCount];
CFRelease(searchResults);  
CFRelease(addressBook);   
}
You start out by running 
ABAddressBookCreate
, which makes a local copy of the 
Address Book 
B
. You’ll need to do this whenever you’re working manually with the 
Address Book. After that, you make use of a few general Address Book functions that 
let you do things like count your number of contacts and groups 
C
. But it’s the search 
function that’s most important 
D
. This is one of two ways that you might extract con-
tacts from the Address Book by hand, the other being 
ABAddressBookCopyArray-
OfAllPeople
. Note the typing of 
searchBar.text
as 
CFStringRef
. This is a Core 
Foundation class equivalent to 
NSString *
; there’s more information on the details of 
Core Foundation in the “Using Core Foundation” sidebar. 
The preceding steps are the major ones that differentiate working with the 
Address Book manually from working with it through a 
UI
. With the Address Book 
framework, your program does the selection of contact records; with the 
UI
frame-
work, the user would do it through a graphical interface. Beyond that, things work 
similarly via either methodology.
Once you’ve got a list of contacts, you need to extract individuals from the array 
E
There are numerous functions that can then be used to look at their properties. 
ABRecordCopyCompositeName
gives you a full name already put together 
F
, and 
ABRecordCopyValue
lets you pick out other properties 
G
. The list of properties and 
returned values is in the 
ABPerson
reference.
Multivalues are only a little more difficult to use than simple properties. You use 
ABRecordCopyValue
as usual 
H
, but then you have to work through the entire multi-
value, which is effectively an associative array. The easiest thing to do is extract all the 
individual labels and values 
I
. This program displays the slightly awkward label 
names (for your reference), but you probably wouldn’t usually want to show off words 
like 
$!<Mobile>!$
, and it’s easy enough to strip them out.
The program ends by cleaning up some of the Core Foundation objects, using the 
standard Core Foundation memory management functions 
J
. When you run it, this 
H
Gets phone multivalue
Prints individual 
phone number
I
J
Cleans up 
memory
Licensed to Nick Wood <nwood888@yahoo.com>
Online Convert Jpeg to PDF file. Best free online export Jpg image
Online JPEG to PDF Converter. Download Free Trial. Convert a JPG to PDF. You can drag and drop your JPG file in the box, and then start immediately to sort the
.net pdf to jpg; convert multi page pdf to single jpg
Online Convert PDF to Jpeg images. Best free online PDF JPEG
Online PDF to JPEG Converter. Download Free Trial. Convert a PDF File to JPG. Drag and drop your PDF in the box above and we'll convert the files for you.
convert multi page pdf to jpg; convert pdf image to jpg
318
C
HAPTER
16 
Data: actions, preferences, files, SQLite, and addresses
program displays some of the data from 
names that you search for, as shown in fig-
ure 16.8.
There’s lots more that can be done 
with the Address Book, but this should 
outline the basics of how to access its sev-
eral classes. 
16.5.4 Using the Address Book UI
There are definitely times when you’ll want 
to work with the low-level Address Book 
functions that we’ve seen so far. But you 
also don’t want to reinvent the wheel. If you 
need to let a user select, edit, or insert a new 
contact, there’s no need to program any of 
the 
UI
. Instead, you can use the Address 
Book 
UI
framework, which has all of that 
functionality preprogrammed.
The Address Book 
UI
framework con-
tains only the four classes that we summa-
rized in table 16.7: 
ABPeoplePicker-
NavigationController
ABNewPersonView-Controller
ABPersonViewController
and 
ABUnknownPersonViewController
. Each of these 
UI
objects is—as the names sug-
gest—a view controller. To be precise, they’re highly specialized modal controllers that 
each assist you in a single Address Book–related task. Each controller also has a delegate 
protocol, which is how you link to a class that’s already pretty fully realized. We’re going 
to touch upon each of these classes, but we’re only going to give a lot of attention to the 
people-picker (
ABPeople-PickerNavigationController
).
THE PEOPLE-PICKER VIEW CONTROLLER
To demonstrate the people-picker, we’re going to put together a quick utility with sub-
stantially identical functionality to the previous Address Book example. But rather 
than searching for multiple users using the Address Book framework, the user will 
instead select a specific user using the Address Book 
UI
framework.
This program is built with a couple of Interface Builder–created objects. A 
UIToolBar
with a single button allows the user to activate the program via the 
select-
Contact:
method, and text will once more be displayed in a non-editable 
UITextView
called 
myText
. The program is shown in listing 16.11.
-(IBAction)selectContact:(id)sender {
ABPeoplePickerNavigationController *myPicker =
[[ABPeoplePickerNavigationController alloc]
init];                                   
Listing 16.11 People-picker: a simple, graphical way to select contacts
Creates 
people-picker
B
Figure 16.8 The Address Book framework gives 
you low-level access to contact information.
Licensed to Nick Wood <nwood888@yahoo.com>
C# Image Convert: How to Convert Adobe PDF to Jpeg, Png, Bmp, &
C# sample code for PDF to jpg image conversion. This demo code convert PDF file all pages to jpg images. // Define input and output files path.
convert pdf to jpeg; c# pdf to jpg
C# Image Convert: How to Convert Dicom Image File to Raster Images
RasterEdge.XDoc.Office.Inner.Office03.dll. RasterEdge.XDoc.PDF.dll. RasterEdge.XDoc. PowerPoint.dll. This demo code convert dicom file all pages to jpg images.
convert pdf to jpg c#; convert pdf image to jpg online
319
Accessing the Address Book
myPicker.peoplePickerDelegate = self;     
[self presentModalViewController:myPicker
animated:YES];  
[myPicker release];
}
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:
(ABRecordRef)thisPerson {        
CFIndex abPCount =
ABAddressBookGetPersonCount
(peoplePicker.addressBook);     
CFIndex abGCount =
ABAddressBookGetGroupCount
(peoplePicker.addressBook);     
myText.text = [NSString stringWithString:@"Selected Contact:"];
myText.text = [myText.text stringByAppendingFormat:@"\n\n%@",
(NSString *)ABRecordCopyCompositeName(thisPerson)];
CFStringRef thisJob = ABRecordCopyValue(thisPerson,
kABPersonJobTitleProperty);
CFStringRef thisOrg = ABRecordCopyValue(thisPerson,
kABPersonOrganizationProperty);
if (thisJob != NULL && thisOrg != NULL) {
myText.text = [myText.text stringByAppendingFormat:@"\n%@ of
%@",thisJob,thisOrg];
}
ABMultiValueRef thisPhones = ABRecordCopyValue(thisPerson,
kABPersonPhoneProperty);
if (thisPhones != NULL) {
for (int j = 0; j < ABMultiValueGetCount(thisPhones) ; j++) {
myText.text = [myText.text stringByAppendingFormat:@"\n%@: %@",
(NSString *)ABMultiValueCopyLabelAtIndex(thisPhones, j),
(NSString *)ABMultiValueCopyValueAtIndex(thisPhones, j)];
}
}
myText.text = [myText.text stringByAppendingFormat:@"\n\nThere are %ld
records and %ld groups in this address book.",abPCount,abGCount];
[self dismissModalViewControllerAnimated:YES];  
return NO;  
}
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier {  
return NO;
}
Sets 
delegate
C
Displays 
people-picker
D
Runs person-selection 
delegate routine
E
Gets overall 
counts
F
Dismisses 
controller
G
H
Stops browsing
Runs property-
selection routine
I
Licensed to Nick Wood <nwood888@yahoo.com>
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
scanned images to PDF, such as tiff, jpg, png, gif Append one PDF file to the end of another one in NET framework library download and VB.NET online source code
convert pdf to jpg for; convert pdf to jpg file
VB.NET PDF Convert to Images SDK: Convert PDF to png, gif images
Convert PDF to Jpg, Png, Bmp, Gif, Tiff and Bitmap in ASP.NET. Or directly change PDF to Gif image file in VB.NET program with this demo code.
batch convert pdf to jpg; convert pdf to 300 dpi jpg
320
C
HAPTER
16 
Data: actions, preferences, files, SQLite, and addresses
- (void)peoplePickerNavigationControllerDidCancel:
(ABPeoplePickerNavigationController *)
peoplePicker {                           
[self dismissModalViewControllerAnimated:YES];
}
In order to instantiate a modal view controller, you fol-
low three simple steps that are executed when the user 
clicks on the appropriate button in the toolbar. You cre-
ate the controller 
B
, set its delegate 
C
, and use 
UIViewController
’s 
presentModalViewController: 
animated:
method to place it at the top of your user’s 
screen 
D
. You then don’t have to worry about how the 
modal view controller looks or works; you just have to 
respond to the messages listed in the protocol reference.
The fully featured interface that’s available to you as 
soon as you pop up the controller is shown in figure 16.9.
You’ll do most of the work in the 
peoplePicker-
NavigationController:shouldContinueAfterSelect
ingPerson:
method 
E
. This is called whenever a user 
selects an individual contact. Note that you can use a 
property of the 
peoplePicker
variable to access the 
Address Book itself 
F
, which allows you to use many of 
the 
ABAddressBook
functions without needing to create 
the Address Book manually. Beyond that, the people-
picker sends you an 
ABRecordRef
for the contact that the 
user selected; from there, you work with it exactly like 
you worked with the 
ABRecordRef
s that you looked up in listing 16.10.
In this example, users can only select individual contacts, so when the method is 
done, you dismiss the modal view controller 
G
, and then return 
NO
H
, which tells the 
people-picker that you don’t want to take the standard action for selecting the contact 
(which would be to call up a subpage with all of that contact’s properties).
If you’d wanted to let a user select a specific property from within a contact, you’d 
fill in the 
peoplePickerNavigationController:shouldContinueAfterSelecting-
Person:property:identifier:
method 
I
.
The third method defined by the 
ABPeoplePickerNavigationController
proto-
col is 
peoplePickerNavigationControllerDidCancel:
J
, which here causes the pro-
gram to (again) dismiss the people-picker.
You can do a little more with the people-picker. As we already noted, you could have 
opted to let a user select an individual property by returning 
YES
for the first 
should-
Continue
method, and then filling in the second one. You could also choose the indi-
vidual properties that display on a contact page. Information on these possibilities is 
available in the 
ABPeoplePickerNavigationController
and 
ABPeoplePickerNaviga-
tionController-Delegate
class references.
Runs cancellation 
routine
J
Figure 16.9 A people-picker 
view controller
Licensed to Nick Wood <nwood888@yahoo.com>
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
Free online C#.NET source code for combining multiple PDF scanned images to PDF, such as tiff, jpg, png, gif Append one PDF file to the end of another and save
convert pdf pages to jpg; convert pdf to jpg converter
VB.NET PDF - Convert PDF with VB.NET WPF PDF Viewer
PDF Document; Remove Password from PDF; Change PDF Permission Settings. Convert PDF to image file formats with high quality, support converting PDF to PNG
reader convert pdf to jpg; convert pdf file to jpg on
321
Accessing the Address Book
There are three other view controllers that you can use to allow users to interact with 
the Address Book. 
THE OTHER VIEW CONTROLLERS
The other three view controllers work much like 
ABPeoplePickerNavigation-
Controller
, with one notable difference: they must each be built on top of a naviga-
tion controller. Technically, they’re probably not modal view controllers, because they 
go inside a navigation controller, but you can treat the navigation controller as a 
modal view controller once everything is loaded up, as you’ll see in our example.
The 
ABNewPersonViewController
allows a user to enter a new contact. You can 
prefill some of the info by recording it in an 
ABRecordRef
and setting the 
displayed-
Person
property, but this is purely optional (and probably won’t usually be done). 
Once you’ve created the controller, you’ll need to respond to a method that tells you 
when the user has entered a new contact. You don’t have to do anything with it except 
dismiss the modal controller, because the controller automatically saves the new con-
tact to the Address Book. You can see what info the user entered, though, and do 
something with it if you want. Listing 16.12 shows how to deploy a new-person view on 
top of a navigation controller, and how to respond to its single method.
Using Core Foundation
The Address Book framework is the first framework you’ve worked with that requires 
you to use Core Foundation, a non-Cocoa library. This means you’ll have to program 
slightly differently, as we promised would be the case back in chapter 10. The biggest 
differences are how variables and memory allocation work.
Core Foundation variables use different classes, such as 
CFStringRef
replacing 
NS-
String *
. Remember that the Core Foundation variable types usually have equivalents 
in Cocoa that you can freely switch between by casting, as is done in listing 16.10 
when moving between the Address Book records and the 
UITextView
text. When you’re 
using the Core Foundation variables natively, you’ll have to use Core Foundation func-
tions, such as 
CFArrayCount
, to deal with them.
You’ll also have to deal with memory management a little differently. Core Foundation 
memory management uses the same general approach as Cocoa Touch. There’s a 
reference count for each object that is increased when it’s created or retained and 
decreased when it’s released. You just have to remember slightly different rules for 
when you have a reference. If you create an object with a function using the word(s) 
create or copy, you own a reference to it and must 
CFRelease
it. If you create an ob-
ject in another way, you do not have a reference, and you must 
CFRetain
the object 
if you want to keep it around. Some classes of objects may have their own release 
and retain functions. The “Memory Management Programming Guide for Core Foun-
dation” tutorial at developer.apple.com has more information.
Core Foundation will show up again in chapter 18, where it controls some audio ser-
vices, and in chapter 19, where it’s used for the Quartz 2D graphics package.
Licensed to Nick Wood <nwood888@yahoo.com>
322
C
HAPTER
16 
Data: actions, preferences, files, SQLite, and addresses
-(IBAction)newContact:(id)sender {
ABNewPersonViewController *myAdder =
[[ABNewPersonViewController alloc] init];
myAdder.newPersonViewDelegate = self;
UINavigationController *myNav = [[UINavigationController alloc]
initWithRootViewController:myAdder];
[self presentModalViewController:myNav animated:YES];
[myAdder release];
[myNav release];
}
- (void)newPersonViewController:
(ABNewPersonViewController *)newPersonViewController
didCompleteWithNewPerson:(ABRecordRef)person {
[self dismissModalViewControllerAnimated:YES];
}
The other two view controllers work the same way, except for the specifics about what 
methods each protocol defines.
The 
ABPersonViewController
displays the information for a specific user. You’ll 
need to set the 
displayedPerson
property to an 
ABRecordRef
before you call it up. 
This 
ABRecordRef
might have been retrieved from the Address Book search functions 
or from the people-picker, using the functions we’ve already discussed. The person 
view controller can optionally be editable. There’s one method listed in the protocol, 
which activates when an individual property is selected.
Finally, the 
ABUnknownPersonViewController
allows you to display the 
ABRecordRef
defined by 
displayedPerson
as if it were a real contact. Optionally, the user can create 
that information as a new contact, add it to an existing contact, or take property-based 
actions, like calling a number or showing a 
URL
. It’s a great way to give users the option 
to add contact info for your software company to their Address Book.
You should now understand the basics of how to use the Address Book in your own 
programs. 
16.6 Summary
In this chapter, we covered a variety of ways that you can import primarily text-based 
data into your iPhone program.
User action is one of the most important methods, and one well covered by previous 
sections. Besides the 
UITextField
s, 
UITextView
s, and 
UISearchBar
s, there are any 
number of non-textual interface options.
Preferences mark the other major way that users can influence your program. You 
can either program them manually or use the System Setting bundle.
Ultimately, user input is going to be somewhat limited because of the slow typing 
speed of the iPhone. If you’re dealing with piles of text, you more frequently want to 
pull that data from an existing resource on the iPhone.
Listing 16.12 Functionality required to call up a new-person view controller
Licensed to Nick Wood <nwood888@yahoo.com>
323
Summary
Files are the traditional way to do it. We’ll return to files as we deal with photos and 
sounds in the future. Databases are frequently an easier way to access data, particularly 
if the data is well organized. Finally, the Address Book gives you a way to share contact 
information among many different applications, and it even includes its own data 
entry routines.
There’s only one data-input method that we’ve largely ignored: the internet. We 
consider that so important for the iPhone that we’ll cover it in its own chapter at the 
end of the book.
The data-input and retrieval methods discussed in this chapter will form a founda-
tion for much of the other work you do with the iPhone, because ultimately every-
thing’s data. You’ll need to retrieve data when you work with images and sounds. 
Similarly, you may want to save data from your accelerometer, Core Location, or when 
you’ve created a graphic. Keep what you’ve learned here in your back pocket as you 
move on to the rest of the iPhone toolbox.
We’re now ready to move on to what we expect are two of the most anticipated top-
ics in this book: how to work with the iPhone’s accelerometers and its 
GPS
to deter-
mine locations.
Licensed to Nick Wood <nwood888@yahoo.com>
324
Positioning: 
accelerometers 
and location
When we first introduced the iPhone, we highlighted a number of its unique fea-
tures. Among them were two components that allow the iPhone to figure out pre-
cisely where it is in space: a trio of accelerometers, which give it the ability to sense 
motion in three dimensions, and a locational device (using either 
GPS
or faux 
GPS
), which lets it figure out where in the world it is.
Other than accessing some basic orientation information, we haven’t done 
much with these features. That’s because most of the functionality isn’t available to 
the web interface, and because it lies beyond the basic concepts of the 
SDK
that 
we’ve covered so far. But now we’ll dive into these positioning technologies and 
examine how to use them in your programming.
This chapter covers
Measuring gravity
Gauging movement
Determining location
Licensed to Nick Wood <nwood888@yahoo.com>
325
The accelerometer and orientation
We’re going to start off with some new ways to look at orientation data, and then 
we’ll expand into some original possibilities.
17.1 The accelerometer and orientation
The easiest use of the accelerometers is to determine the iPhone’s current orienta-
tion. We already used the view controller’s 
interfaceOrientation
property, back in 
chapter 13. As we mentioned at the time, though, you can also access orientation 
information through the 
UIDevice
object. It can provide more information and real-
time access that isn’t available using the view controller.
There are two ways to access the 
UIDevice
information: through properties and 
through a notification.
17.1.1 The orientation property
The easy way to access the 
UIDevice
’s orientation information is to look at its 
orien-
tation
property. You must first access the 
UIDevice
itself, which you can do by calling 
a special 
UIDevice
class method, pretty much the same way you access the 
UIApplica-
tion
object:
UIDevice *thisDevice = [UIDevice currentDevice];
Once you’ve done this, you can get to the 
orientation
property. It will return a con-
stant drawn from 
UIDeviceOrientation
. This looks exactly like the results from a view 
controller’s 
orientation
property except there are three additional values, shown in 
table 17.1. 
These three additional values are one reason you might want to access the 
UIDevice
object rather than examine orientation using a view controller.
17.1.2 The orientation notification
The 
UIDevice
class can also give you instant access to an orientation change when it 
occurs. This is done through a notification (a topic we introduced in chapter 14). List-
ing 17.1 shows how to access this information.
Table 17.1 UIDeviceOrientation lists seven values for a device’s orientation.
Constant
Summary
UIDeviceOrientationPortrait
iPhone is vertical, right side up
UIDeviceOrientationPortraitUpsideDown
iPhone is vertical, upside down
UIDeviceOrientationLandscapeLeft
iPhone is horizontal, tilted left
UIDeviceOrientationLandscapeRight
iPhone is horizontal, tilted right
UIDeviceOrientationFaceUp
iPhone is lying on its back
UIDeviceOrientationFaceDown
iPhone is lying on its screen
UIDeviceOrientationUnknown
iPhone is in an unknown state
Licensed to Nick Wood <nwood888@yahoo.com>
Documents you may be interested
Documents you may be interested