<?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>Tech</title>
	<atom:link href="http://pauloliveira.net/tech/pt/feed" rel="self" type="application/rss+xml" />
	<link>http://pauloliveira.net/tech</link>
	<description></description>
	<lastBuildDate>Thu, 11 Aug 2011 15:56:45 +0000</lastBuildDate>
	<language>pt</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Core Data: &#8220;Can&#8217;t merge models with two different entities named..&#8221; Error</title>
		<link>http://pauloliveira.net/tech/pt/core-data-cant-merge-models-with-two-different-entities-named-error</link>
		<comments>http://pauloliveira.net/tech/pt/core-data-cant-merge-models-with-two-different-entities-named-error#comments</comments>
		<pubDate>Thu, 11 Aug 2011 15:48:54 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[Core Data]]></category>
		<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=604</guid>
		<description><![CDATA[Se você está usando Versões no seu modelo Core Data você sempre deve iniciar seu Managed Object Model (NSManagedObjectModel) apontando a versão que você quer usar. Dentro do Application Bundle de sua app irá encontrar um arquivo com a extesão .momd,este arquivo é o Model Completo. Dentro desse arquivo você irá encontrar outros [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fcore-data-cant-merge-models-with-two-different-entities-named-error"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Se você está usando <strong>Versões </strong>no seu modelo Core Data você sempre deve iniciar seu <strong><em>Managed Object Model </em></strong>(<a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectModel_Class/">NSManagedObjectModel</a>) apontando a versão que você quer usar. Dentro do <em>Application Bundle </em>de sua app irá encontrar um arquivo com a extesão <code>.momd,</code>este arquivo é o <strong>Model Completo.</strong> Dentro desse arquivo você irá encontrar outros arquivos com extensão  <code>.mom</code>, cada arquivo <code>.mom</code> representa uma versão do seu modelo.</p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2011/08/capture-1.jpg"><img title="capture-1" src="http://pauloliveira.net/tech/wp-content/uploads/2011/08/capture-1.jpg" alt="" width="404" height="57" /></a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2011/08/capture-1.jpg"> </a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2011/08/capture-1.jpg"></a>Se você rodou sua aplicação apontando ao <strong>Modelo Completo </strong>com todas as versões dentro, Core Data irá criar o banco de dados com todas as versões, portanto temos o erro de <em>entity </em>duplicado mais adiante, o Core Data não sabe qual versão usar. Nesse ponto, a única forma para solucionar o problema é remover a aplicação, apontar o seu código para a versão correta e rodar novamente, então o Core Data irá criar somente uma versão do banco de dados.</p>
<p>Aqui um pedacinho de código que dá conta do recado:</p>
<pre class="brush: objc; title: ;">
NSString *fullModelName    = @&quot;myModel.momd&quot;;    // The name of the main model.
NSString *modelVersionName = @&quot;myModel1.0.mom&quot;;  // Only the name of the version.
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *modelPath = [NSString stringWithFormat:@&quot;%@/%@/%@&quot;, bundlePath, fullModelName,  modelVersionName];
//
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
</pre>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/core-data-cant-merge-models-with-two-different-entities-named-error/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Core Data Merging Conflicts</title>
		<link>http://pauloliveira.net/tech/pt/core-data-merging-conflicts</link>
		<comments>http://pauloliveira.net/tech/pt/core-data-merging-conflicts#comments</comments>
		<pubDate>Sat, 30 Jul 2011 15:26:50 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[Core Data]]></category>
		<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=578</guid>
		<description><![CDATA[Um dos erros mais comuns e que a mim me trouxe grandes dores de cabeça são erros de &#8220;Merging&#8221; do Core Data. No geral esses erros são vistos em aplicações multithread que utilizam o Core Data. E o Core Data é realmente complicado de trabalhar com esse tipo de aplicações. [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fcore-data-merging-conflicts"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><p>Um dos erros mais comuns e que a mim me trouxe grandes dores de cabeça são erros de &#8220;Merging&#8221; do Core Data. No geral esses erros são vistos em aplicações <em>multithread</em> que utilizam o Core Data. E o Core Data é realmente complicado de trabalhar com esse tipo de aplicações.</p>
<h2>Introdução</h2>
<p>Em todos os casos que queremos utilizar o Core Data com <em>multithread</em>, é necessário manter <strong>um contexto</strong> (<em>Managed Object Context)</em> por <em>thread.</em> O <strong>contexto</strong> é a representação do banco de dados na memória, é como um rascunho onde todas as mudanças nos dados são feitas antes de ser guardadas no banco de dados (<em>Persistent Store).</em></p>
<p><em> </em></p>
<p><em> </em>Portanto nós temos dois rascunhos independentes que podem gravar na base de dados em diferentes momentos e inevitavelmente algum conflito vai acontecer. Existem muitas técnicas que devem ser aplicadas para manter os dois rascunhos em sincronia, já que isso não acontece automaticamente. No geral é necessário criar algum tipo de <em>notificação</em> entre os diferentes <em>threads</em> e sincronizar os rascunhos para que estejam sempre iguais. Já vamos ter um <strong>artigo </strong>sobre<strong> </strong>o tema aqui no blog.</p>
<h2>Soluções</h2>
<p>Uma solução que é pouco utilizada porém muito poderosa é informar ao <strong>contexto</strong> como ele deve proceder no caso de encontrar conflitos. Vejamos em código:</p>
<p>
<pre class="brush: objc; title: ;">[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];</pre>
</p>
<p>O <strong>contexto</strong> sempre vem configurado para gerar um erro (<em>Exception)</em> no caso de encontrar conflitos, no código acima estamos configurando o <strong>contexto</strong> para resolver os conflitos automaticamente sempre dando preferência para os dados que estão no rascunho que está gravando no momento.</p>
<p>Claro está que soluciona o problema por um lado, mas se a arquitetura de sua aplicação <em>multithread </em>não está bem pensada você irá perder dados importantes. Portanto habilite essa configuração e faça os testes necessários para estar seguro que os dados estão sendo gravados corretamente entre os diferentes <em>threads</em>.</p>
<p>Veja <a href="http://developer.apple.com/library/mac/documentation/CoreData/Reference/NSMergePolicy_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40010614-CH1-SW1">Core Data Merge Policies</a> para saber as diferentes opções que você pode usar para configurar o seu <strong>contexto. </strong>Veja também <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320-SW7">Object Life-Cycle Problems</a> e <a href="http://developer.apple.com/library/mac/#documentation/CoreData/Reference/NSMergePolicy_Class/Reference/Reference.html#//apple_ref/occ/cl/NSMergePolicy">NSMergePolicy Class Reference</a>.</p></p>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/core-data-merging-conflicts/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desinstalando o XCode</title>
		<link>http://pauloliveira.net/tech/pt/uninstalling-xcode</link>
		<comments>http://pauloliveira.net/tech/pt/uninstalling-xcode#comments</comments>
		<pubDate>Sun, 12 Dec 2010 23:12:40 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=553</guid>
		<description><![CDATA[Nunca é uma boa idéia instalar correndo a última versão do XCode, simplesmente para manter a compatibilidade com os seus projetos. O ideal é baixar a nova versão e instalar em uma pasta diferente. Mantendo assim as duas versões e gradualmente ir testando e verificando se a nova versão funciona [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Funinstalling-xcode"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Nunca é uma boa idéia instalar correndo a última versão do <strong><a href="http://developer.apple.com/technologies/tools/xcode.html">XCode</a></strong>, simplesmente para manter a compatibilidade com os seus projetos. O ideal é baixar a nova versão e instalar em uma pasta diferente. Mantendo assim as duas versões e gradualmente ir testando e verificando se a nova versão funciona corretamente com seus projetos.</p>
<p>Para saber o momento de desinstalar uma velha versão, é quando passou várias semanas sem abri-lá, já é o momento de despedi-la.</p>
<h1><em>Como faço isso? </em></h1>
<p>Por incrível que pareça, é muito, muito simples. O XCode vem com um <em>script</em> de linha de comando que desinstala facilmente todos os componentes ou somente alguns.</p>
<p>Esse <em>script</em> está nessa pasta:</p>
<p><em><strong>pasta_xcode/Library/</strong></em></p>
<p>E se chama:</p>
<p><em>uninstall-devtools</em></p>
<p>Esse <em>script</em> permite inclusive informar um parâmetro que define quais componentes queremos desinstalar. Para isso abrimos o <strong>Terminal </strong>e executamos os seguintes comandos:</p>
<pre class="brush: plain; title: ;">cd pasta inicia/Library
sudo ./uninstall-devtools --help</pre>
<p>O script irá listar as opções possíveis, escolha a que mais lhe convém. Por exemplo, para desinstalar todos os componentes:</p>
<pre class="brush: plain; title: ;">sudo ./uninstall-devtools--mode=all</pre>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/screenshot1012122001051.jpg"><img class="alignnone size-full wp-image-556" title="screenshot1012122001051" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/screenshot1012122001051.jpg" alt="" width="802" height="380" /></a></p>
<p>Quando o script finalizar, verifique que algumas pastas não foram deletadas. Em sua maioria são configurações. Verifique o que necessita desses arquivos, se não precisa deles. Pode deletar tranquilamente.</p>
<h2>Realmente simples, com isso damos Adeus a versões antigas do XCode.</h2>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/uninstalling-xcode/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalando Tomcat no Mac OS</title>
		<link>http://pauloliveira.net/tech/pt/installing-tomcat-on-mac-os</link>
		<comments>http://pauloliveira.net/tech/pt/installing-tomcat-on-mac-os#comments</comments>
		<pubDate>Wed, 08 Dec 2010 20:07:26 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Mac OS]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=533</guid>
		<description><![CDATA[Esse artigo ilustra uma instalação básica do Tomcat 7 usando o Mac OS 10.6.4. Pré-Requisitos Essa versão do Mac OS já têm o Java Virtual Machine instalado, portanto não temos que preocupar-nos com ela. Você deve simplesmente baixar o Tomcat, para isso encontre a última versão nesse endereço: http://tomcat.apache.org/download-70.cgi. Copie [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Finstalling-tomcat-on-mac-os"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><strong>Esse artigo ilustra uma instalação básica do <a href="http://tomcat.apache.org/download-70.cgi">Tomcat 7</a> usando o <a href="http://www.apple.com/macosx/">Mac OS 10.6.4.</a></strong></p>
<h1><em>Pré-Requisitos</em></h1>
<p>Essa versão do Mac OS já têm o <strong><a href="http://es.wikipedia.org/wiki/M%C3%A1quina_virtual_Java">Java Virtual Machine</a> </strong>instalado<a style="font-weight: bold;" href="http://es.wikipedia.org/wiki/M%C3%A1quina_virtual_Java">,</a> portanto não temos que preocupar-nos com ela. Você deve simplesmente baixar o <strong>Tomcat</strong>, para isso encontre a última versão nesse endereço: <a href="http://tomcat.apache.org/download-70.cgi">http://tomcat.apache.org/download-70.cgi</a>.</p>
<ul>
<li>Copie o arquivo <strong>.zip </strong>no diretório que deseje instalar o Tomcat. Não há um lugar predefinido, sugiro a pasta de aplicações em <strong><em>/Applications/tomcat7.</em></strong></li>
<li>Descompacte (<em>unzip</em>) ess e arquivo dentro do pasta criada.</li>
</ul>
<h1><em>Iniciando o Tomcat Server</em></h1>
<p>Os arquivos de inicialização do Tomcat estão na pasta <em><strong>./tomcat7/bin</strong></em>. É necessário primeiro tornar os <em>scripts</em> executáveis. Para isso abra o <strong>Terminal</strong> e execute os seguintes comandos (<em>substitua os diretórios se você usando outro que não o sugerido)</em>:</p>
<pre class="brush: plain; title: ;">
cd /Applications/tomcat7/bin
chmod ug+x *.sh
</pre>
<p>Logo após informamos ao <strong>Tomcat</strong> qual é o seu diretório inicial, com o seguinte comando:</p>
<pre class="brush: plain; title: ;">
export CATALINA_HOME=/Applications/tomcat7
</pre>
<p>Já estamos prontos para iniciar o <strong>Tomcat </strong>com o seguinte comando:</p>
<pre class="brush: plain; title: ;">
./startup.sh
</pre>
<p>Se não houver nenhuma mensagem de erro o Tomcat já está rodando. Para comprovar isso, abra o seu browser e coloque o endereço: <em><a href="http://localhost:8080/">http://localhost:8080/</a>.</em></p>
<p><em> </em>Uma imagem semelhante a abaixo deve aparecer:</p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/screenshot1012081621171.jpg"><img class="alignnone size-full wp-image-539" title="screenshot1012081621171" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/screenshot1012081621171.jpg" alt="" width="893" height="566" /></a></p>
<h1><em>Configurando usuários</em></h1>
<p>Essa versão do <strong>Tomcat</strong> não vem com nenhum usuário configurado. Portanto devemos editar o arquivo de configurações. Para isso primeiro vamos <strong>parar</strong> o Tomcat (<em>shutdown</em>), para isso executamos o seguinte comando (<em>lembre-se que os comandos de start e shutdown estão dentro do diretório <strong>bin</strong></em>):</p>
<pre class="brush: plain; title: ;">
./shutdown.sh
</pre>
<p>Agora vamos editar o arquivo de usuários, esse arquivo está em: <em>/<strong>Applications/tomcat7/conf/tomcat-users.xml</strong>. </em>Veja abaixo uma base de exemplo de configuração desse arquivo, você deve configurar os seus usuários e seus direitos (roles):</p>
<pre>
<div id="_mcePaste">
<pre class="brush: xml; title: ;">&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;tomcat-users&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;role rolename=&quot;tomcat&quot;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;role rolename=&quot;role1&quot;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;role rolename=&quot;manager-gui&quot;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;role rolename=&quot;manager-script&quot;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;role rolename=&quot;manager-jmx &quot;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;role rolename=&quot;manager-status&quot;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;user username=&quot;meuusuario&quot; password=&quot;minhasenha&quot; roles=&quot;manager-gui&quot;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;tomcat-users&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;</pre>
</div>
<p>[/xml]</pre>
<h2>Muito bem, já temos o Tomcat funcionando e pronto para que possa colocar seus Servlets para rodar.</h2>
<div id="lightTable">Leituras recomendadas: <a href="http://developer.apple.com/internet/java/tomcat1.html">Java and Tomcat on Mac OS X</a> e <a href="http://tomcat.apache.org/tomcat-7.0-doc/">Apache Tomcat 7 Documentation</a></div>
<p>Uma dical final, é conveniente criar um <em>script</em> de <em><strong>start</strong></em> e outro de <strong><em>shutdown</em></strong> para economizar digitação se você tiver que reiniciar o <strong>Tomcat</strong> muito seguido, veja o conteúdo dos dois arquivos abaixo. Convém colocar esses arquivos no diretório <strong>/bin</strong> do <strong>Tomcat</strong>.</p>
<p>Script para start:</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;"><span style="line-height: 18px; white-space: pre;">
<pre class="brush: plain; title: ;"> #!/bin/sh export CATALINA_HOME=/Applications/tomcat7 $CATALINA_HOME/bin/startup.sh </pre>
<p></span></span></p>
<pre><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">Script para shutdown:</span></pre>
<pre class="brush: plain; title: ;">
#!/bin/sh
export CATALINA_HOME=/Applications/tomcat7
$CATALINA_HOME/bin/shutdown.sh
</pre>
<p>Não esqueça de tornar esses scripts executáveis usando o comando abaixo:</p>
<pre class="brush: plain; title: ;">
chmod ug+x |arquivo de start| |arquivo de shutdown|
</pre>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/installing-tomcat-on-mac-os/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSUserDefaults</title>
		<link>http://pauloliveira.net/tech/pt/nsuserdefaults</link>
		<comments>http://pauloliveira.net/tech/pt/nsuserdefaults#comments</comments>
		<pubDate>Sun, 05 Dec 2010 04:58:18 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[key-value]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=464</guid>
		<description><![CDATA[Esse artigo dá continuidade ao conceito de key-value tratado em outros artigos. NSUserDefaults é uma classe do Objective-C pensada para guardar valores de forma persistente em um lugar padrão para cada aplicação. Em outras palavras o iOS se ocupa de manter determinado valor guardado, inclusive depois que a aplicação for [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fnsuserdefaults"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Esse artigo dá continuidade ao conceito de<a href="http://pauloliveira.net/tech/tag/key-value"> key-value tratado em outros artigos.</a></p>
<h2><strong><a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html">NSUserDefaults</a></strong> é uma classe do <em>Objective-C </em>pensada para guardar valores de <strong>forma persistente </strong>em um lugar padrão para cada aplicação.</h2>
<p>Em outras palavras o <em>iOS</em> se ocupa de manter determinado valor guardado, inclusive depois que a aplicação for <strong>fechada</strong>. Quando abri-la novamente esse valor estará lá para ser recuperado. Muito conveniente para guardar valores de <em>settings</em>, por exemplo.</p>
<p>Esse valores são guardados usando o conceito de <em>key-value, </em>ou seja, o valor é identificado por uma <em>key</em> para ser <strong>guardado e recuperado.</strong></p>
<h1><em>Alguns exemplos.</em></h1>
<p>Nossos exemplos estão apontados para o uso em Cocoa Touch (iPhone, iPad, etc.), porém com algumas diferenças pode ser usado para Cocoa (Mac OS). Para cada aplicação uma instância geral do <a style="font-weight: bold;" href="http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html">NSUserDefaults</a> é criada automaticamente, portanto não temos que nos preocupar em alocar e iniciar uma nova.</p>
<p>Vamos pensar que temos uma aplicação de música e queremos guardar se o usuário têm o som em <em>mute</em>. Queremos que esse valor seja mantido inclusive se o usuário fechar a aplicação. Para isso temos o seguinte código:</p>
<pre class="brush: objc; title: ;">
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@&quot;soundMuted&quot;];
</pre>
<p>O método <em>standardUserDefaults</em> retorna essa instância geral que identifica nossa aplicação. E usamos o método <strong><em>setObject:forKey:</em></strong> para guardar algum valor. A classe <a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html">NSUserDefaults</a> cuida de todos os detalhes de persistência automaticamente, nesse momento se nossa aplicação for fechada, esse valor estará guardado para ser recuperado como no código abaixo:</p>
<div id="_mcePaste">
<pre class="brush: objc; title: ;">
BOOL muted = [[NSUserDefaults standardUserDefaults] boolForKey:@&quot;soundMuted&quot;];
</pre>
</div>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;"><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">No código acima recuperamos o valor, usando a </span><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;"><em>key</em></span><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;"> que o identifica. Note que estamos usando o método </span><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;"><strong><em>boolForKey:</em></strong></span><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;"> que retorna esse valor já convertido para o tipo </span><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;"><strong><em>BOOL</em></strong></span><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">. Esse método é por pura conveniência, já que se ocupa da conversão.</span></span></p>
<h2>E já terminamos. Essa classe é tão simples e poderosa que o básico é assim de simples e fácil.</h2>
<div id="lightTable">Para aprender mais sobre os métodos de guardar, recuperar e deletar valores veja a documentação de: <a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html">NSUserDefaults</a>.</div>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/nsuserdefaults/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Key-Value</title>
		<link>http://pauloliveira.net/tech/pt/key-value</link>
		<comments>http://pauloliveira.net/tech/pt/key-value#comments</comments>
		<pubDate>Sun, 05 Dec 2010 03:30:02 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[key-value]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=423</guid>
		<description><![CDATA[Esse é mais um artigo feito &#8220;a pedido&#8221;, bem bacana que o pessoal está colaborando e inclusive pedindo. Aliás, fiquem a vontade para comentar e pedir material. Para isso serve o blog. Nesse artigo vou tratar a princípio sobre a teoria de armazenar dados baseado em keys (chaves) e depois exemplos [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fkey-value"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><em>Esse é mais um artigo feito &#8220;a pedido&#8221;, bem bacana que o pessoal está colaborando e inclusive pedindo. Aliás, fiquem a vontade para comentar e pedir material. Para isso serve o blog.</em></p>
<h2>Nesse artigo vou tratar a princípio sobre a teoria de armazenar dados baseado em <em>keys (</em>chaves) e depois exemplos de aplicação prática em <em>Objective-C</em>.</h2>
<p>Vale lembrar que <em>key-value storage</em> se trata de um conceito, já que é independente de linguagem. Todas as linguagens modernas como <em>Java, PHP, Python, Ruby, Objective-C </em>entre outras tem alguma forma implementada de <em>key-value storage</em>.</p>
<p>O conceito é tão poderoso que <a href="http://pt.wikipedia.org/wiki/Banco_de_dados">bancos de dados </a>baseados em <em>key-value</em> estão surgindo, como o <a href="http://code.google.com/p/redis/">Redis</a>, mas isso é assunto para outro artigo.</p>
<h1><em>Primeiro a teoria </em></h1>
<p>Vamos imaginar uma pilha de dados (<em>uma lista ou coleção)</em> não ordenada. Cada elemento dessa <strong>coleção</strong> é armazenado e <strong>identificado</strong> por um elemento único: uma <em>key</em> (chave).</p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/key-value-pile.jpg"><img class="alignnone size-full wp-image-434" title="key-value-pile" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/key-value-pile.jpg" alt="" width="324" height="203" /></a><br />
Podemos observar no gráfico acima essa idéia e afirmar os seguintes pontos referentes a uma coleção de <em>key-value:</em></p>
<ul>
<li><span>Cada <strong>valor</strong> na coleção é identificado por uma <strong><em>key</em> única,</strong> portanto não haverá duas <em>keys</em> iguais dentro de uma coleção.</span></li>
<li><span>Tanto a <em><strong>key</strong></em> como o <em><strong>value</strong></em> podem ser de <strong>tipos diferentes (</strong>númerico, string, etc.<strong>)</strong>.</span></li>
<li><span>A ordem dos elementos não é importante. Apesar que algumas linguagens implementam coleções de <em>key-value</em> ordenadas.</span></li>
</ul>
<h1><em>Agora a prática</em></h1>
<p>Vamos ver alguns exemplos práticos que irão ajudar a fixar o conceito. Em <em>Objective-C </em>uma coleção de <em>key-value</em> é chamada <strong><em>Dictionary</em></strong> e implementada nas classes <strong><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html">NSDictionary</a></strong> e <strong><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html">NSMutableDictionary</a></strong>.</p>
<p>As duas classes são iguais, a diferença entre elas é que <strong><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html">NSDictionary</a> </strong>uma vez instanciada não pode ser mutada, quer dizer, não se pode incluir ou remover elementos. E <strong><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html">NSMutableDictionary</a> </strong>sim. É possível converter um dicionário imutável em mutável criando uma cópia, para isso usamos o método <strong>mutableCopy </strong>como no código abaixo:</p>
<p>
<pre class="brush: objc; title: ;">&lt;br /&gt;
NSMutableDictionary *copiaMutavel = [instanciaImutavel mutableCopy];&lt;br /&gt;
</pre>
</p>
<h2>Vejamos como criar um dicionário, para isso usamos o seguinte código:</h2>
<p>
<pre class="brush: objc; title: ;">&lt;br /&gt;
	NSString *key   = @&amp;quot;fusca&amp;quot;;&lt;br /&gt;
	NSString *valor = @&amp;quot;vermelho&amp;quot;;&lt;/p&gt;
&lt;p&gt;	NSMutableDictionary *colecao = [NSMutableDictionary dictionary];&lt;br /&gt;
	[colecao setObject:valor forKey:key];&lt;br /&gt;
</pre>
</p>
<p>O código acima cria uma instância do <strong>dicionário</strong>, e insere um <strong>valor</strong> identificado por uma <strong>key</strong>. Esse valor está guardado em nossa coleção, para pegar esse valor de volta usamos o seguinte código:</p>
<p>
<pre class="brush: objc; title: ;">&lt;br /&gt;
NSString *recuperado = [colecao objectForKey:@&amp;quot;fusca&amp;quot;];&lt;br /&gt;
</pre>
</p>
<p>Vamos incluir em nossa coleção outros valores:</p>
<p>
<pre class="brush: objc; title: ;">&lt;br /&gt;
[colecao setObject:@&amp;quot;número&amp;quot; forKey:[NSNumber numberWithInt:23]];&lt;br /&gt;
[colecao setObject:@&amp;quot;verde&amp;quot; forKey:&amp;quot;chevette&amp;quot;]&lt;br /&gt;
</pre>
</p>
<p>Nossa coleção nesse momento está como na figura que vimos na parte teórica. Vale lembrar que as classes de Dicionário do <em>Objective-C</em> somente aceitam <strong>objetos</strong> como <strong><em>key</em></strong> ou <strong><em>value</em></strong>, variáveis não são aceitas.</p>
<div id="lightTable">Para aprender mais sobre os métodos de manipulação dos dicionários ver documentação de: <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html">NSDictionary</a> e <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html">NSMutableDictionary</a>.</div>
<h2>Veja o artigo sobre <a href="http://pauloliveira.net/tech/nsuserdefaults">NSUserDefaults</a> para conhecer outras aplicações de <em>key-value </em>em<em> Objective-C</em>.</h2>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/key-value/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web services</title>
		<link>http://pauloliveira.net/tech/pt/webservices</link>
		<comments>http://pauloliveira.net/tech/pt/webservices#comments</comments>
		<pubDate>Sat, 04 Dec 2010 04:32:20 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=363</guid>
		<description><![CDATA[A pedido de meu irmão, vou tentar resumir o conceito de web services. Vale lembrar que esse artigo serve como &#8220;porta de entrada&#8221; para um conceito que é muito mais amplo. Portanto Google, Wikipedia, livros, blogs, são todos seus amigos. Quando pensar que o conceito está completo na cabeça&#8230; Procure [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fwebservices"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>A pedido de meu <a href="http://twitter.com/#!/arthuraoliveira">irmão</a>, vou tentar resumir o conceito de <strong><a href="http://pt.wikipedia.org/wiki/Web_service">web services</a></strong>. Vale lembrar que esse artigo serve como &#8220;porta de entrada&#8221; para um conceito que é muito mais amplo. Portanto Google, <a href="http://pauloliveira.net/tech/wikipedia-needs-your-donation">Wikipedia</a>, livros, blogs, são todos seus amigos. Quando pensar que o conceito está completo na cabeça&#8230; Procure um pouco mais! Afinal, nunca deixamos de aprender.</p>
<h1><em>Para começar, um pouco de história</em></h1>
<p>Não faz muito tempo, os programas eram <strong>mono-usuário </strong>e <strong>mono-tarefa,</strong> rodavam um por vez em sistemas operacionais como <strong>DOS</strong>. O seguinte passo foi a introdução de sistemas operacionais com interface gráfica como o <strong>Windows</strong>, os programas passaram a ser <strong>multi-tarefa</strong> e conectados em redes <strong>multi-usuários.</strong></p>
<p>O próximo passo nessa evolução é o conceito de aplicações <strong>cliente-servidor</strong>, nesse modelo, uma aplicação se divide em uma parte de <strong>interação com o usuário </strong>(<em>cliente</em>) e outra de <strong>processamento e/ou armazenamento de dados </strong>(<em>servidor</em>). Esse padrão também permitiu que as duas partes passassem a residir em computadores (máquinas físicas) diferentes.</p>
<p>Com a necessidade de atender a arquitetura de negócios cada vez maiores, projetos de rede cada vez mais complexos foram criados em muitos casos vinculando sucursais de empresas em várias cidades ou mesmo países, entramos em uma era na qual as aplicações estão distribuídas e os processos se realizam em diferentes unidades. Sendo esse um  dos grandes motivos pelo qual nasceu a <strong>internet</strong>.</p>
<h2>O ponto final para essa cronologia, são os <em>web services. </em>É um passo a frente em computação, já que nesse paradigma um computador já não se considera um núcleo de cômputo, senão um repositório de serviços de várias aplicações distribuídas em uma rede (em geral a internet).</h2>
<h1><em>Entendendo melhor o conceito</em></h1>
<p>Vamos imaginar uma rede composta pelos <strong>servidores A, B e C</strong>. Cada servidor dispõe de diferentes <strong>serviços</strong>. Imaginemos que o <strong>servidor W </strong>dispõe de um <strong>serviço principal </strong>que é consumido por <strong>clientes</strong> em máquinas de sua <strong>rede local </strong>e também desenhado para servir a <strong>clientes</strong> que se conectem <strong>através da internet.</strong> Por sua vez esse serviço principal <strong>consome serviços </strong>de todos os outros servidores. O gráfico abaixo ilustra essa rede:</p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/webservice1.jpg"><img class="alignnone size-full wp-image-368" title="webservice1" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/webservice1.jpg" alt="" width="801" height="633" /></a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/webservice1.jpg"> </a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/webservice1.jpg"></a>Nessa rede imaginária, não sabemos a localização física de cada servidor, não sabemos que tipo de servidor é (<em>físico, virtual</em>), não sabemos qual sistema operacional usam, qual aplicação está rodando ou qual linguagem essas aplicações foram desenvolvidas. Temos portanto muitíssimas possibilidades de combinações e é necessário uma <strong>solução padrão</strong> para que todos esses servidores, clientes e aplicações <strong>possam conversar.</strong></p>
<h1><em>Arquitetura de serviços</em></h1>
<p><span style="font-size: 11.6667px;">A primeira parte a entender de um conceito de <strong><em>web services, é a parte &#8220;services&#8221;</em>. </strong>Devemos entender que as operações de um programa passam a ser pensadas como <strong>serviços</strong>. Um <strong>serviço</strong> pode ser uma <em>consulta de cliente</em>, uma <em>entrada de dados (cadastro),</em> entre tantas outras operações que um sistema pode fazer.</span></p>
<p>As aplicações são desenhadas para funcionar independente de seu entorno, elas não se conhecem. Em um modelo de programação tradicional, em um programa único, o programador sabe todas as funções, os diferentes arquivos de cada módulo, etc. e os chama diretamente. Em um arquitetura de serviços, os programas não se vinculam dessa forma. Eles simplesmente esperam receber uma requisição de um serviço, processam essa requisição e devolvem uma resposta.</p>
<p>A vantagem dessa desvinculação é que as aplicações podem ser divididas em diferentes servidores em lugares físicos ou virtuais. Podem ser aproveitados, substituídos ou modernizados sem afetar outras partes de um sistema geral.</p>
<h1><em>Necessidade de padrões</em></h1>
<p>Agora que começamos a entender a arquitetura. Surge uma grande questão:</p>
<h2>Se todas essas partes de um sistema não se conhecem, como elas podem falar uma mesma língua? Como se comunicam?</h2>
<p>Se comunicam pela <strong><em>parte &#8220;web&#8221; de web services</em>, </strong>ou seja, os padrões definidos pela <strong>World Wide Web </strong>ou<strong> WWW.</strong></p>
<p>O<strong> <a href="http://www.w3.org/">World Wide Web Consortium </a></strong>ao longo dos anos desde a abertura da internet homologou, definiu e amadureceu um conjunto de padrões e protocolos que permitem que milhões de sítios web funcionem em conjunto no que conhecemos como internet. Buscadores, redes sociais, blogs, sites de bancos, de música, de vídeos, de empresas e muitos outros se comunicam e permitem que possamos entrar em determinado sítio somente colocando um endereço em nosso browser. E em definitivo estamos<strong> consumindo serviços </strong>de diferentes aplicações em diferentes servidores que não temos idéia de onde estão ou como funcionam.</p>
<p>Portanto esses padrões são os adotados quando implementamos uma <strong>Arquitetura de Serviços</strong> baseada em padrões <strong>Web, </strong>mais curtinho:<strong> <em>Web services</em> !! </strong></p>
<h1><em>Os padrões</em></h1>
<p>A internet é uma <strong>rede viva,</strong> a cada dia surgem novas tecnologias, muitas delas independentes e <em>open-source</em>, outras criadas por grandes companhias e adotadas por comunidades de desenvolvedores, algumas são aceitas e homologadas pelo <em>WWW, </em>outras não são homologadas, mas ainda assim são amplamente usadas, etc.</p>
<p>Nesse cenário a implementação de uma arquitetura de <em>web services</em> pode variar segundo as necessidades de cada projeto. Entretanto algumas tecnologias são as adotadas como <em>standard </em>na maioria das implementações. As bases são os <a title="Protocolo" href="http://pt.wikipedia.org/wiki/Protocolo">protocolos</a> de <a title="Protocolo de transporte" href="http://pt.wikipedia.org/wiki/Protocolo_de_transporte">transporte</a> que normalmente são <a title="HTTP" href="http://pt.wikipedia.org/wiki/HTTP">HTTP</a>, ou <a title="HTTPS" href="http://pt.wikipedia.org/wiki/HTTPS">HTTPS</a> para conexões seguras. O padrão <a title="XML" href="http://pt.wikipedia.org/wiki/XML">XML</a> é usado para formatar os dados e o protocolo <a title="SOAP" href="http://pt.wikipedia.org/wiki/SOAP">SOAP</a> para definir as especificações dos <a href="http://pt.wikipedia.org/wiki/Pacote">pacotes</a> de dados que são transacionados pelo serviços.</p>
<p>Outros padrões são utilizados em aspectos específicos do transporte de dados, tais como segurança, parametrização de serviços, processos de publicação/pesquisa/descoberta, entre outros.</p>
<h2>Como disse no começo do artigo, até aqui vimos apenas um pequeno pedaço de um todo que é cada vez maior e continua crescendo. Espero que seja um bom &#8220;pontapé&#8221; para buscar mais informações. Eventualmente voltarei a escrever outro artigo em um ponto mais específico do assunto.</h2>
<div id="lightTable">Leituras recomendadas: <a href="http://pt.wikipedia.org/wiki/Web_service">Web Services em Wikipedia</a> e <a href="http://pt.wikipedia.org/wiki/Service-oriented_architecture">Arquitetura Orientada a Serviços em Wikipedia</a>.</div>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/webservices/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wikipedia Precisa de sua Ajuda</title>
		<link>http://pauloliveira.net/tech/pt/wikipedia-needs-your-donation</link>
		<comments>http://pauloliveira.net/tech/pt/wikipedia-needs-your-donation#comments</comments>
		<pubDate>Fri, 03 Dec 2010 23:55:31 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=296</guid>
		<description><![CDATA[Se você usa o Wikipedia, para uma consulta ou outra. Ou se você jogou sua Barsa no lixo e hoje em dia só faz pesquisa por ali esse post tem a ver com você. O Wikipedia é mantido por uma fundação sem fins lucrativos. O Wikipedia não tem publicidade e não tem assinatura paga, ele é mantido por quem [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fwikipedia-needs-your-donation"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<h2>Se você usa o <a href="http://www.wikipedia.org/">Wikipedia</a>, para uma consulta ou outra. Ou se você jogou sua <a href="http://pt.wikipedia.org/wiki/Barsa">Barsa</a> no lixo e hoje em dia só faz pesquisa por ali esse post tem a ver com você.</h2>
<p>O Wikipedia é mantido por uma fundação sem fins lucrativos. O Wikipedia não tem publicidade e não tem assinatura paga, ele é mantido por quem usa, contribuiu e consulta. Se você tem R$10 que não te farão falta, <a href="http://wikimediafoundation.org/wiki/Donate">faça uma doação e ajuda a manter esse site vivo</a>. <a href="http://wikimediafoundation.org/w/index.php?title=WMFJA1/pt&amp;utm_source=2010_JA1_Banner3&amp;utm_medium=sitenotice&amp;utm_campaign=fridayOpening&amp;referrer=http://pt.wikipedia.org/wiki/P%25C3%25A1gina_principal">Veja o apelo de Jimmy Wales</a>, e os dados da Fundação <a href="http://wikimediafoundation.org/wiki/Home">Wikimedia</a> para mais informações.</p>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/wikipedia-needs-your-donation/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Core Data. Capítulo II</title>
		<link>http://pauloliveira.net/tech/pt/core-data-capitulo-ii</link>
		<comments>http://pauloliveira.net/tech/pt/core-data-capitulo-ii#comments</comments>
		<pubDate>Fri, 03 Dec 2010 23:52:13 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=308</guid>
		<description><![CDATA[Dando continuidade a primeira entrega desse artigo, vamos falar um pouco mais sobre Core Data. Queries Para os que conhecem sobre bancos de dados, a palavra query é muito comum. Uma query é uma requisição de dados baseada em um filtro, ou seja, especificamos qual condição deve ser cumprida para extrair [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fcore-data-capitulo-ii"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Dando continuidade a <a href="http://pauloliveira.net/tech/core-data">primeira entrega desse artigo</a>, vamos falar um pouco</p>
<p>mais sobre <strong>Core Data.</strong></p>
<h1><em>Queries </em></h1>
<p>Para os que conhecem sobre bancos de dados, a palavra <strong>query</strong> é muito comum.</p>
<p>Uma <em>query</em> é uma requisição de dados baseada em um filtro, ou seja, especificamos qual condição deve ser cumprida para extrair uma porção de dados de um conjunto maior. <strong>Por exemplo,</strong> temos os números 1, 2, 3, 4 e 5 (conjunto de dados). E queremos requerir somente os números <strong>menores que 3</strong> (filtro), tendo como <strong>resultado</strong> 1, 2 (dados requeridos).</p>
<p>No Core Data essa requisição de dados (<em>query</em>) é chamada <strong>Fetch Request.</strong> Um Fetch Request pode ser formado de duas formas: Criando uma coleção de <em>queries</em> usando uma ferramenta visual do XCode, ou escrevendo uma <em>query</em> diretamente no código. Nesse artigo vamos fazer um passo-a-passo da primeira forma.</p>
<h1><em>Criando uma Coleção de Fetch Requests</em></h1>
<p>Cada elemento em uma Coleção de Fetch Requests é chamada <strong>Template.</strong> Esses templates serão chamados por <strong>nome </strong>diretamente no código posteriormente. Vejamos como criar um <strong>Template:</strong></p>
<ul>
<li>Selecione a <strong>entity</strong> (<em>tabela</em>) que deseja criar o <strong>Fetch Request</strong>.<a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/a2cee84213c273aa1d62528ed2a0878d.media_.358x239.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/a2cee84213c273aa1d62528ed2a0878d.media_.358x239.jpg"> </a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/a2cee84213c273aa1d62528ed2a0878d.media_.358x239.jpg"><img class="alignnone size-full wp-image-317" title="a2cee84213c273aa1d62528ed2a0878d.media.358x239" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/a2cee84213c273aa1d62528ed2a0878d.media_.358x239.jpg" alt="Selecionando uma Entity." width="358" height="239" /></a></li>
<li>Na pequena <em>“flecha para baixo”</em> no <em>painel de atributos</em> selecione <strong>Show Fetch Requests</strong>.<a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/ee3c2109acf4a1dcc0475bb9b3c5e59a.media_.241x176.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/ee3c2109acf4a1dcc0475bb9b3c5e59a.media_.241x176.jpg"><img class="alignnone size-full wp-image-320" title="Selecionando Fetch Request" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/ee3c2109acf4a1dcc0475bb9b3c5e59a.media_.241x176.jpg" alt="Selecionando Fetch Request" width="241" height="176" /></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/ee3c2109acf4a1dcc0475bb9b3c5e59a.media_.241x176.jpg"> </a>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/ee3c2109acf4a1dcc0475bb9b3c5e59a.media_.241x176.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/ee3c2109acf4a1dcc0475bb9b3c5e59a.media_.241x176.jpg"></a></li>
<li>O painel abaixo ilustra o editor de Fetch Requests, nele poderá editar o <strong>nome </strong>pelo qual será chamado no código e o <strong>predicate</strong>. <strong>Predicate</strong> é o filtro que especifica a condição de busca de um Fetch Request.<strong> </strong><strong> </strong><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/1f55ad86154d1c33ba354fd7262fc152.media_.376x224.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/1f55ad86154d1c33ba354fd7262fc152.media_.376x224.jpg"> </a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/1f55ad86154d1c33ba354fd7262fc152.media_.376x224.jpg"><img class="alignnone size-full wp-image-323" title="Fetch Request Editor" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/1f55ad86154d1c33ba354fd7262fc152.media_.376x224.jpg" alt="" width="376" height="224" /></a></li>
</ul>
<p>Uma das grandes vantagens de criar uma Coleção de Fetch Requests é o <strong>Predicate Builder</strong>. Ele permite de uma forma visual montar a lógica que compõe o filtro de um Fetch Request.</p>
<h3>Vejamos como funciona:</h3>
<p>O editor do <strong>Predicate Builder</strong> está formado por <strong>dois lados</strong>. Do lado <strong>esquerdo</strong> podemos selecionar os <strong>atributos</strong> (<em>keys ou campos</em>) da <strong>Entity</strong> que estamos trabalhando e associá-los do lado <strong>direito</strong> com <strong>valores fixos, valores dinâmicos</strong> ou com <strong>outros atributos</strong> (<em>keys</em>).</p>
<ul>
<li>Selecione do lado <strong>esquerdo do editor</strong> um <strong>atributo</strong> (<em>key</em>) que queremos usar para formar o <strong>Predicate</strong>. No campo <strong>central</strong> selecione que <strong>tipo de comparação</strong> queremos que tenha com o valor do lado <strong>direito</strong>.<a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"> </a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"><img title="Predicate Builder" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg" alt="" width="580" height="302" /> </a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatebuilder.jpg"></a></li>
<li>Do lado <strong>direito</strong> por <em>default</em> podemos selecionar um valor. Normalmente montamos um <strong>predicate</strong> com um valor <strong>variável</strong> que será enviado pelo código. Para <strong>mudar</strong> que tipo de <strong>valor</strong> ou <strong>atributo</strong> queremos do lado <strong>direito</strong> do painel, faça um <em>clique</em> com o <em>botão direito</em> e selecione no menu de contexto. É possível comparar <strong>valores</strong> com diferentes <strong>atributos</strong> (<em>keys</em>) e no caso de <strong>variáveis</strong> especificamos um nome de variável que será enviado pelo código posteriormente.<a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicaterhs.jpg"><img class="alignnone size-full wp-image-333" title="predicaterhs" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicaterhs.jpg" alt="" width="580" height="296" /></a></li>
<li><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicaterhs.jpg"></a>Também podemos criar <strong>Fetch Requests</strong> com mais de complexidade adicionando <strong>novas linhas e </strong>compondo com operadores <strong>AND </strong>e<strong> OR. </strong><strong> </strong>.<a href="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatecompound.jpg"><img class="alignnone size-full wp-image-334" title="predicatecompound" src="http://pauloliveira.net/tech/wp-content/uploads/2010/12/predicatecompound.jpg" alt="" width="564" height="271" /></a></li>
</ul>
<p>Espero que o conceito esteja claro nesse momento, usamos o editor do Core Data para montar <strong>Fetch Requests</strong>, tendo dessa forma uma <strong>Coleção de Templates</strong> que serão usados no código posteriormente.</p>
<p>Estamos nesse caso <em>desvinculando</em> o nosso <strong>Modelo de Dados </strong><em>(Model)</em> do <strong>Código </strong><em>(Controller)</em>, a maior vantagem desse conceito é que podemos alterar condições lógicas de filtragem de dados sem tocar o código, também formamos um repositório que será aproveitado em várias partes do código.</p>
<h3>Vejamos como usar esses templates no código:</h3>
<p>O primeiro passo é carregar de nossa coleção um <strong>Template</strong> já montado:</p>
<p>[</p>
<p>
<pre class="brush: objc; title: ;">&amp;amp;lt;br /&amp;amp;gt;NSFetchRequest *query = [managedObjectModel&amp;amp;lt;br /&amp;amp;gt;fetchRequestFromTemplateWithName:@&amp;amp;quot;PessoasComIdadeMaior&amp;amp;quot; substitutionVariables:[NSNumber numberWithInt:21]];&amp;amp;lt;br /&amp;amp;gt;</pre>
</p>
<p>O código acima carrega um <strong>Template</strong> chamado <em>"PessoasComIdadeMaior". </em>Estamos pensando que esse <strong>Template</strong> espera um valor do tipo numérico para compor o filtro. Portanto estamos informando o valor <strong>21</strong>. Nesse momento ainda não fizemos a requisição, simplesmente montamos um objeto que compõe um Fetch Request. Comparando com o SQL, seria uma <em>String</em> com uma <em>query</em> formatada.</p>
<div id="lightTable">Veja mais sobre como carregar e manipular <strong>Templates</strong> na documentação da classe <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectModel_Class/Reference/Reference.html"><strong>NSManagedObjectModel</strong></a>.</div>
<h3>Agora vamos fazer o Request:</h3>
<p>
<pre class="brush: objc; title: ;">&lt;br /&gt;
NSFetchRequest *query = [managedObjectModel fetchRequestFromTemplateWithName:&amp;quot;PessoasComIdadeMaior&amp;quot; substitutionVariables:[NSNumber numberWithInt:21]];&lt;br /&gt;
</pre>
</p>
<p>O código acima, executa o <strong>Fetch Request, </strong>o <em>Core Data </em>nesse momento irá internamente consultar o <em>SQLite</em> (ou outro modo de persistência sendo usado) e retornar o resultado em um <strong><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html">NSArray</a></strong> com objetos formatados.</p>
<p>O CoreData já formata os resultados do <em>Fetch (query)</em> como objetos que herdam da classe <a style="font-weight: bold;" href="http://developer.apple.com/library/mac/#documentation/cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html">NSManagedObject</a>.</p>
<p><span style="font-size: 11.6667px;">Vejamos um exemplo de como poderíamos imprimir cada um desses elementos no <em>Console</em> de nossa aplicação.</span></p>
<p>
<pre class="brush: objc; title: ;">for (id object in queryResult) {&amp;lt;br /&amp;gt;&lt;br /&gt;
	NSLog( result.nomeDaPessoa )&amp;lt;br /&amp;gt;&lt;br /&gt;
}&amp;lt;br /&amp;gt;&lt;br /&gt;
</pre>
</p>
<p>O código acima, faz um <em>loop</em> sobre todos os elementos dentro do <strong><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html">NSArray</a> </strong>e imprime no <em>Console</em> a propriedade "<em>nomeDaPessoa"</em>, essa <strong>propriedade</strong> é um campo do Banco de Dados (<em>Entity</em>) que fizemos o <strong>Fetch Request </strong>(<em>query</em>).</p>
<h2>Nos próximos artigos sobre Core Data aprofundaremos um pouco mais nesse poderoso framework.</h2></p>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/core-data-capitulo-ii/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Core Data. Capítulo I</title>
		<link>http://pauloliveira.net/tech/pt/core-data</link>
		<comments>http://pauloliveira.net/tech/pt/core-data#comments</comments>
		<pubDate>Tue, 16 Nov 2010 16:52:16 +0000</pubDate>
		<dc:creator>Paulo Oliveira</dc:creator>
				<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://pauloliveira.net/tech/pt/?p=254</guid>
		<description><![CDATA[Esse é o primeiro artigo de uma série que irei escrever sobre Core Data. Core Data é um Framework do Cocoa dedicado a gerenciar e armazenar dados em uma base persistente (SQL, XML ou Binary). É formado por um conjunto de Classes (veja gráfico abaixo) divididas em funções de Modelagem, [...]]]></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%2Fpauloliveira.net%2Ftech%2Fpt%2Fcore-data"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><p>Esse é o primeiro artigo de uma série que irei escrever sobre Core Data.</p>
<h2><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-TP1">Core Data</a> é um Framework do Cocoa dedicado a gerenciar e armazenar dados em uma base persistente (SQL, XML ou Binary). É formado por um conjunto de Classes (veja gráfico abaixo) divididas em funções de Modelagem, Controle de Dados no Runtime e Queries. Formando um ecosistema completo para administração de dados.</h2>
<p>Um ponto a aclarar, que geralmente leva a certa confusão. <strong>Core Data não é um banco de dados, </strong>é um <a href="http://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional">Object-Relational Mapping</a>, isso quer dizer que é uma camada em cima de um banco de dados. Essa camada abstrae os comandos de um banco de dados (<em>queries) </em>a um paradigma de <a href="http://pt.wikipedia.org/wiki/Oop">OOP</a>.</p>
<p>Portanto ao invés de fazer queries para <strong>deletar</strong> uma linha, ou <strong>updates</strong> para alterar um valor. Deletamos um objeto que representa um registro ou atualizamos uma propriedade desse objeto.</p>
<h2><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"></p>
<p></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"> </a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"> </a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"> </a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"></a><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png"><img class="alignnone size-full wp-image-276" title="CoreDataDiagram" src="http://pauloliveira.net/tech/wp-content/uploads/2010/11/000086-tigerarc.png" alt="" width="480" height="320" /></a></h2>
<h1><span style="font-weight: normal;"><em>Vantagens</em></span>.</h1>
<div id="_mcePaste">
<ul>
<li><span style="font-size: 13.3333px;">Modelagem de dados e geração de código usando ferramentas visuais do <strong>XCode</strong>.</span></li>
<li><span style="font-size: 13.3333px;">Criação de Queries usando ferramentas visuais e reaproveitando diretamente no código.</span></li>
<li><span style="font-size: 13.3333px;">API pronta para fazer Fecth (SELECT) de dados em tabelas muito grandes.</span></li>
<li><span style="font-size: 13.3333px;">API pronta, relativamente simples para acessar e atualizar dados (UPDATE, INSERT, REMOVE de dados).</span></li>
<li><span style="font-size: 13.3333px;">API pronta para uso de infinitos undos e redos.</span></li>
<li><span style="font-size: 13.3333px;">API pronta para gerenciar os dados diretamente em Datasets.</span></li>
</ul>
</div>
<h1><em><span style="font-weight: normal;">Desvantagem</span></em>.</h1>
<ul>
<li>Não é possível usar modelagem de dados externas, bancos de dados já existentes ou importar dados sem usar rotinas de importação especialmente escritas. O Core Data cria o banco de dados baseado no modelo criado no XCode e o gerencia.</li>
</ul>
<h1 style="font-size: 2em;"><em><span style="font-weight: normal;">Nomenclaturas</span></em>.</h1>
<p><span style="font-family: sans-serif;">Para entender melhor as <strong>nomenclaturas</strong> do <strong>Core Data</strong> em relação ao <strong>SQL</strong>, vejamos algumas equivalências na tabela abaixo (<em>Tenhamos em conta que são apenas <strong>equivalências</strong> para entender melhor cada elemento, não funcionam exatamente da mesma forma.</em>).</span></p>
<table class="inline" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-size: 13px; color: black; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: collapse; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; background-position: initial initial; background-repeat: initial initial;">
<tbody>
<tr class="row0">
<th class="col0 leftalign" style="text-align: left; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; background-color: #dee7ec; padding: 3px; border: 1px solid #8cacbb;">SQL</th>
<th class="col1 centeralign" style="text-align: center; background-color: #dee7ec; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;">Core Data</th>
</tr>
<tr class="row1">
<td class="col0" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;">Database</td>
<td class="col1" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;"><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdPersistentStores.html" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdPersistentStores.html">Persistent Store</a></td>
</tr>
<tr class="row2">
<td class="col0" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;">Table</td>
<td class="col1" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;"><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://cocoadevcentral.com/articles/000086.php#4" rel="nofollow" href="http://cocoadevcentral.com/articles/000086.php#4">Entity</a></td>
</tr>
<tr class="row3">
<td class="col0" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;">Field</td>
<td class="col1" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;"><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://cocoadevcentral.com/articles/000086.php#6" rel="nofollow" href="http://cocoadevcentral.com/articles/000086.php#6">Property do tipo Attribute</a></td>
</tr>
<tr class="row4">
<td class="col0" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;">SELECT</td>
<td class="col1" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;"><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://cocoadevcentral.com/articles/000086.php#13" rel="nofollow" href="http://cocoadevcentral.com/articles/000086.php#13">Fetch Request</a></td>
</tr>
<tr class="row5">
<td class="col0" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;">WHERE</td>
<td class="col1" style="border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; padding: 3px; border: 1px solid #8cacbb;"><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://cocoadevcentral.com/articles/000086.php#14" rel="nofollow" href="http://cocoadevcentral.com/articles/000086.php#14">Predicate</a></td>
</tr>
</tbody>
</table>
<h1 style="font-size: 2em;"><em><span style="font-weight: normal;">Exemplos</span></em>.</h1>
<p><span style="font-family: sans-serif;">Usando a <strong><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeCoreDataTools/Introduction/Introduction.html#//apple_ref/doc/uid/TP40006848" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeCoreDataTools/Introduction/Introduction.html#//apple_ref/doc/uid/TP40006848">ferramenta de modelagem</a></strong> do <strong>XCode</strong> criamos uma tabela (<em>Entity</em>). O resultado é o que mostra o gráfico abaixo.</span></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/captured-10911223.jpg"></a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/captured-10911223.jpg"><img class="alignnone size-full wp-image-270" title="captured-10911223" src="http://pauloliveira.net/tech/wp-content/uploads/2010/11/captured-10911223.jpg" alt="" width="536" height="372" /></a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/captured-10911223.jpg"> </a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/captured-10911223.jpg"></a></p>
<p><a href="http://pauloliveira.net/tech/wp-content/uploads/2010/11/captured-10911223.jpg"></a><span style="font-family: sans-serif;">Com esse <strong>modelo</strong> o <strong>XCode</strong> automaticamente pode criar o banco de dados <strong>SQLite</strong> (<em>ou outro tipo</em>) e a Classe que controla os dados dessa tabela. </span></p>
<h1><span style="font-weight: normal;"><em>Abrir o Banco de Dados</em></span>.</h1>
<p>
<pre class="brush: objc; title: ;">&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Inicia o BD.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;NSManagedObjectContext *database = [self managedObjectContext];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</pre>
</p>
<h1><span style="font-weight: normal;"><em> Query de dados</em></span>.</h1>
<p>
<pre class="brush: objc; title: ;">&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Alocamos uma instância da Classe que fará o Query (NSFetchRequest). (SELECT)&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;NSFetchRequest *query = [[NSFetchRequest alloc] init];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Configura para carregar toda a tabela.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;[query setReturnsObjectsAsFaults:NO];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Associamos a qual tabela este Fetch fará o Query.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;[query setEntity:[NSEntityDescription entityForName:@&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;Agenda&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot; inManagedObjectContext:database]];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Executa o Fetch, recebendo os dados diretamente em um Dataset (NSMutableArray).&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;NSMutableArray *resultadoQuery = [[database executeFetchRequest:query error:&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;error] mutableCopy];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Podemos perceber o poder e a conveniência do Fetch nesse caso.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Veja que ele devolve o resultado diretamente em um Array&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Imprime no Console diretamente.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;NSLog( resultadoQuery );&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</pre>
</p>
<p><span style="font-family: sans-serif; line-height: 19px; white-space: normal; font-size: 13px;">Neste caso estamos montando um <strong>Fetch</strong> programaticamente. Em um projeto maior o mais comum é criar todos os <strong>Fetchs</strong> necessários usando a ferramenta gráfica de <strong><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeCoreDataTools/Articles/xcdPredicateBuilder.html#//apple_ref/doc/uid/TP40006853" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeCoreDataTools/Articles/xcdPredicateBuilder.html#//apple_ref/doc/uid/TP40006853">Edição de Predicados</a></strong>. Desta forma portanto, somente é necessário associar esse <strong>template</strong> já criado para fazer determinada consulta.</span></p>
<h1><span style="font-weight: normal;"><em> Inserção de dados</em></span>.</h1>
<p>
<pre class="brush: objc; title: ;">&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Cria um novo registro. Esse registro não será gravado no BD por enquanto.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Agenda *novoRegistro = (Agenda *)[NSEntityDescription insertNewObjectForEntityForName:&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;Agenda&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot; inManagedObjectContext:database];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Monta os dados que serão gravados.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;novoRegistro.nome = &amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;Narques Oliveira&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;novoRegistro.telefone = NSDouble( 08001050 );&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Guarda no BD. (COMMIT)&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;[database save:&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;error];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</pre>
</p>
<p><span style="font-family: sans-serif; line-height: 19px; white-space: normal; font-size: 13px;">O <strong>Core Data</strong> mantém os dados na memória até que o método <strong><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/save:" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/save:">save:</a></strong> seja chamado. Algumas razões para que funcione desa forma: habilitar a possibiloidade de utilizar a <strong>API </strong>de <a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/doc/uid/TP30001182-SW10" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/doc/uid/TP30001182-SW10">undo e redo</a>, manter os dados guardados em uma janela de edição (<em>cadastro</em>) até que o usuário confirme as mudanças sem criar nenhuma linha de código, entre outras. Todas essas <strong>conveniências</strong> já estão <strong>embutidas</strong> no <strong>Core Data</strong>.</span></p>
<h1><span style="font-weight: normal;"><em> Remoção de dados </em></span>.</h1>
<p><span style="font-family: sans-serif;">Vamos obervar que a remoção de um item no <strong>Core Data</strong> difere um pouco de uma forma convencional do <strong>SQL</strong>. No <strong>SQL</strong> passamos ao Banco de Dados um <strong>Query </strong>com os dados a deletar diretamente. Pela forma que o <strong>Core Data</strong> funciona internamente ele não permite a deleção de dados baseadas em <strong>Queries</strong>. O que devemos fazer é deletar um registro (ou um conjunto de registros) da memória e depois chamar o método <strong><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/save:" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/save:">save:</a></strong> para que ele faça o trabalho de remover <strong>esses registros da tabela</strong> (<em>Entity</em>) e todos os que tiverem um <strong>Relacionamento</strong> com eles. </span></p>
<p><span style="font-family: sans-serif;">Para deletar o conteúdo de uma tabela inteira, por exemplo. Seria necessária fazer um <strong>Fetch</strong> de <strong>todos</strong> os elementos da tabela; <strong>Deletar</strong> todas as linhas; Executar o <strong><a class="urlextern" style="text-decoration: none; color: #436976; background-image: url(http://www.seqoy.com/__p/wiki/lib/tpl/monobook/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 13px; padding-bottom: 1px; padding-left: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" title="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/save:" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/save:">save:</a></strong>. </span></p>
<p><span style="font-family: sans-serif;">É uma <strong>desvantagem</strong> no caso de uma tabela <strong>única</strong> e uma <strong>vantagem</strong> no caso de uma tabela <strong>master</strong>, pois essa ação simples deletará <strong>de forma segura</strong> todos os elementos que <strong>dependem</strong> dela seguindo o <strong>Relacionamento</strong> que respeitem.</span></p>
<p>No caso de remover <strong>apenas um item,</strong> é mais comum que deletemos o objeto que estamos trabalhando ou que está visualmente na tela. Afinal uma ação de deletar quase sempre é <strong><em>iniciada</em></strong> pelo usuário diretamente nos dados que estamos trabalhando no momento.</p>
<p>
<pre class="brush: objc; title: ;">&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Obtemos a referência de um registo para deletar, neste caso estamos pedindo o registro guardado na linha 1 do Dataset.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;NSManagedObject *registroParaDeletar = [resultadoQuery objectAtIndex:1];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Deleta o registro. Não foi deletado da tabela ainda.&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;[database deleteObject: registroParaDeletar];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;// Guarda no BD. (COMMIT)&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;[database save:&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;error];&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</pre>
</p>
<p><span style="font-family: sans-serif; line-height: 19px; white-space: normal; font-size: 13px;">A remoção de objetos nesse caso é de um item simplesmente. Em <strong>Modelos de Dados</strong> mais complexos a remoção de um item segue os <strong>Relacionamentos </strong>montados. Portanto é possível fazer uma <strong>Deleção em Cascata</strong>, ou seja, deletar um item e <strong>todos</strong> os que dependem dele de forma <strong>automática</strong>.</span></p>
<div id="lightTable">Leituras recomendadas: <a title="http://cocoadevcentral.com/articles/000086.php" rel="nofollow" href="http://cocoadevcentral.com/articles/000086.php">Excelente Overview de Core Data</a> por Scott Stevenson e <a title="http://developer.apple.com/iphone/library/documentation/DataManagement/Conceptual/iPhoneCoreData01/Introduction/Introduction.html" rel="nofollow" href="http://developer.apple.com/iphone/library/documentation/DataManagement/Conceptual/iPhoneCoreData01/Introduction/Introduction.html">Apple Core Data Tutorial for iPhone OS</a>.</div>
<h2>Nos próximos artigos sobre <em>Core Data </em>aprofundaremos um pouco mais nesse poderoso <em>framework</em>.</h2>
<h1>Veja mais em <a href="http://pauloliveira.net/tech/core-data-capitulo-ii">Core Data Parte II</a>.</h1></p>
]]></content:encoded>
			<wfw:commentRss>http://pauloliveira.net/tech/pt/core-data/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
