<?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>ZenBrains &#187; progra</title>
	<atom:link href="http://www.zenbrains.com/blog/tag/progra/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zenbrains.com/blog</link>
	<description>IPhone Development Team</description>
	<lastBuildDate>Tue, 17 May 2011 21:06:43 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Consulta de bases de datos (sqlite) desde objective-c</title>
		<link>http://www.zenbrains.com/blog/2010/05/consulta-de-bases-de-datos-sqlite-desde-objective-c/</link>
		<comments>http://www.zenbrains.com/blog/2010/05/consulta-de-bases-de-datos-sqlite-desde-objective-c/#comments</comments>
		<pubDate>Sun, 09 May 2010 18:41:50 +0000</pubDate>
		<dc:creator>Aram Julhakyan</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[progra]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=304</guid>
		<description><![CDATA[En este artículo vamos a ver un simple ejemplo de como acceder a una base de datos sqlite desde nuestro código. Las bases de datos sqlite se usan mucho en las aplicaciones para guardar datos de forma organizada localmente. Al final del artículo vamos a tener dos funciones creados que podremos reutilizar en nuestros proyectos [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F05%2Fconsulta-de-bases-de-datos-sqlite-desde-objective-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F05%2Fconsulta-de-bases-de-datos-sqlite-desde-objective-c%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>En este artículo vamos a ver un simple ejemplo de como acceder a una base de datos sqlite desde nuestro código.</p>
<p>Las bases de datos sqlite se usan mucho en las aplicaciones para guardar datos de forma organizada localmente.</p>
<p>Al final del artículo vamos a tener dos funciones creados que podremos reutilizar en nuestros proyectos (el link de descarga abajo de todo).<br />
Entonces, vamos a ver los pasos a seguir para acceder a nuestra base de datos.</p>
<p>Antes de empezar con el código tenemos que añadir la librería de sqlite a nuestro proyecto. Para esto hacemos click con el botón derecho en la carpeta/grupo de frameworks de nuestro proyecto y seleccionamos Add &gt; Existing Frameworks&#8230;</p>
<p>Esto nos abrirá una ventana de selección donde tenemos que buscar y seleccionar el framework/librería de sqlite.  Buscamos el libsqlite3.dylib y lo añadimos al nuestro proyecto.</p>
<p>En el fichero donde vayamos a usar las funciones de sqlite para consultar nuestra base de datos tenemos que incluir el sqlite3.h:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;sqlite3.h&quot;</span></pre></div></div>

<p>Con esto ya estamos preparados para llamar a funciones de la api de sqlite.</p>
<p>La interfaz de acceso a sqlite está hecho en C por lo que podemos acceder a esas funciones sin problemas directamente desde Objective-C. Hay muchas funciones en la api de sqlite que no vamos a usar en los ejemplos de este artículo pero pueden ser indespensables para otros escenarios. Podeís consultar la documentación completa de la api de sqlite <a href="http://www.sqlite.org/capi3ref.html">aquí</a>.</p>
<p>Vamos a diferenciar dos tipos de consultas: consultas de selección de datos (SELECT) y consultas de modificación (INSERT, UPDATE, DELETE).</p>
<p><strong>IMPORTANTE:</strong> <em>no podemos hacer consultas de modificación a la base de datos si está se encuetra entre nuestros ficheros de recursos ya que allí no tenemos permisos de escritura. Para eso lo que se suele hacer es copiar la base de datos desde recursos a la carpeta Documents de nuestra aplicación cuando ejecutamos por primera vez nuestra app.</em></p>
<p>A continuación vamos a ver un ejemplo de un método que recibe una consulta de selección y nos devuelve un array donde cada elemento de ese array es un registro. Ese registro a su vez es un array donde cada elemento representa a un campo de ese registro. En los comentarios del ejemplo pueden ver las eplicaciones de las funciones usadas:</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;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>executeSelect<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>query<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Declaramos el puntero de la base de datos</span>
	sqlite3 <span style="color: #002200;">*</span>db;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Obtenemos el path de nuestra base de datos</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>path <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@/Documents/nuestraBaseDeDatos.sqlite&quot;</span>, NSHomeDirectory<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Intentamos abrir nuestra base de datos</span>
	<span style="color: #a61390;">int</span> r <span style="color: #002200;">=</span> sqlite3_open<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>path UTF8String<span style="color: #002200;">&#93;</span>, <span style="color: #002200;">&amp;</span>amp;db<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>r <span style="color: #002200;">!=</span> SQLITE_OK<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
		NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Error al abrir la base de datos&quot;</span><span style="color: #002200;">&#41;</span>;
		<span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">//sqlite3_stmt representa nuestra consulta</span>
	sqlite3_stmt <span style="color: #002200;">*</span>statement;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Creamos nuestro array que contendrá los resultados de nuestra consulta</span>
	<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>ar <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithCapacity<span style="color: #002200;">:</span><span style="color: #2400d9;">10</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Con esta línea se compila la consulta</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>sqlite3_prepare_v2<span style="color: #002200;">&#40;</span>db, <span style="color: #002200;">&#91;</span>query UTF8String<span style="color: #002200;">&#93;</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">1</span>, <span style="color: #002200;">&amp;</span>amp;statement, <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>
		<span style="color: #11740a; font-style: italic;">//Obtenemos el número de columnas/campos que van a tener los registros devueltos por nuestra consulta</span>
		<span style="color: #a61390;">int</span> columns <span style="color: #002200;">=</span> sqlite3_column_count<span style="color: #002200;">&#40;</span>statement<span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//sqlite3_step devuelve un registro, entonces miestras hay registos los</span>
		<span style="color: #11740a; font-style: italic;">//añadimos a nuestro array.</span>
		<span style="color: #a61390;">while</span> <span style="color: #002200;">&#40;</span>sqlite3_step<span style="color: #002200;">&#40;</span>statement<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>
			<span style="color: #11740a; font-style: italic;">//Declaramos el array donde guardaremos los datos del registro actual</span>
			<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>arc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithCapacity<span style="color: #002200;">:</span>columns<span style="color: #002200;">&#93;</span>;
&nbsp;
			<span style="color: #11740a; font-style: italic;">//Por cada campo del registro obtenido comprobamos si es NULL.</span>
			<span style="color: #11740a; font-style: italic;">//Si es nullo añadimos un texto vacio, sino, el texto del regitstro</span>
			<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; columns; i<span style="color: #002200;">++</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
				<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>sqlite3_column_text<span style="color: #002200;">&#40;</span>statement, i<span style="color: #002200;">&#41;</span> <span style="color: #002200;">==</span> <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span>
					<span style="color: #002200;">&#91;</span>arc addObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#93;</span>;
				<span style="color: #a61390;">else</span>
					<span style="color: #002200;">&#91;</span>arc addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">char</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>sqlite3_column_text<span style="color: #002200;">&#40;</span>statement, i<span style="color: #002200;">&#41;</span>
													  encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span>
					 <span style="color: #002200;">&#93;</span>;
&nbsp;
			<span style="color: #002200;">&#125;</span>
			<span style="color: #11740a; font-style: italic;">//Añadimos el registro actual a nuestro array de registros a devolver</span>
			<span style="color: #002200;">&#91;</span>ar addObject<span style="color: #002200;">:</span>arc<span style="color: #002200;">&#93;</span>;
			<span style="color: #11740a; font-style: italic;">//libermos la memoria del registro actual</span>
			<span style="color: #002200;">&#91;</span>arc release<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #11740a; font-style: italic;">//con esto liberamos la memoria usada por nuestra consulta</span>
	sqlite3_finalize<span style="color: #002200;">&#40;</span>statement<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//cerramos la base de datos.</span>
	sqlite3_close<span style="color: #002200;">&#40;</span>db<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>ar autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">return</span> ar;
&nbsp;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Visto el ejemplo de código para una consulta de selección vamos a ver otro de ejemplo para las consultas de modificación que es mucho más simple.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//Sirve para ejecutar comandos sql que no devuelven resultados</span>
<span style="color: #002200;">+</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>executeQuery<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>query<span style="color: #002200;">&#123;</span>
	sqlite3 <span style="color: #002200;">*</span>db;
&nbsp;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>path <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@/Documents/miBaseDeDatos.sqlite&quot;</span>, NSHomeDirectory<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">int</span> r <span style="color: #002200;">=</span> sqlite3_open<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>path UTF8String<span style="color: #002200;">&#93;</span>, <span style="color: #002200;">&amp;</span>amp;db<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>r <span style="color: #002200;">!=</span> SQLITE_OK<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
		NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Error al abrir la base de datos&quot;</span><span style="color: #002200;">&#41;</span>;
		<span style="color: #a61390;">return</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	sqlite3_stmt <span style="color: #002200;">*</span>statement;
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>sqlite3_prepare_v2<span style="color: #002200;">&#40;</span>db, <span style="color: #002200;">&#91;</span>query UTF8String<span style="color: #002200;">&#93;</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">1</span>, <span style="color: #002200;">&amp;</span>amp;statement, <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;
		sqlite3_step<span style="color: #002200;">&#40;</span>statement<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span><span style="color: #a61390;">else</span><span style="color: #002200;">&#123;</span>
		NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;******** Error DB: %@&quot;</span>, query<span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	sqlite3_finalize<span style="color: #002200;">&#40;</span>statement<span style="color: #002200;">&#41;</span>;
	sqlite3_close<span style="color: #002200;">&#40;</span>db<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Para que estos ejemplos funciones tenéis que poner los paths correctos hacía vuestros bases de datos.<br />
También hay que tener en cuenta que estos métodos no son muy óptimos ya que por cada llamada se ha de conectar a la base de datos y volver a desconectarse, tampoco está muy optimizado la forma de obtener los registros. Pero el código funciona muy bien en escenarios donde no se hace un uso muy intensivo de la base de datos y sirve como un buen ejemplo para empezar con sqlite.<br />
Si no queréis trabajar con la api C de sqlite también se pueden usar los numerosos wrappers que existen para facilitar el acceso a la base de datos. Un de estos que nos gusta es el <a href="http://code.google.com/p/flycode/source/browse/trunk/fmdb/#fmdb/src">FMDB</a>.</p>
<p><a href="http://www.zenbrains.com/blog/wp-content/uploads/2010/05/DBMngr.zip">Descargar ficheros del ejemplo.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/05/consulta-de-bases-de-datos-sqlite-desde-objective-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

