<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>NetRunners</title>
	
	<link>http://blog.netrunners.es</link>
	<description />
	<lastBuildDate>Wed, 16 May 2012 12:27:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
<image>
  <link>http://blog.netrunners.es</link>
  <url>http://blog.netrunners.es/favicon.ico</url>
  <title>NetRunners</title>
</image>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Netrunners" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="netrunners" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">Netrunners</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Consigue hasta 4.5 Gb Extra en Dropbox</title>
		<link>http://blog.netrunners.es/consigue-hasta-4-5-gb-extra-en-dropbox/</link>
		<comments>http://blog.netrunners.es/consigue-hasta-4-5-gb-extra-en-dropbox/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 21:24:28 +0000</pubDate>
		<dc:creator>Miguel S. Mendoza</dc:creator>
				<category><![CDATA[Descargas]]></category>
		<category><![CDATA[Hazlo Tu Mismo]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[espacio extra]]></category>
		<category><![CDATA[fotos]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.netrunners.es/?p=4238</guid>
		<description><![CDATA[Dropbox ha iniciado un proceso de pruebas de su nueva funcionalidad para subir automáticamente fotos y videos, y como recompensa a los que prueben esta última versión, se les ofrece hasta 4,5 Gb de espacio extra.]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Espacio Extra Dropbox" src="http://cache.lifehacker.com/assets/images/17/2012/02/18d2c96484fbfb512eb6bb95d187dcd8.jpg" alt="" width="440" height="247" /></p>
<p>Hace tiempo que no escribo nada, pero supongo que esto merece la pena. Dropbox ha iniciado un proceso de pruebas de su nueva funcionalidad para subir automáticamente fotos y videos, y como recompensa a los que prueben esta última versión, se les ofrece hasta 4,5 Gb de espacio extra.</p>
<p>Más concretamente, la versión 1.3.12 de Dropbox nos permite importar automáticamente fotos y videos de cámaras de fotos, tarjetas SD, teléfonos, etc. y subirlas por lotes a nuestra cuenta. En el foro de Dropbox indican lo siguiente:</p>
<blockquote><p>Durante este periodo beta, ofrecemos espacio adicional para testear la carga automática de fotos y videos. Por cada 500 Mb de fotos y videos que se carguen automáticamente, recibiréis otros 500 Mb de espacio extra, hasta un total de 4,5 Gb.</p></blockquote>
<p>Las descargas del cliente para Windows y Mac solo pueden encontrarse en ese foro, dónde también nos aconsejan hacer copias de seguridad de lo que tengamos metido antes de instalar esta nueva versión. En mi caso, con Windows 7, una vez enchufada la cámara, en el panel de opciones que se muestran automáticamente, he tenido que configurar &#8220;Import to Dropbox&#8221; como opción predeterminada. Después de desconectar y volver a conectar la cámara las fotos comienzan a sincronizarse en la carpeta &#8220;Camera Uploads&#8221; y de repente tengo 3,2 Gb de espacio disponible. Ahora solo queda buscar más fotos que importar&#8230;</p>
<p>Por lo visto esta característica no funciona en Linux ni en Mac OS X 10.4, y en Windows solo funciona si está activada la opción de &#8220;Autoplay&#8221; del dispositivo a sincronizar.</p>
<p>La entrada del foro para la descarga la podéis encontrar en el siguiente enlace:</p>
<p><a title="Experimental Forum Build 1.3.12" href="http://forums.dropbox.com/topic.php?id=52900" target="_blank">Experimental Forum Build 1.3.12</a></p>
<p>Y si no tenéis todavía una cuenta de Dropbox, no se a que estáis esperando:</p>
<p><a title="Crear Cuenta de Dropbox" href="http://db.tt/ZbINylg" target="_blank">Crear cuenta de Dropbox</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.netrunners.es/consigue-hasta-4-5-gb-extra-en-dropbox/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5 Clock</title>
		<link>http://blog.netrunners.es/html5-clock/</link>
		<comments>http://blog.netrunners.es/html5-clock/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 12:45:18 +0000</pubDate>
		<dc:creator>Miguel S. Mendoza</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://blog.netrunners.es/?p=4223</guid>
		<description><![CDATA[Haciendo clic en la imagen podreis ver mi primera animación hecha en HTML5 Canvas. Comentarios, sugerencias y críticas en los comentarios,]]></description>
			<content:encoded><![CDATA[<p>Haciendo clic en la imagen podreis ver mi primera animación hecha en HTML5 Canvas. Comentarios, sugerencias y críticas en los comentarios, <img src='http://blog.netrunners.es/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p style="text-align: center;"><a href="http://www.netrunners.es/MTW/HTML5/Clock.html"><img class="aligncenter" title="HTML5 Canvas Clock" src="http://img845.imageshack.us/img845/6289/html5clock.png" alt="HTML5 Canvas" width="486" height="497" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.netrunners.es/html5-clock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ilusión Óptica con Figura de Papel</title>
		<link>http://blog.netrunners.es/ilusion-optica-con-figura-de-papel/</link>
		<comments>http://blog.netrunners.es/ilusion-optica-con-figura-de-papel/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 12:39:41 +0000</pubDate>
		<dc:creator>Miguel S. Mendoza</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Hazlo Tu Mismo]]></category>

		<guid isPermaLink="false">http://blog.netrunners.es/?p=4221</guid>
		<description><![CDATA[Aquí un interesante recortable con el que dejaremos desconcertado a más de uno. Descarga el pdf para hacerlo tu mismo aqui: http://www.megaupload.com/?d=Q56KYVWS]]></description>
			<content:encoded><![CDATA[<p>Aquí un interesante recortable con el que dejaremos desconcertado a más de uno.</p>
<p><a href="http://blog.netrunners.es/ilusion-optica-con-figura-de-papel/"><em>Pinche aquí para ver el vídeo</em></a></p>
<p>Descarga el pdf para hacerlo tu mismo aqui:</p>
<p><a title="Recortable Dragon" href="http://www.megaupload.com/?d=Q56KYVWS" target="_blank">http://www.megaupload.com/?d=Q56KYVWS</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.netrunners.es/ilusion-optica-con-figura-de-papel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertir una Botella de Plástico en una Bombilla Solar</title>
		<link>http://blog.netrunners.es/convertir-una-botella-de-plastico-en-una-bombilla-solar/</link>
		<comments>http://blog.netrunners.es/convertir-una-botella-de-plastico-en-una-bombilla-solar/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 15:59:37 +0000</pubDate>
		<dc:creator>Miguel S. Mendoza</dc:creator>
				<category><![CDATA[Hazlo Tu Mismo]]></category>

		<guid isPermaLink="false">http://blog.netrunners.es/?p=4219</guid>
		<description><![CDATA[Es curioso como el ser humano se crece ante la adversidad y utiliza su potencial para mejorar su calidad de vida. En filipinas ha surgido una iniciativa para iluminar las miles de chavolas que carecen de luz eléctrica, y que a pesar de que en el exterior brille el sol, en su interior reina la [...]]]></description>
			<content:encoded><![CDATA[<p>Es curioso como el ser humano se crece ante la adversidad y utiliza su potencial para mejorar su calidad de vida. En filipinas ha surgido una iniciativa para iluminar las miles de chavolas que carecen de luz eléctrica, y que a pesar de que en el exterior brille el sol, en su interior reina la oscuridad.</p>
<p>El montaje es bastante simple y el resultado inmejorable.</p>
<p><a href="http://blog.netrunners.es/convertir-una-botella-de-plastico-en-una-bombilla-solar/"><em>Pinche aquí para ver el vídeo</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.netrunners.es/convertir-una-botella-de-plastico-en-una-bombilla-solar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desarrollo de listas en Android</title>
		<link>http://blog.netrunners.es/desarrollo-de-listas-en-android/</link>
		<comments>http://blog.netrunners.es/desarrollo-de-listas-en-android/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 15:01:16 +0000</pubDate>
		<dc:creator>Miguel S. Mendoza</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[hashmap]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[listactivity]]></category>
		<category><![CDATA[listadapter]]></category>
		<category><![CDATA[listas]]></category>
		<category><![CDATA[listview]]></category>
		<category><![CDATA[onlistitemclick]]></category>
		<category><![CDATA[rellenar lista]]></category>
		<category><![CDATA[simpleadapter]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.netrunners.es/?p=4191</guid>
		<description><![CDATA[Continuando con los tutoriales sobre android explicaré como mostrar una lista de elementos compuestos, es decir, dónde en cada fila aparece más de un elemento. Paso 1: Diseñar formato de fila Para empezar habrá que diseñar en XML la composición de las filas, en el formato en el que queremos mostrarlas, y guardaremos el resultado [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" src="https://g0.gstatic.com/android/market/es.albandroid.feria11/ss-480-2-1" alt="" width="173" height="288" /></p>
<p style="text-align: left;">Continuando con los tutoriales sobre android explicaré como mostrar una lista de elementos compuestos, es decir, dónde en cada fila aparece más de un elemento.</p>
<h3>Paso 1: Diseñar formato de fila</h3>
<p>Para empezar habrá que diseñar en XML la composición de las filas, en el formato en el que queremos mostrarlas, y guardaremos el resultado en la carpeta &#8220;layout&#8221;, dándole un nombre que luego podamos recordar, en este caso &#8220;row.xml&#8221;. El siguiente código es el utilizado en la aplicación de feria para mostrar la información de los diferentes eventos.</p>
<pre class="brush: xml; highlight: [10,22,27]; light: false; title: res/layout/row.xml; toolbar: true; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
	android:orientation=&quot;horizontal&quot; android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;fill_parent&quot;&gt;
	&lt;LinearLayout
		android:layout_width=&quot;wrap_content&quot;
		android:layout_height=&quot;wrap_content&quot;
		android:orientation=&quot;vertical&quot;
		android:paddingRight=&quot;4px&quot;&gt;
		&lt;TextView android:id=&quot;@+id/hora&quot;
			android:layout_width=&quot;wrap_content&quot;
			android:layout_height=&quot;wrap_content&quot;
			android:textSize=&quot;16dp&quot;
			android:padding=&quot;3dp&quot;
		/&gt;
	&lt;/LinearLayout&gt;
	&lt;LinearLayout
		android:layout_width=&quot;wrap_content&quot;
		android:layout_height=&quot;wrap_content&quot;
		android:orientation=&quot;vertical&quot;
		android:paddingBottom=&quot;5dp&quot;&gt;
		&lt;TextView android:id=&quot;@+id/nombre&quot;
			android:layout_width=&quot;wrap_content&quot;
			android:layout_height=&quot;wrap_content&quot;
			android:textSize=&quot;20dp&quot;
		/&gt;
		&lt;TextView android:id=&quot;@+id/desc1&quot;
			android:layout_width=&quot;wrap_content&quot;
			android:layout_height=&quot;wrap_content&quot;
			android:textSize=&quot;14dp&quot;
		/&gt;
	&lt;/LinearLayout&gt;
&lt;/LinearLayout&gt;</pre>
<p>La mayor parte del código forma parte del diseño pero lo realmente importante, como esta señalado, son las id de cada uno de los campos que vamos a rellenar.</p>
<h3>Paso 2: Diseño de lista</h3>
<p>Ahora es cuando diseñamos la pantalla en la que se mostrará la lista. En el caso de la aplicación de feria, se muestra en la pate superior un menú de navegación, y dos botones en la parte inferior, pero puesto que no son de relevancia para el presente tutorial, no los incluyo en el código de ejemplo.</p>
<pre class="brush: xml; highlight: [7,15]; light: false; title: res/layout/lista.xml; toolbar: true; notranslate"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;fill_parent&quot;
	android:orientation=&quot;vertical&quot;
	xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&gt;

		&lt;ListView android:id=&quot;@android:id/list&quot;
      		android:layout_width=&quot;fill_parent&quot;
			android:layout_weight=&quot;1&quot;
 			android:layout_height=&quot;fill_parent&quot;
			android:padding=&quot;5dp&quot;
			android:cacheColorHint=&quot;#00000000&quot;&gt;
		&lt;/ListView&gt;

		&lt;TextView android:id=&quot;@id/android:empty&quot;
		android:background=&quot;@null&quot;
		android:text=&quot;NO SE ENCUENTRAN EVENTOS&quot;
		android:layout_height=&quot;fill_parent&quot;
		android:layout_width=&quot;fill_parent&quot;
		/&gt;

&lt;/LinearLayout&gt;</pre>
<p>Lo verdaderamente importante de esta pantalla es el elemento ListView con id &#8220;@android:id/list&#8221;, puesto que el cuadro de texto que aparecería en el caso de que la lista no tuviera elementos no tiene porque estar y del mismo modo tampoco tiene porque ser un cuadro de texto. Si quisieramos que apareciera una imagen cuando la lista estubiera vacía tan solo habría que poner un elemento &#8220;ImageView&#8221; y asignarle la id &#8220;@id/android:empty&#8221;.<br />
Alrededor del listado se puede incluir cualquier otro tipo de objeto, y darle a ese listado cualquier propiedad que se quiera, siempre y cuando mantengamos la id del &#8220;ListView&#8221;.</p>
<h3>Paso 3: Código de ListActivity</h3>
<p>Por último, tan solo queda rellenar la lista desde el código de nuestra actividad. Para ello nos valdremos de la clase &#8220;ListActivity&#8221; que nos proporcionará unos cuantos métodos bastante útiles para nuestro propósito. Para facilitar la tarea de &#8220;copy&amp;paste&#8221; del código continúo el tutorial en el mismo:</p>
<pre class="brush: java; light: false; title: Listado.java; toolbar: true; notranslate">public class Listado extends ListActivity {

//Mantenemos un Array de elementos en la que podremos guardar
//más información de la que mostraremos en el listado
ArrayList&lt;HashMap&lt;String,String&gt;&gt; Eventos;

//Con los siguientes Arrays establecemos la correspondencia
//entre los elementos del Array de HashMaps de eventos (from)
//con los elementos del diseño en XML de cada una de las filas (to)
String[] from=new String[] {&quot;Time&quot;,&quot;Name&quot;,&quot;Desc&quot;};
int[] to=new int[]{R.id.hora,R.id.nombre,R.id.desc1};

@Override
public void onCreate(Bundle savedInstanceState) {

	super.onCreate(savedInstanceState);
	//Establecemos el diseño principal de la Actividad
	setContentView(R.layout.lista);

	// Este método de obtención de elementos puede cambiarse por cualquier otro
	//como leerlos de una BBDD o de un servidor web con JSON
	ArrayList&lt;String[]&gt; lista = new ArrayList&lt;String[]&gt;();

	String[] evento1 = {&quot;11:30&quot;,&quot;Ofrenda de Flores&quot;,&quot;Participa la Banda Sinfónica Municipal de Albacete&quot;, &quot;1&quot;};
	lista.add(evento1);

	String[] evento2 = {&quot;12:00&quot;,&quot;Los Redondeles&quot;,&quot;La ronda de los Redondeles 2011&quot;, &quot;2&quot;};
	lista.add(evento2);

	String[] evento3 = {&quot;12:00&quot;,&quot;Futbol&quot;,&quot;Albacete Balompie Vs. Tenerife C.D.&quot;, &quot;3&quot;};
	lista.add(evento3);

	// Transformamos los elementos String[] en HashMap para
	//posteriormente incluirlos en el Array Global que se utilizará
	//para rellenar la lista
	Eventos = new ArrayList&lt;HashMap&lt;String, String&gt;&gt;();
	for(String[] evento:lista){
		HashMap&lt;String,String&gt; datosEvento=new HashMap&lt;String, String&gt;();

		// Aquí es dónde utilizamos las referencias creadas inicialmente
		//en el elemento &quot;from&quot;
		datosEvento.put(&quot;Time&quot;, evento[0]);
		datosEvento.put(&quot;Name&quot;, evento[1]);
		datosEvento.put(&quot;Desc&quot;, evento[2]);
		datosEvento.put(&quot;id&quot;, evento[3]);

		Eventos.add(datosEvento);
	}
	// Una vez tenemos toda la información necesaria para rellenar la lista
	//creamos un elemento que nos facilitará la tarea:
	//SimpleAdapter(Actividad, Array de HashMap con elementos, Fichero XML del
	//diseño de cada fila, Cadenas del HashMap, Ids del Fichero XML del diseño de cada fila)
	SimpleAdapter ListadoAdapter=new SimpleAdapter(this, Eventos, R.layout.row, from, to);
	setListAdapter(ListadoAdapter);
}
}</pre>
<h3>Paso 4: Eventos del listado</h3>
<p>Si queremos que nuestro listado tenga un mínimo de funcionalidad, podemos utilizar los &#8220;Listeners&#8221; que incluye la clase &#8220;ListActivity&#8221;, esto es, los métodos que se ejecutarán dependiendo del evento ocurrido. Con el siguiente código, que incluiremos en la actividad anterior, iniciaremos otra actividad a la que le pasaremos como información la &#8220;id&#8221; del elemento pulsado.</p>
<pre class="brush: java; light: false; title: ; toolbar: true; notranslate">@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);

		Intent intent = new Intent(this,DetalleEvento.class);
		intent.putExtra(&quot;id&quot;,Eventos.get(position).get(&quot;id&quot;));
		startActivity(intent);
	}</pre>
<p>Como puede observarse, hacemos uso del Array Global &#8220;Eventos&#8221; que utilizábamos para rellenar la lista, en el cual almacenamos también la información del &#8220;id&#8221; sin mostrarla en el listado.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.netrunners.es/desarrollo-de-listas-en-android/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Usar nuestra propia Base de Datos SQLite en Android</title>
		<link>http://blog.netrunners.es/usar-nuestra-propia-base-de-datos-sqlite-en-android/</link>
		<comments>http://blog.netrunners.es/usar-nuestra-propia-base-de-datos-sqlite-en-android/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 16:29:42 +0000</pubDate>
		<dc:creator>Miguel S. Mendoza</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[activity]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[externa]]></category>
		<category><![CDATA[fichero]]></category>
		<category><![CDATA[own database]]></category>
		<category><![CDATA[propia]]></category>
		<category><![CDATA[sqlite]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.netrunners.es/?p=4162</guid>
		<description><![CDATA[Comienzo con éste una serie de tutoriales relacionados con la aplicación de la Feria de Albacete 2011 en la que se explicará paso por paso como dotar de diversas características a nuestras aplicaciones. En este caso explicaré como utilizar una base de datos con datos por defecto, es decir, utilizando un fichero externo de base [...]]]></description>
			<content:encoded><![CDATA[<p>Comienzo con éste una serie de tutoriales relacionados con la aplicación de la <a title="Feria de Albacete 2011" href="http://blog.netrunners.es/feria-de-albacete-2011/" target="_blank">Feria de Albacete 2011</a> en la que se explicará paso por paso como dotar de diversas características a nuestras aplicaciones.</p>
<p>En este caso explicaré como utilizar una base de datos con datos por defecto, es decir, utilizando un fichero externo de base de datos creado con un editor de bases de datos SQLite.</p>
<h3>Paso 1: Preparando el fichero de base de datos SQLite</h3>
<p>Una vez tengamos nuestro propio fichero de base de datos tendremos que modificarla un poco. Para editar la base de datos utilizaremos la aplicación de código abierto <a title="SQLite Database Browser" href="http://sqlitebrowser.sourceforge.net/" target="_blank">SQLite Database Browser</a> disponible para Windows Mac y Linux.</p>
<p>Abrimos nuestro fichero de base de datos y añadimos una nueva tabla llamada &#8216;android_metadata&#8217;. Para ello podemos ejecutar el siguiente código SQL:</p>
<pre class="brush: sql; light: false; title: ; toolbar: true; notranslate">CREATE TABLE &quot;android_metadata&quot; (&quot;locale&quot; TEXT DEFAULT 'es_ES')</pre>
<p>Seguidamente insertamos una nueva fila con el texto &#8216;es_ES&#8217; en la tabla recién creada.</p>
<pre class="brush: sql; light: false; title: ; toolbar: true; notranslate">INSERT INTO &quot;android_metadata&quot; VALUES ('es_ES')</pre>
<p>Una vez hecho esto tenemos que cambiar el nombre identificativo de las claves primarias de las tablas de nuestra base de datos a &#8216;_id&#8217; para que de esta manera Android pueda identificarlas. Para ello podemos hacer clic en el botón <img class="alignnone" src="http://img832.imageshack.us/img832/4971/editbuttonm.png" alt="" width="30" height="27" />, y tras seleccionar la tabla que queremos modificar, podremos editar el nombre del campo.</p>
<p>Finalmente nuestra base de datos tiene que tener un aspecto similar al siguiente:</p>
<h3><img class="aligncenter" src="http://img189.imageshack.us/img189/8797/sqlitebrowser.png" alt="" width="638" height="467" /></h3>
<h3>Paso 2: Manejando la Base de Datos desde nuestra Aplicación Android</h3>
<p>Para poder tener acceso desde nuestra aplicación al fichero de base de datos éste debe encontrarse en una carpeta dentro de nuestro proyecto llamada &#8216;assets&#8217;. Si ya está creada, copiamos el fichero de base de datos ahí, si no, tendremos que crear la carpeta antes.<img class="aligncenter" title="Base de datos en carpeta assets" src="http://img84.imageshack.us/img84/5465/asdfyd.png" alt="Fichero de base de datos en carpeta Assets" width="207" height="164" />El manejo de la base de datos se hará utilizando una clase personalizada que extenderá la clase <a href="http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html">SQLiteOpenHelper</a>, en la cual podremos incluir todos los métodos relacionados con la base de datos para insertar, actualizar y borrar datos.</p>
<p>Recuerda cambiar en el siguiente código las cadenas &#8220;TU_PAQUETE&#8221; y &#8220;NOMBRE_DE_FICHERO&#8221; por el nombre del paquete de tu proyecto, y el nombre del fichero de tu base de datos respectivamente.</p>
<pre class="brush: java; light: false; title: ; toolbar: true; notranslate">
public class DBHelper extends SQLiteOpenHelper{

//Ruta por defecto de las bases de datos en el sistema Android
private static String DB_PATH = &quot;/data/data/TU_PAQUETE/databases/&quot;;

private static String DB_NAME = &quot;filename.db&quot;;

private SQLiteDatabase myDataBase;

private final Context myContext;

/**
* Constructor
* Toma referencia hacia el contexto de la aplicación que lo invoca para poder acceder a los 'assets' y 'resources' de la aplicación.
* Crea un objeto DBOpenHelper que nos permitirá controlar la apertura de la base de datos.
* @param context
*/
public DBHelper(Context context) {

super(context, DB_NAME, null, 1);
this.myContext = context;

}

/**
* Crea una base de datos vacía en el sistema y la reescribe con nuestro fichero de base de datos.
* */
public void createDataBase() throws IOException{

boolean dbExist = checkDataBase();

if(dbExist){
//la base de datos existe y no hacemos nada.
}else{
//Llamando a este método se crea la base de datos vacía en la ruta por defecto del sistema
//de nuestra aplicación por lo que podremos sobreescribirla con nuestra base de datos.
this.getReadableDatabase();

try {

copyDataBase();

} catch (IOException e) {
throw new Error(&quot;Error copiando Base de Datos&quot;);
}
}

}

/**
* Comprueba si la base de datos existe para evitar copiar siempre el fichero cada vez que se abra la aplicación.
* @return true si existe, false si no existe
*/
private boolean checkDataBase(){

SQLiteDatabase checkDB = null;

try{

String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}catch(SQLiteException e){

//si llegamos aqui es porque la base de datos no existe todavía.

}
if(checkDB != null){

checkDB.close();

}
return checkDB != null ? true : false;
}

/**
* Copia nuestra base de datos desde la carpeta assets a la recién creada
* base de datos en la carpeta de sistema, desde dónde podremos acceder a ella.
* Esto se hace con bytestream.
* */
private void copyDataBase() throws IOException{

//Abrimos el fichero de base de datos como entrada
InputStream myInput = myContext.getAssets().open(DB_NAME);

//Ruta a la base de datos vacía recién creada
String outFileName = DB_PATH + DB_NAME;

//Abrimos la base de datos vacía como salida
OutputStream myOutput = new FileOutputStream(outFileName);

//Transferimos los bytes desde el fichero de entrada al de salida
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))&gt;0){
myOutput.write(buffer, 0, length);
}

//Liberamos los streams
myOutput.flush();
myOutput.close();
myInput.close();

}

public void open() throws SQLException{

//Abre la base de datos
try {
createDataBase();
} catch (IOException e) {
throw new Error(&quot;Ha sido imposible crear la Base de Datos&quot;);
}

String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
/**
* A continuación se crearán los métodos de lectura, inserción, actualización
* y borrado de la base de datos.
* */
</pre>
<h3>Paso 3: Métodos útiles de lectura, inserción, actualización y borrado</h3>
<p>A continuación pongo ejemplos de los métodos más habituales de uso de base de datos que deberían introducirse en la misma clase DBHelper. Para ello utilizaré como ejemplo la tabla que puede verse en la imagen del Paso 1, que consta de tres columnas (&#8216;_id&#8217;, &#8216;alarma&#8217; y &#8216;evento&#8217;):</p>
<pre class="brush: java; light: false; title: ; toolbar: true; notranslate">
//Establecemos los nombres de las columnas
public static final String KEY_ID = &quot;_id&quot;;
public final static String KEY_COL1 = &quot;alarma&quot;;
public final static String KEY_COL2 = &quot;evento&quot;;

//Array de strings para su uso en los diferentes métodos
private static final String[] cols = new String[] { KEY_ID, KEY_COL1, KEY_COL2 };
</pre>
<p>Los métodos de inserción, borrado y actualización son bastante simples. Para más información sobre ellos podéis echarle un ojo a la información de la clase <a title="Android Developers" href="http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html" target="_blank">SQLiteDatabase</a>.</p>
<pre class="brush: java; light: false; title: ; toolbar: true; notranslate">
/**
* INSERTAR NUEVA ALARMA
* */
public long insertAlarma(Integer id, Integer alarma, Integer evento) {
ContentValues newValues = new ContentValues();
newValues.put(KEY_ID, id);
newValues.put(KEY_COL1, alarma);
newValues.put(KEY_COL2, evento);
return db.insert(DATABASE_TABLE, null, newValues);
}

/**
* BORRAR ALARMA CON _id = _rowIndex
* */
public boolean removeAlarma(long _rowIndex) {
return db.delete(DATABASE_TABLE, KEY_ID + &quot;=&quot; + _rowIndex, null) &gt; 0;
}

/**
* ACTUALIZAR ALARMA _id = _rowIndex
* */
public boolean updateAlarma(Integer _rowIndex, Integer alarma, Integer evento) {
ContentValues newValues = new ContentValues();
newValues.put(KEY_COL1,alarma);
newValues.put(KEY_COL2, evento);
return db.update(DATABASE_TABLE, newValues, KEY_ID + &quot;=&quot; + _rowIndex, null) &gt; 0;
}
</pre>
<p>Por otro lado, para la lectura de la base de datos, se utiliza el método &#8216;query&#8217;, el cual nos devuelve un cursor con las filas que se corresponden con el criterio de búsqueda. Mi recomendación para evitar el uso de cursores en nuestra aplicación es crear objetos de una clase propia personalizada para el tipo de datos que vamos a recuperar. De este modo nuestros métodos devolverán el tipo de objetos que realmente vamos a utilizar. Para este ejemplo utilizamos el tipo de objeto &#8220;Alarma&#8221; que contiene los dos campos de la base de datos que queremos utilizar como variables:</p>
<pre class="brush: java; light: false; title: ; toolbar: true; notranslate">
public class Alarma implements Serializable{

private static final long serialVersionUID = 1L;
private Integer Evento;
private Integer Alarma;

public Alarma(Integer idEvento, Integer idAlarma) {
super();
this.idEvento = idEvento;
this.idAlarma = idAlarma;
}

}
</pre>
<p>De este modo podemos crear dos tipos de métodos para obtener datos. Uno que nos devuelva un único resultado, y otro que nos devuelva un objeto List&lt;Alarma&gt; con todos los resultados. Para más información acerca del método &#8216;query&#8217; y crear consultas más avanzadas os recomiendo echarle un ojo a la información de la clase <a title="Android Developers" href="http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html" target="_blank">SQLiteDatabase</a>:</p>
<pre class="brush: java; light: false; title: ; toolbar: true; notranslate">
public Alarma getAlarma(long _rowIndex) {
Alarma alarm = new Alarma();
Cursor result = db.query(true, DATABASE_TABLE,
cols,
KEY_ID + &quot;=&quot; + _rowIndex, null, null, null,
null, null);
if ((result.getCount() == 0) || !result.moveToFirst()) {
//Si la alarma no existe, devuelve una alarma con valores -1 y -1
alarm = new Alarma(-1,-1);

} else {
if (result.moveToFirst()) {
alarm = new Alarma(
result.getInt(result.getColumnIndex(KEY_COL1)),
result.getInt(result.getColumnIndex(KEY_COL2))
);
}
}
return alarm;
}

public List&lt;Alarma&gt; getAlarmas() {
ArrayList&lt;Alarma&gt; alarms = new ArrayList()&lt;Alarma&gt;;
Cursor result = db.query(DATABASE_TABLE,
cols, null, null, null, null, KEY_ID);
if (result.moveToFirst())
do {
alarms.add(new Alarma(
result.getInt(result.getColumnIndex(KEY_COL1)),
result.getInt(result.getColumnIndex(KEY_COL2))
)
);
} while(result.moveToNext());
return alarms;
}
</pre>
<h3>Paso 4: Utilizando la clase DBHelper</h3>
<p>Una vez tenemos creada  la clase DBHelper el uso de la misma es bastante trivial. Basta con  crear un objeto DBHelper y llamar a los métodos open() y close() antes y  después de utilizar los métodos de uso que hayamos creado. Mi  recomendación es llamar al método open() en los métodos onCreate() y  onResume() de la actividad que vaya a utilizar la base de datos y  close() en el método onPause().</p>
<pre class="brush: java; light: false; title: ; toolbar: true; notranslate">
public class miActividad extends Activity {

private DBHelper BD;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//Creamos y abrimos la base de datos
BD=new DBAdapter(this);
BD.open();

//Insertamos una nueva alarma con valores _id=1, alarma=1, evento=1
BD.insertAlarma(1, 1, 1);

//Modificamos la alarma anterior dejándola como _id=1, alarma=2, evento=3
BD.updateAlarma(1, 2, 3);

//Obtenemos la alarma creada anteriormente
Alarma alarma = BD.getAlarma(1);

//Borramos la alarma creada anteriormente con índice 1
BD.removeAlarma(1)

//Obtenemos un listado de todas las alarmas
ArrayList&lt;Alarma&gt; alarmas = new ArrayList()&lt;Alarma&gt;;
alarmas =(ArrayList&lt;Alarma&gt;) BD.getAlarmas();

}

@Override
public void onPause() {
super.onPause();
BD.close();
}
@Override
public void onResume() {
super.onResume();
BD.open();
}
</pre>
<p>Si tenéis cualquier consulta, dejadla en un comentario.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.netrunners.es/usar-nuestra-propia-base-de-datos-sqlite-en-android/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Feria de Albacete 2011</title>
		<link>http://blog.netrunners.es/feria-de-albacete-2011/</link>
		<comments>http://blog.netrunners.es/feria-de-albacete-2011/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 22:24:37 +0000</pubDate>
		<dc:creator>Miguel S. Mendoza</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Descargas]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[autobuses]]></category>
		<category><![CDATA[feria 2011]]></category>
		<category><![CDATA[feria albacete]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[market]]></category>
		<category><![CDATA[oficial]]></category>
		<category><![CDATA[programa]]></category>

		<guid isPermaLink="false">http://blog.netrunners.es/?p=4137</guid>
		<description><![CDATA[Comienza la Feria de Albacete y para este año, junto con los otros miembros de la Asociación Albandroid, hemos desarrollado una aplicación en la que se podrá encontrar el programa de feria oficial, así como otros eventos que no aparecen en el programa impreso. La principal característica de esta aplicación es el uso de un [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Feria de Albacete 2011" href="https://market.android.com/details?id=es.albandroid.feria11" target="_blank"><img class="alignleft" src="https://ssl.gstatic.com/android/market/es.albandroid.feria11/hi-256-1-4ae605be86a6f3ee46880875fd27cad732f2e6fd" alt="" width="256" height="256" /></a>Comienza la Feria de Albacete y para este año, junto con los otros miembros de la Asociación Albandroid, hemos desarrollado una aplicación en la que se podrá encontrar el programa de feria oficial, así como otros eventos que no aparecen en el programa impreso. La principal característica de esta aplicación es el uso de un mapa para localizar todos los eventos, permitiéndonos el cálculo de rutas hacia la posición de éstos desde nuestra posición actual, asi como poder establecer recordatorios para que no se nos olvide ninguno de nuestros eventos favoritos.También hemos incluído las rutas de las tres líneas de autobuses habilitadas para el transporte a la feria para saber siempre cual es la parada más cercana.</p>
<p>La descripción oficial es la siguiente:</p>
<h3>Disfruta de la Feria.</h3>
<p>Aprovéchate de las posibilidades que te brinda  tu Smartphone para disfrutar de la Feria de Albacete 2011, declarada de  Interés Turístico Internacional y una de las principales fiestas de  España por su historia y su gente.</p>
<h3>Vívela como nunca.</h3>
<p>Incluye  toda la información del programa oficial y aún más. Podrás ver cuando y  donde sucederán todos los eventos que se desarrollen durante los 11  intensos días que dura nuestra Feria</p>
<p>Además, sabrás donde se  encuentran algunos sitios de interés como cajeros o baños públicos, y  dispondrás de las rutas y los horarios de los autobuses públicos que  pone a disposición el Ayuntamiento para facilitar el acceso al Recinto  Ferial.</p>
<p>Todo bajo un interfaz intuitivo y agradable, para que el uso de la aplicación sea completamente natural.</p>
<h3>No pierdas detalle.</h3>
<p>Como  sabemos que el tiempo en fiestas pasa volando y no queremos que faltes a  nada, la aplicación tiene su propio sistema de alarma donde podrás  añadir aquellos eventos que no te quieras perder, recordándote con  suficiente antelación para que puedas asistir sin problemas.</p>
<h3>Diviértete con tu gente.</h3>
<p>¿Hay  algún acto que te llame la atención? ¡Publícalo en tu Facebook! Con  esta aplicación también podrás compartir con todos tus amigos de las  redes sociales a donde te gustaría acudir. Así todo el mundo sabrá donde  encontrarte o podrás informar de eventos que puedan resultar de interés  para tus contactos.</p>
<h3>Caracteristicas:</h3>
<p>* Uso de Google Maps para geolocalización y creación de rutas.<br />
* Separación de eventos por tipo, hora y lugar.<br />
* Sistema de alarma integrado.<br />
* Posibilidad de compartir eventos via E-Mail, redes sociales, etc.<br />
* Interfaz agradable e intuitivo.<br />
* Incluye el programa oficial de nuestra Feria.<br />
* Rutas de transporte público.</p>
<h2>Capturas:</h2>
<p><a title="Feria de Albacete 2011" href="https://market.android.com/details?id=es.albandroid.feria11" target="_blank"><img class="alignnone" src="https://g0.gstatic.com/android/market/es.albandroid.feria11/ss-480-0-3" alt="" width="230" height="384" /></a><a title="Feria de Albacete 2011" href="https://market.android.com/details?id=es.albandroid.feria11" target="_blank"><img class="alignnone" src="https://g0.gstatic.com/android/market/es.albandroid.feria11/ss-480-2-1" alt="" width="230" height="384" /></a><a title="Feria de Albacete 2011" href="https://market.android.com/details?id=es.albandroid.feria11" target="_blank"><img class="alignnone" src="https://www.gstatic.com/android/market/es.albandroid.feria11/ss-480-1-1" alt="" width="230" height="384" /></a><a title="Feria de Albacete 2011" href="https://market.android.com/details?id=es.albandroid.feria11" target="_blank"><img class="alignnone" src="https://g0.gstatic.com/android/market/es.albandroid.feria11/ss-480-3-0" alt="" width="234" height="389" /></a></p>
<h2>Descarga:</h2>
<p><img class="aligncenter" src="http://www.qrcode.es/generador/qr_img.php?d=market://details?id=es.albandroid.feria11&amp;s=7&amp;color=" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.netrunners.es/feria-de-albacete-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

