<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iphone.mitchallen.com &#187; persistence</title>
	<atom:link href="http://mitchallen.com/iphone/archives/category/persistence/feed" rel="self" type="application/rss+xml" />
	<link>http://mitchallen.com/iphone</link>
	<description>random notes on iPhone development</description>
	<lastBuildDate>Tue, 10 Aug 2010 20:36:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Experimental Database Class</title>
		<link>http://mitchallen.com/iphone/archives/134</link>
		<comments>http://mitchallen.com/iphone/archives/134#comments</comments>
		<pubDate>Fri, 15 May 2009 21:12:54 +0000</pubDate>
		<dc:creator>Mitch  Allen</dc:creator>
				<category><![CDATA[persistence]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[sqlite3]]></category>

		<guid isPermaLink="false">http://mitchallen.com/iphone/?p=134</guid>
		<description><![CDATA[This is an incomplete experiment creating a class to manage an sqlite3 database on the iPhone. The place that needs the most work is the mcaDB::queryDB() method. The plan is to eventually have this method populate an array or list that I can access after the query is finished. There are methods in PHP that [...]]]></description>
			<content:encoded><![CDATA[<p>This is an incomplete experiment creating a class to manage an sqlite3 database on the iPhone.</p>
<p>The place that needs the most work is the mcaDB::<strong>queryDB</strong>() method. The plan is to eventually have this method populate an array or list that I can access after the query is finished. There are methods in PHP that do similar things.</p>
<p>What got me started was Chapter 11: Basic Data Persistence in <a href="http://mitchallen.com/iphone/archives/119">Beginning iPhone Development</a>.</p>
<p>You can find documentation and the API reference for SQLite here: <a href="http://www.sqlite.org/">http://www.sqlite.org</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/*
 *  mcaDB.h
 *  mcaDB1
 *
 *  Created by Mitchell Allen on 5/15/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">/*
 *  Instructions for linking to sqlite3 library
 *
 *  In Xcode:
 *
 *      Click on folder: Groups &amp;amp; File / Frameworks
 *      Select menu: Project / Add to Project ...
 *      Navigate to:  /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator[version].sdk/usr/lib/
 *      Select file: libsqlite3.dylib
 *      Uncheck: Copy items into destination groups folder if needed
 *      Change Reference Type to: Relative to Current SDK
 */</span>
&nbsp;
<span style="color: #6e371a;">#include &quot;/usr/include/sqlite3.h&quot;</span>
&nbsp;
<span style="color: #6e371a;">#include &quot;mcaUtils.h&quot;</span>
&nbsp;
class mcaDB <span style="color: #002200;">&#123;</span>
&nbsp;
protected<span style="color: #002200;">:</span>
&nbsp;
	sqlite3	<span style="color: #002200;">*</span>m_database;
&nbsp;
	bool m_open;
&nbsp;
public<span style="color: #002200;">:</span>
&nbsp;
	<span style="color: #a61390;">void</span> errorDB<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	bool openDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>szDB <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">void</span> closeDB<span style="color: #002200;">&#40;</span> bool bForce <span style="color: #002200;">&#41;</span>;
&nbsp;
	bool execDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>szSQL <span style="color: #002200;">&#41;</span>;
&nbsp;
	bool queryDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>szSQL <span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span>;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/*
 *  mcaDB.mm
 *  mcaDB1
 *
 *  Created by Mitchell Allen on 5/15/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */</span>
&nbsp;
<span style="color: #6e371a;">#include &quot;mcaDB.h&quot;</span>
&nbsp;
<span style="color: #a61390;">void</span> mcaDB<span style="color: #002200;">::</span>errorDB<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
	mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ERROR&quot;</span>, sqlite3_errmsg<span style="color: #002200;">&#40;</span> m_database <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
bool mcaDB<span style="color: #002200;">::</span>openDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>szDB <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mcaDB::openDB( ... )&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
	mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;DATABASE&quot;</span>, szDB <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> sqlite3_open<span style="color: #002200;">&#40;</span> szDB, <span style="color: #002200;">&amp;</span>amp;m_database <span style="color: #002200;">&#41;</span> <span style="color: #002200;">!=</span> SQLITE_OK <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		errorDB<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
		closeDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">true</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span> <span style="color: #a61390;">false</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	m_open <span style="color: #002200;">=</span> <span style="color: #a61390;">true</span>;
&nbsp;
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">true</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">void</span> mcaDB<span style="color: #002200;">::</span>closeDB<span style="color: #002200;">&#40;</span> bool bForce <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mcaDB::closeDB( ... )&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> m_open || bForce <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		sqlite3_close<span style="color: #002200;">&#40;</span> m_database <span style="color: #002200;">&#41;</span>;
&nbsp;
		m_open <span style="color: #002200;">=</span> <span style="color: #a61390;">false</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
bool mcaDB<span style="color: #002200;">::</span>execDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>szQuery <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mcaDB::execDB( ... )&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
	mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;QUERY&quot;</span>, szQuery <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_open <span style="color: #002200;">&#41;</span> <span style="color: #a61390;">return</span> <span style="color: #a61390;">false</span>;	
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> sqlite3_exec<span style="color: #002200;">&#40;</span> m_database, szQuery, <span style="color: #a61390;">NULL</span>, <span style="color: #a61390;">NULL</span>, <span style="color: #a61390;">NULL</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">!=</span> SQLITE_OK <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		errorDB<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span> <span style="color: #a61390;">false</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">true</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
bool mcaDB<span style="color: #002200;">::</span>queryDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>szSQL <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mcaDB::queryDB( ... )&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
	mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;QUERY&quot;</span>, szSQL <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_open <span style="color: #002200;">&#41;</span> <span style="color: #a61390;">return</span> <span style="color: #a61390;">false</span>;
&nbsp;
	sqlite3_stmt	<span style="color: #002200;">*</span>stmt;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> sqlite3_prepare_v2<span style="color: #002200;">&#40;</span> m_database, szSQL, <span style="color: #002200;">-</span><span style="color: #2400d9;">1</span>, <span style="color: #002200;">&amp;</span>amp;stmt, <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">==</span> SQLITE_OK<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		<span style="color: #a61390;">while</span><span style="color: #002200;">&#40;</span> sqlite3_step<span style="color: #002200;">&#40;</span> stmt <span style="color: #002200;">&#41;</span> <span style="color: #002200;">==</span> SQLITE_ROW <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
			NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... looping ... &quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
			<span style="color: #a61390;">int</span> iCols <span style="color: #002200;">=</span> sqlite3_column_count<span style="color: #002200;">&#40;</span> stmt <span style="color: #002200;">&#41;</span>;
&nbsp;
			<span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span> <span style="color: #a61390;">int</span> i <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; i <span style="color: #002200;">&amp;</span>lt; iCols; i<span style="color: #002200;">++</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
				<span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>colName <span style="color: #002200;">=</span> sqlite3_column_name<span style="color: #002200;">&#40;</span> stmt, i <span style="color: #002200;">&#41;</span>;
&nbsp;
				mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;COLUMN&quot;</span>, colName <span style="color: #002200;">&#41;</span>;
&nbsp;
				<span style="color: #a61390;">long</span> colType <span style="color: #002200;">=</span> sqlite3_column_type<span style="color: #002200;">&#40;</span> stmt, i <span style="color: #002200;">&#41;</span>;
&nbsp;
				<span style="color: #a61390;">switch</span><span style="color: #002200;">&#40;</span> colType <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
					<span style="color: #a61390;">case</span> SQLITE_INTEGER<span style="color: #002200;">:</span>
&nbsp;
						<span style="color: #a61390;">int</span> fldInt <span style="color: #002200;">=</span> sqlite3_column_int<span style="color: #002200;">&#40;</span> stmt, i <span style="color: #002200;">&#41;</span>;
						mcaUtils_logInteger<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;INTEGER&quot;</span>, fldInt <span style="color: #002200;">&#41;</span>;
&nbsp;
						<span style="color: #a61390;">break</span>;
					<span style="color: #a61390;">case</span> SQLITE_FLOAT<span style="color: #002200;">:</span>
&nbsp;
						NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;FLOAT&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
						<span style="color: #a61390;">float</span> fldFloat <span style="color: #002200;">=</span> sqlite3_column_double<span style="color: #002200;">&#40;</span> stmt, i <span style="color: #002200;">&#41;</span>;
						<span style="color: #a61390;">break</span>;
					<span style="color: #a61390;">case</span> SQLITE_TEXT<span style="color: #002200;">:</span>
&nbsp;
						<span style="color: #a61390;">const</span> <span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> fldStr <span style="color: #002200;">=</span> sqlite3_column_text<span style="color: #002200;">&#40;</span> stmt, i <span style="color: #002200;">&#41;</span>;
						mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;TEXT&quot;</span>, <span style="color: #002200;">&#40;</span><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> fldStr <span style="color: #002200;">&#41;</span>;
&nbsp;
						<span style="color: #a61390;">break</span>;
					<span style="color: #a61390;">case</span> SQLITE_BLOB<span style="color: #002200;">:</span>
&nbsp;
						<span style="color: #a61390;">int</span> fldSize <span style="color: #002200;">=</span> sqlite3_column_bytes<span style="color: #002200;">&#40;</span> stmt, i <span style="color: #002200;">&#41;</span>;
						mcaUtils_logInteger<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;BLOB (size)&quot;</span>, fldSize <span style="color: #002200;">&#41;</span>;
						<span style="color: #a61390;">break</span>;
					<span style="color: #a61390;">case</span> SQLITE_NULL<span style="color: #002200;">:</span>
						<span style="color: #a61390;">break</span>;
					<span style="color: #a61390;">default</span><span style="color: #002200;">:</span>
						<span style="color: #a61390;">break</span>;
				<span style="color: #002200;">&#125;</span>
			<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #002200;">&#125;</span>
&nbsp;
		sqlite3_finalize<span style="color: #002200;">&#40;</span>stmt<span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">true</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p><strong>Utility Class</strong></p>
<p>This is just something I whipped up to make it easy to log info in the class above while I debug. This will probably change.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/*
 *  mcaUtils.h
 *  mcaDB1
 *
 *  Created by Mitchell Allen on 5/15/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */</span>
&nbsp;
<span style="color: #a61390;">void</span> mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szLabel, <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> str <span style="color: #002200;">&#41;</span>;
<span style="color: #a61390;">void</span> mcaUtils_logInteger<span style="color: #002200;">&#40;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> szLabel, <span style="color: #a61390;">int</span> i <span style="color: #002200;">&#41;</span>;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/*
 *  mcaUtils.mm
 *  mcaDB1
 *
 *  Created by Mitchell Allen on 5/15/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */</span>
&nbsp;
<span style="color: #6e371a;">#include &quot;mcaUtils.h&quot;</span>
&nbsp;
<span style="color: #a61390;">void</span> mcaUtils_logString<span style="color: #002200;">&#40;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> szLabel, <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> str <span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szTemp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithUTF8String<span style="color: #002200;">:</span>str<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szMessage <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithFormat<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@ = %@&quot;</span>, szLabel, szTemp <span style="color: #002200;">&#93;</span>;
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> szMessage <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>szTemp release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>szMessage release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">void</span> mcaUtils_logInteger<span style="color: #002200;">&#40;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> szLabel, <span style="color: #a61390;">int</span> i <span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szMessage <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithFormat<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@ = %d&quot;</span>, szLabel, i <span style="color: #002200;">&#93;</span>;
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> szMessage <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>szMessage release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p><strong>Sample Usage</strong></p>
<p>This could go into say a viewController class file.</p>
<p>Define the name of your database.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#define TEST_DB_FILE	@&quot;/test.db1&quot;</span></pre></div></div>

<p>Build a complete path to your database file.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> dataFilePath;
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>paths <span style="color: #002200;">=</span> NSSearchPathForDirectoriesInDomains<span style="color: #002200;">&#40;</span>NSDocumentDirectory, NSUserDomainMask, <span style="color: #a61390;">YES</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>documentsDirectory <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>paths objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>documentsDirectory stringByAppendingString<span style="color: #002200;">:</span>TEST_DB_FILE<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Pass the full path of your database to an object &#8211; in say your view controllers <strong>viewDidLoad</strong> method.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">    m_table.initDB<span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self dataFilePath<span style="color: #002200;">&#93;</span> UTF8String<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>This is how you might define the method above. Yes, in a production environment the final method should always close the database before returning.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">void</span> testTable<span style="color: #002200;">::</span>initDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>szDB <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;START: testTable::initDB( ... )&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_db.openDB<span style="color: #002200;">&#40;</span> szDB <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... ERROR opening database&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_db.execDB<span style="color: #002200;">&#40;</span>  <span style="color: #bf1d1a;">&quot;DROP TABLE TEST_TABLE;&quot;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		<span style="color: #11740a; font-style: italic;">// Since this is just a test database - we drop the table every time to start fresh.</span>
&nbsp;
		NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... Couldn't drop table ... ignoring &quot;</span> <span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_db.execDB<span style="color: #002200;">&#40;</span>  <span style="color: #bf1d1a;">&quot;CREATE TABLE IF NOT EXISTS TEST_TABLE (ROW INTEGER PRIMARY KEY, PLANET TEXT);&quot;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... ERROR creating table&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_db.execDB<span style="color: #002200;">&#40;</span>  <span style="color: #bf1d1a;">&quot;INSERT OR REPLACE INTO TEST_TABLE (PLANET) VALUES ('Mercury');&quot;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... ERROR inserting row&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_db.execDB<span style="color: #002200;">&#40;</span>  <span style="color: #bf1d1a;">&quot;INSERT OR REPLACE INTO TEST_TABLE (PLANET) VALUES ('Venus');&quot;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... ERROR inserting row&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_db.queryDB<span style="color: #002200;">&#40;</span>  <span style="color: #bf1d1a;">&quot;SELECT COUNT(*) AS myCount FROM TEST_TABLE;&quot;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... ERROR querying DB&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> m_db.queryDB<span style="color: #002200;">&#40;</span>  <span style="color: #bf1d1a;">&quot;SELECT * FROM TEST_TABLE;&quot;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; ... ERROR querying DB&quot;</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #a61390;">return</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
        m_db.closeDB<span style="color: #002200;">&#40;</span> <span style="color: #a61390;">false</span> <span style="color: #002200;">&#41;</span>;
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;END: testTable::initDB( ... )&quot;</span> <span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p><strong>Log Output</strong></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">mcaDB1[3138:20b] START: testTable::initDB( ... )
mcaDB1[3138:20b] mcaDB::openDB( ... )
mcaDB1[3138:20b] DATABASE = /Users/apple/Library/Application Support/iPhone Simulator/User/Applications/.../Documents/test.db1
mcaDB1[3138:20b] mcaDB::execDB( ... )
mcaDB1[3138:20b] QUERY = DROP TABLE TEST_TABLE;
mcaDB1[3138:20b] mcaDB::execDB( ... )
mcaDB1[3138:20b] QUERY = CREATE TABLE IF NOT EXISTS TEST_TABLE (ROW INTEGER PRIMARY KEY, PLANET TEXT);
mcaDB1[3138:20b] mcaDB::execDB( ... )
mcaDB1[3138:20b] QUERY = INSERT OR REPLACE INTO TEST_TABLE (PLANET) VALUES ('Mercury');
mcaDB1[3138:20b] mcaDB::execDB( ... )
mcaDB1[3138:20b] QUERY = INSERT OR REPLACE INTO TEST_TABLE (PLANET) VALUES ('Venus');
mcaDB1[3138:20b] mcaDB::queryDB( ... )
mcaDB1[3138:20b] QUERY = SELECT COUNT(*) AS myCount FROM TEST_TABLE;
mcaDB1[3138:20b]  ... looping ...
mcaDB1[3138:20b] COLUMN = myCount
mcaDB1[3138:20b] INTEGER = 2
mcaDB1[3138:20b] mcaDB::queryDB( ... )
mcaDB1[3138:20b] QUERY = SELECT * FROM TEST_TABLE;
mcaDB1[3138:20b]  ... looping ...
mcaDB1[3138:20b] COLUMN = ROW
mcaDB1[3138:20b] INTEGER = 1
mcaDB1[3138:20b] COLUMN = PLANET
mcaDB1[3138:20b] TEXT = Mercury
mcaDB1[3138:20b]  ... looping ...
mcaDB1[3138:20b] COLUMN = ROW
mcaDB1[3138:20b] INTEGER = 2
mcaDB1[3138:20b] COLUMN = PLANET
mcaDB1[3138:20b] TEXT = Venus
mcaDB1[3138:20b] mcaDB::closeDB( ... )
mcaDB1[3138:20b] END: testTable::initDB( ... )</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://mitchallen.com/iphone/archives/134/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
