Confía tu proyecto a un equipo profesional

  • - Gran experiencia en el desarrollo de aplicaciones para dispositivos móviles.
  • - Ocupamos los primeros puestos en el ranking de las diferentes Stores.
  • - Reconocidos y avalados por grandes clientes en multitud de proyectos.
  • - Empresa innovadora integrada por un equipo joven.


SQLite con UITableView (Parte I)

Share


Para el ejemplo de hoy, vamos a poner en práctica el uso de SQLite en una aplicación que vamos a ir desarrollando poco a poco, hasta convertirla en una agenda buscador de pisos, que nos permita la aplicación de insertar inmuebles que veamos y nos interesen, y por qué no más adelante igual le damos la posibilidad de asociar el inmueble con un mapa de Google Maps e incluso la posibilidad de adjuntar fotografías a cada registro que insertemos, pero eso más adelante.

Para comenzar con nuestra aplicación, recordemos que primero debemos de insertar como framework de nuestro proyecto, la librería dinámica de libsqlite3.0.dylib. 

Por otra parte no olvidemos crearnos nuestra base de datos, y que cada uno la cree con la aplicación que mejor considere, yo ya dejé un pequeño ejemplo en anteriores artículos. La insertamos bajo la carpeta de Resources en nuestro árbol de proyectos. En nuestro caso se llamará inmueblesdb.sql.

Ahora editamos nuestro fichero de recursos XIB para incluir un controlador de navegación (Navigation Controller) para gestionar varias vistas que tendremos. Para nuestro controlador de vista (View Controller) creado por defecto bajo el árbol de Navigation Controller, vamos a generar los ficheros de declaración e implementación (h, m), ya que trabajaremos sobre ellos. Antes de hacerlo desde el menú File / Write Class Files le vamos a cambiar el nombre a la clase de UIViewController por DataViewController, para localizarlo mejor en nuestro proyecto, ya que va a ser la vista encargada de mostrar los datos principales de nuestra base de datos. Para cambiarle el nombre lo hacemos desde la última opción de la ventana de atributos, llamada Identity.

Una vez cambiado el nombre de nuestra clase y tras generar los ficheros de dicha clase, si probamos a compilar veremos que nos da un error, ya que la definición de nuestra clase la realiza incompleta, a falta de que nosotros terminemos de definirla. En concreto espera a que definamos la clase padre de donde queremos que herede y en nuestro caso es de UITableViewController, así que reemplazamos el comentario que nos genera por dicha clase.

A continuación, vamos a incluir nuestra clase recién creada en nuestra clase delegada de la aplicación, para que cuando la ejecutemos, en lugar de aparecer la ventana blanca vacía, aparezca ya nuestro Navigation Controller. Esta es una de las operaciones que espero que en próximas versiones del SDK mejoren, pues lo que vamos a realizar en tres pasos, sería más lógico hacerlo en uno solo, os cuento:

1. Definimos nuestro objeto Navigation Controller en la clase delegate:

IBOutlet UINavigationController *navigationController;

@property (nonatomic, retain) UINavigationController *navigationController;

 2. Implementamos el mismo objeto en la parte de implementación de la misma clase delegate:

@synthesize navigationController;

3. En nuestro fichero de recursos, indicamos que nuestro objeto Navigation Controller forma parte de nuestra clase delegate mediante las conexiones.

Como os comentaba, me resulta más lógico que el paso 1 y 2 se generen automáticamente cuando realicemos el paso 3, con la opción de que me permita asignar un nombre al objeto que voy a generar.

Bueno, en este punto ya tenemos nuestro fichero de recursos preparado, nuestra base de datos creada y nuestra clase que va a gestionar dichos datos (DataViewController) ya generada. Antes de empezar, nos falta una última clase ( de momento ) que va a ser la responsable de mostrar la estructura de nuestros datos.

En un próximo artículo la crearemos y realizaremos la conexión con la base de datos para comenzar a completar nuestra tabla (UITableView).

 

 

 

 

Videos iPhone / iPod Touch

Share


En la siguiente lista iremos dejando enlaces interesantes acerca de videos relacionados con el desarrollo de aplicaciones para iPhone / iPod Touch y con todo lo que rodea al dispositivo. Si conoces alguno más no dude en comunicarlo.

iPhone emulator

iPhone/iPod Touch SDK Tutorial

iPhone SDK Tutorial 2

iPod Touch/iPhone SDK Tutorial 3, COCOA TOUCH!!!!

Hello World – iPhone Dev Center

Running a Sample App in the iPhone SDK / Emulator

iPhone SDK Tutorial: Touches in a UIImageView Part 1

iPhone SDK Tutorial: Touches in a UIImageView Part 2

Native iPhone App in 3 minutes with Jiggy

WWDC 2008 News: iPhone 3G makes its debut

WWDC 2008 News: Jobs unveils GPS for the iPhone 3G

WWDC 2008 News: Get and make local news with your iPhone

WWDC 2008 News: iPhone 3G to be available in 70 countries

WWDC 2008 News: Monkeying around on the iPhone

WWDC 2008 News: eBay shows off auction app for the iPhone

WWDC 2008 News: Loopt shows off new app for the iPhone

WWDC 2008 News: Typepad goes mobile on the iPhone

WWDC 2008 News: Human anatomy software for iPhone debuts

WWDC 2008 News: Major League Baseball pitches to the iPhone

WWDC 2008 News: iPhone users rock out with Band

UINavigationBar Cocoa Touch Tutorial (iPhone)

Joe Hewitt: “An Introduction to iUI”

SQLite en tu iPhone

Share


Con la llegada del kit de desarrollo para iPhone (SDK), vimos uno de los componentes, que bajo mi opinión, es de los más importantes de la librería, SQLite.

SQLite es un sistema de bases de datos empotrado, que nos ofrece gran flexibilidad a la hora de realizar aplicaciones que se apoyen en una base de datos. SQLite es de dominio público y multi-plataforma. De hecho, existen muchas maneras de utilizarlo: en entornos embebidos, sitios web, como apoyo a servicios del sistema operativo, en scripts, y en diversas aplicaciones.

SQLite también podría servir como una especie de cache, que mantenga los datos de la configuración, o incluso debido a su compatibilidad binaria entre plataformas podria trabajar como un formato de archivo para alguna aplicacion.

En definitiva, es una muy buena opción para unir datos con aplicaciones y vamos a ver un pequeño ejemplo de como utilizarlo con sencillas sentencias de SQL.

En mi ejemplo, he comenzado creando una sencilla base de datos, para la cual he utilizado la aplicación SQLite Database Browser 1.3 ya que aunque es muy antigua y existen multitud de aplicaciones para tal uso, a mi me gusta porque es muy ligera y muy sencilla de utilizar.

Para poder compilar nuestro proyecto, una vez insertada la base de datos recién creada, es necesario añadir la librería dinámica libsqlite3.0.dylib, que como ya recordarán en anteriores artículos expliqué la forma recomendada de insertarla para no marearnos.

Gracias a dicha librería y a la inclusión del fichero de cabecera #import <sqlite3.h> ya podemos comenzar a trabajar con nuestra base de datos para nuestra aplicación.

La forma de acceder a nuestro fichero de base de datos y abrirlo es de la siguiente manera:

-(BOOL)openDatabaseAtPath:(NSString*)path
{
  NSFileManager *fileManager = [NSFileManager defaultManager];
//comprobamos si el fichero existe
  if([fileManager fileExistsAtPath:path])
  {
    if(sqlite3_open([path UTF8String], &amp;db) == SQLITE_OK)
    {
      NSLog(@"Base de datos abierta en %@", path);
dbOpened = YES;
return YES;
}
  }
NSLog(@"Base de datos no localizada en %@", path);
  return NO;
}

Al igual que hemos usado sqlite3_open para la apertura de nuestra base de datos, existen infinidad de funciones, objetos, constantes, etc, que podemos consultar en su página oficial de SQLite3 http://www.sqlite.org/capi3ref.html.

Una vez abierta, operaciones como la consulta de registros dentro de una tabla son tan sencillas como se muestra a continuación:

-(int)volumeIsIndexed:(NSString*)volumnName
{
  if(!dbOpened)
    return NO;

  const char *sql = [[NSString stringWithFormat:@"SELECT volumeID FROM volumes WHERE volumeName       ='%@'", volumnName] cStringUsingEncoding:NSUTF8StringEncoding];
sqlite3_stmt *statement;
BOOL ret;

  if (sqlite3_prepare_v2(db, sql, -1, &amp;statement, NULL) == SQLITE_OK)
  {
    int result = sqlite3_step(statement);
if(result == SQLITE_ROW)
      ret = sqlite3_column_int(statement, 0);
else
      ret = NO;
}
sqlite3_finalize(statement);
return ret;
}

sqlite3_stmt almacena una consulta previamente ejecutada, la cual contiene la información solicitada para trabajar con los registros devueltos. Dicha información la prepara la función sqlite3_prepare_v2. Cualquier consulta debe ser finalizada y eliminada mediante sqlite3_finalize.

Espero que aprovechéis la flexibilidad y el sencillo manejo de SQLite3 al igual que lo aproveché yo.

iPhone SDK Beta 5

Share


Sin tiempo aún para revisar a fondo la anterior beta 4, hoy vuelven a publicar una nueva versión del kit de desarrollo de iPhone.

Esta vez, sin muchas novedades ya que arregla algunos bugs de versiones anteriores, mejora aspectos de la interfaz de usuario y añade soporte para la ultima versión del iPhone OS. Quien ya lo ha probado comenta también aspectos como la posibilidad de ver videos musicales en vertical y una opción llamada Location Services en las opciones de General.

Ya os contaré novedades si encuentro alguna más.

El acelerómetro de iPhone

Share


Una de las características más vistosas de nuestro dispositivo iPhone/iPod touch es la del acelerómetro, que es aquel que nos permite controlar los distintos movimientos que se producen en el mismo, o como mejor definición la presentada por Wikipedia como:

“Usado para determinar la posición de un cuerpo, pues al conocerse su aceleración en todo momento, es posible calcular los desplazamientos que tuvo. Considerando que se conocen la posición y velocidad original del cuerpo bajo análisis, y sumando los desplazamientos medidos se determina la posición.”

Pues bien, ya que sabemos de que hablamos, ahora vamos a saber como utilizarlo en nuestras aplicaciones, no sin antes dejar bien claro que este caso práctico solamente es posible compilarlo y depurarlo a través de nuestro dispositivo, ya que de momento mediante el simulador no hay manera de reproducir dichos movimientos.

-La clase UIAccelerometer

Esta clase es la responsable de registrar los movimientos que se producen en nuestro dispositivo. Obtenemos como información los cambios producidos en cualquiera de sus tres ejes X, Y, Z  (rotación – inclinación).

 

UIAccelerationValue	_accelerometer[3]; 
//3 para controlar cada uno de los ejes

No es necesario crear objetos de esta clase, ya que usaremos el objeto compartido del dispositivo (sharedAccelerometer) para recibir los eventos de dicha clase, según el intervalo de tiempo que le definamos (20 milisegundos son 50Hz). Dichos eventos serán siempre recogidos en el hilo principal de nuestra aplicación y controlados por su delegado (delegate).

 

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 50)];

[[UIAccelerometer sharedAccelerometer] setDelegate:self];

 

En nuestra clase delegada de UIApplication, es necesario definamos el protocolo UIAccelerometerDelegate en nuestro fichero de declaración:

 

@interface AppController : NSObject <UIAccelerometerDelegate>

Gracias a dicho protocolo, podemos recibir dichos eventos en nuestro fichero de implementación mediante:

- (void)accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration

 

- Simular el efecto gravedad

El siguiente bloque de código, localizado en nuestra función didAccelerate, simula el efecto gravedad para que los movimientos no sean bruscos. Esto se consigue aplicando un leve filtro a nuestros valores de X, Y y Z, en este caso de un 10% de datos de aceleración no filtrada.

 

_accelerometer[0]=acceleration.x * 0.1 + _accelerometer[0]*(1.0 - 0.1);

_accelerometer[1]=acceleration.y * 0.1 + _accelerometer[1]*(1.0 - 0.1);

_accelerometer[2]=acceleration.z * 0.1 + _accelerometer[2]*(1.0 - 0.1);

 

 

UITableView con índices

Share


En el ejemplo de hoy nos hemos basado en el tercer caso práctico de TableViewSuite de iPhone Dev Center. (Podéis descargarlo en http://developer.apple.com/iphone/library/samplecode/

TableViewSuite/index.html )

UITableView, es una de las clases más utilizadas, pues nos permite mostrar información en forma de lista y puede ser ordenada, agrupada y localizada de forma sencilla.

En el ejemplo de hoy, vamos a mostrar una sencilla lista de zonas horarias, ordenadas por orden alfabético, con la primera letra de cada región como cabecera de la sección y con un índice para acceder de forma rápida.

Para obtener la información de las zonas horarias, en nuestra clase delegada de UIApplication, obtenemos dicha información mediante la clase abstracta NSTimeZone, a través de su propiedad knownTimeZoneNames en una variable de tipo NSArray aunque en nuestro caso preferimos hacerlo con una del tipo NSMutableArray (hereda de NSArray y por lo tanto implementa operaciones básicas de inserción y eliminación de elementos en la lista).

C++:
  1. NSMutableArray* nuestravariable = [NSTimeZone knownTimeZoneNames];

Hemos preferido NSMutableArray ya que está indicada para el manejo personalizado de la lista, y al ser una subclase de NSArray nos permitirá implementar métodos como:

C++:
  1. insertObject:atIndex:
  2. removeObjectAtIndex:
  3. addObject:
  4. removeLastObject
  5. replaceObjectAtIndex:withObject:

En nuestra clase controladora, heredaremos de UITableViewController para manejar nuestro TableView. Aprovecharemos su método initWithStyle para aplicar un estilo a nuestro TableView (ya visto en nuestra clase delegada de UIApplication con initWithStyle:UITableViewStylePlain). Podéis probar con el estilo UITableViewStyleGrouped y comprobar vosotros mismo el cambio.

-Métodos de UITableViewDataSource
En nuestra clase controladora vamos a sobreescribir algunos métodos necesarios para el correcto funcionamiento de la aplicación. En concreto son de la clase UITableViewDataSource que son llamados a partir del objeto UITableView por medio de eventos.

1. numberOfSectionsInTableView

Método opcional de la clase UITableViewDataSource, que será llamado en el momento que hayamos insertado todos los datos, si nos fijamos en la pila de llamadas a través de:

Como no hay mejor manera de aprender, que comprobar por nosotros mismos ciertos comportamientos, en lugar de devolver el número de secciones de nuestro TableView, pongamos un 2 (return 2;).

2. numberOfRowsInSection

Al igual que el método anterior, a través de UITableViewDataSource, devolvemos el número de regiones de cada sección, el cual es llamado desde:

3. titleForHeaderInSection

Pregunta al DataSource por el título de la cabecera de la sección especificada.

4. sectionIndexTitlesForTableView

Pregunta al DataSource para que devuelva los títulos para las secciones del TableView.

5. sectionForSectionIndexTitle

Pregunta al DataSource para devolver el índice de una sección.

* Si obviamos estos tres últimos métodos, veremos como los datos aparecen de forma plana, sin cabeceras ni índices. Es conveniente comentar cada uno de ellos para ver el resultado y comprender mejor el ejemplo.

-Métodos de UITableView

1. cellForRowAtIndexPath

Devuelve el valor de una determinada fila o celda a partir de un índice.

Para finalizar, una de las funciones más importantes en nuestro ejemplo de hoy es la encargada de rellenar la información que será mostrada. Para ello, mediante un objeto diccionario de la clase NSMutableDictionary nos dispondremos a rellenarlo.

C++:
  1. NSMutableDictionary *indexedTimeZones = [[NSMutableDictionary alloc] init]; for (NSString *name in knownTimeZoneNames)
  2.  
  3. {
  4.  
  5. // The region name is unused in this example
  6.  
  7. NSArray *components = [name componentsSeparatedByString:@"/"];
  8.  
  9. NSString *timeZoneLocaleName = localeNameForTimeZoneNameComponents(components);
  10.  
  11. NSString *firstLetter = [timeZoneLocaleName substringToIndex:1];
  12.  
  13. NSMutableArray *indexArray = [indexedTimeZones objectForKey:firstLetter];
  14.  
  15. if (indexArray == nil)
  16.  
  17. {
  18.  
  19. indexArray = [[NSMutableArray alloc] init];
  20.  
  21. [indexedTimeZones setObject:indexArray forKey:firstLetter];
  22.  
  23. [indexArray release];
  24.  
  25. }
  26.  
  27. NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:name];
  28.  
  29. NSDictionary *timeZoneDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:timeZone, @"timeZone",    timeZoneLocaleName, @"timeZoneLocaleName", nil];
  30.  
  31. [indexArray addObject:timeZoneDictionary];
  32.  
  33. }

El diccionario indexedTimeZones irá rellenando cada una de las letras de las regiones en una variable CFString y en otro diccionario hijo (timeZoneDictionary) las zonas horarias que empiezen por esa letra. A continuación se ordenará el primer diccionario y por cada una de las letras se ordenarán igualmente los diccionarios que contienen (sortUsingDescriptors:sortDescriptors).

Nota: Interesante detalle el de mostrar una imagen nada más iniciar la aplicación, dado que nos lleva un tiempo el cargar la información de las zonas horarias. La imagen es una captura de la propia aplicación, así de esa manera, evitamos un desagradable efecto.

Frameworks y Librerías dinámicas

Share


Las librerías dinámicas (.dylib) son como los ficheros de librería DLL conocidos en Windows. Son ficheros de enlace dinámico que pueden resultarnos útiles para la construcción de nuestro proyecto, al igual que los conjuntos de clases disponibles en los frameworks.

En función del tipo de plataforma sobre el que queramos crear nuestra aplicación (iPhone OS 2.0, Mac OS X 10.4, Mac OS X 10.5), recomiendo que a la hora de añadir el framework o librería dinámica que queramos incluir, no lo hagamos buscando de forma manual el fichero necesario, aunque en algunas ocasiones no quede más remedio, sino que lo hagamos desde nuestro árbol de proyectos, bajo la opción de Targets / Link Binary with libraries, con el botón derecho Add Existing Framework.

A diferencia de la búsqueda manual, veremos que de esta forma es mucho más sencillo, ya que además de localizar solamente los frameworks disponibles para nuestra plataforma, también podemos añadir librerías dylibs.

  • Buy Cheapest new fat binding weight loss pill Now Best Prices. Discount Online Pharmacy.
  • Buy Cheapest medco pharmacy Online Drugs, Health And Beauty. Best Prices.
  • Buy Cheap cialis europe Online Cheap Online Pharmacy. Online Medical Shop.
  • Buy Cheap weight loss medication Now Pharmacy Store. Pharmacy At The Best Price!
  • Buy Cheapest prescribed weight loss pills Now Cheap Prescription Drugs. Pharmacy Store.
  • Buy Cheapest adult acne Online Cheap Online Pharmacy. Best Online.
  • Buy Cheap where to order fioricet with codeine Now Free Viagra Pills! Drugs, Health And Beauty.
  • Buy Cheapest uk drug prices Now Guaranteed Shipping. Pharmacy Store.
  • Buy Cheapest otc weight loss supplements Online Best Internet. Free Viagra Pills!
  • Buy Cheapest diabetic impotence Online Cheap Online Pharmacy. Best Drugstore.
  • Buy Cheapest pills for bipolar disorder Now Best Drugstore. 24/Online Pharmacy.
  • Buy Cheapest valtrex commercials Now WorldWide Shipping. No Prescription Needed.
  • Buy Cheap online pharmacy no prescriptions Now Best Prices. 100% Satisfaction Guaranteed.
  • usa discount pharmacy Online Without Prescription Low Prices. Free Viagra Pills!
  • Buy Cheap buy cheap alprazolam Online WorldWide Shipping. Buy Medications Online.
  • Buy Cheapest phentermine no perscription Online Pharmacy Store. Guaranteed Shipping.
  • Buy Cheap doctor diet pills Online Pharmacy Store. Cheap Online Pharmacy.
  • Buy Cheapest pay pal buy diflucan Now Pharmacy At The Best Price! Low Prices.
  • Buy Cheapest effects nexium Now Online Medical Shop. Guaranteed Shipping.
  • Buy Cheap levitra use Now Free Viagra Pills! Buy Medications Online.
  • Buy Cheap online pain doctors Now Online Prices For online pain doctors! Top Online Pharmacy.
  • Buy Cheap rapid weight loss pills Online The Largest Internet Pharmacy. Best Online.
  • Buy Cheapest buy ativan from europe Online Best Prices. Buy Medications Online.
  • Buy Cheapest strongest pain medications Now Online Medical Shop. Cheap Online Pharmacy.
  • Buy Cheapest appetite suppressant medication Online Best Online. No Prescription Needed.
  • Buy Cheap phentermine for less Now Guaranteed Shipping. Online Medical Shop.
  • Buy Cheapest cost of prescription for chlamydia Now Best Online. Order Cheap Meds Without Rx.
  • Buy Cheapest xanax dosage Online Best Drugstore. Free Viagra Pills!
  • Buy Cheapest ultram withdrawl Now Best Internet. No Prescription Needed.
  • Buy Cheapest canadian prescription medications Online Best Prices. Discount Pharmacy Online.
  • Buy Cheapest very cheap tramadol Online Discount Online Pharmacy. Best Internet.
  • Buy Cheapest xanax pregnancy Online Guaranteed Shipping. Free Viagra Pills!
  • Buy Cheap do diet pills work Online Top Online Pharmacy. Best Drugstore.
  • Buy Cheapest long term use of ambien Online Online Prices For long term use of ambien! Low Prices.
  • Buy Cheap zithromax 500 mg Online Cheap Prescription Drugs. Best Internet.
  • Buy Cheapest list of vitamin supplements Online Drugs, Health And Beauty. Best Prices.
  • Buy Cheapest atorvastatin Now Best Online. Discount Pharmacy Online.
  • Buy Cheap viagra cheapest online sellers Now Top Online Pharmacy. Drugs, Health And Beauty.
  • Buy Cheap where to buy levitra Now Buy Medications Online. Cheap Online Pharmacy.
  • Buy Cheap pfizer viagra dosage 100 mg Online Guaranteed Shipping. Pharmacy Store.
  • Buy Cheapest diazepam anxiety Now 24/Online Pharmacy. WorldWide Shipping.
  • Buy Cheap viagra testosterone Online Low Prices. Top Online Pharmacy Supplier.
  • Buy Cheap ambien canadian pharmacy Now Pharmacy Store. Discount Pharmacy Online.
  • Buy codeine pills Without Prescription Doctor. Internet Prices For codeine pills!
  • Buy Cheapest canadian pharmacy meds Online Guaranteed Shipping. Best Prices.
  • Buy Cheapest most effective prescription sleep aids Online Cheap Online Pharmacy. Best Drugstore.
  • Buy Cheap reliable online pharmacies Online Drugs, Health And Beauty. Best Online.
  • Buy Cheap alprazolam generic for xanax Online Online Medical Shop. Pharmacy Store.
  • Buy Cheapest cost of chlamydia medication Online Best Prices. No Prescription Needed.
  • Buy Cheap pmdd medicine Online Pharmacy Store. No Prescription Needed.
  • Buy Cheap diet pill phentermine Now Special Prices For diet pill phentermine! Best Prices.
  • Buy Cheap valtrex cheap Now Online Prices For valtrex cheap! Top Online Pharmacy.
  • Buy alprazolam pills Online Without Prescription. Best Prices. Best Online.
  • Buy Cheap safe generic cialis Now Best Prices. Order Cheap Meds Without Rx.
  • Buy Cheap buspirone hcl Now Cheap Prescription Drugs. Top Online Pharmacy.
  • Buy Cheap stress valium Now Best Internet. Pharmacy At The Best Price!
  • Buy Cheap phentermine 37.5 diet pills Now Pharmacy At The Best Price! Best Internet.
  • Buy Cheapest cialis soft tab description Now Cheap Pharmacy Online. WorldWide Shipping.
  • Buy Cheapest order pain medicine online Now Internet Prices For order pain medicine online! Pharmacy Store.
  • Buy Cheap buy propecia where Online No Prescription Needed. Best Prices.
  • Buy Cheap best levitra price Now Online Medical Shop. Free Viagra Pills!
  • Buy Cheap viagra from uk Online Best Prices. Cheap Prescription Drugs.
  • Buy Cheap valium 5mg Now Best Internet. Top Online Pharmacy Supplier.
  • Buy Cheap buy online zoloft Now Buy Medications Online. Top Online Pharmacy.
  • Buy Cheapest natural appetite suppressants Now Top Online Pharmacy. WorldWide Shipping.
  • Buy Cheap narcotic pain pills without a prescription Online Online Medical Shop. Guaranteed Shipping.
  • weight loss herbs Online Without Prescription Low Prices. WorldWide Shipping.
  • Buy Cheap weight loss remedies Now Guaranteed Shipping. Discount Online Pharmacy.
  • Buy viagra dosing Online Without Prescription. Best Prices. Best Online.
  • Buy Cheap fat burning diet Now Pharmacy Store. Order Cheap Meds Without Rx.
  • Buy Cheap ambien side effect Online Cheap Online Pharmacy. Pharmacy Store.
  • Buy Cheap tramadol dosage Online Special Prices For tramadol dosage! Best Online.
  • Buy Cheap medical weight loss Online Online Medical Shop. Top Online Pharmacy.
  • Buy Cheap order viagra jelly Now Best Online. The Largest Internet Pharmacy.
  • Buy Cheapest free trial diet pills Now Cheap Pharmacy Online. Guaranteed Shipping.
  • Buy Cheapest online pet pharmacy Online Best Drugstore. Cheap Pharmacy Online.
  • top 10 diet pills Online Without Prescription Free Viagra Pills! Best Online.
  • Buy Cheapest azithromycin bronchitis Online Best Internet. Discount Online Pharmacy.
  • Buy Cheap drugs for schizophrenia Now 24/Online Pharmacy. WorldWide Shipping.
  • Buy Cheap buy pheromone to attract woman Online Best Prices. No Prescription Needed.
  • Buy Cheap viagra substites Now Pharmacy Store. Order Cheap Meds Without Rx.
  • Buy Cheap proscar 5 mg Now Pharmacy Store. Top Online Pharmacy Supplier.
  • Buy Cheapest cheap lexapro Now Top Online Pharmacy. Cheap Pharmacy Online.
  • buy valium cheap Online Without Prescription Free Viagra Pills! Low Prices.
  • Buy Cheap top 10 diet pills Online Best Online. Pharmacy At The Best Price!
  • Buy Cheapest how fast does valium work Now Best Internet. Special Prices For how fast does valium work!
  • Buy Cheapest on line cialis Now Top Online Pharmacy Supplier. Best Online.
  • Buying Cheap zyban how to use. Mexican Pharmacy, Good Prices. Best Drugstore.
  • Buy Cheap purpose of xanax Now Best Online. All Medications Are Certificated!
  • Buy Cheapest bayer levitra professional pro Online Best Drugstore. Free Viagra Pills!
  • Buy Cheap klonopin and pregnancy Now Best Drugstore. Discount Online Pharmacy.
  • Buy Cheap cheap drugs Online Best Online. Internet Prices For cheap drugs!
  • Buy Cheapest geodon and codeine Online Online Medical Shop. WorldWide Shipping.
  • Buy Cheapest discount erectile dysfunction medicatin Online WorldWide Shipping. Best Drugstore.
  • Buy Cheap us based viagra Online 100% Satisfaction Guaranteed. Best Prices.
  • Buy prescription drugs generic medicines brand product Online Without Prescription. Pharmacy Store. Low Prices.
  • Buy Cheap trazodone sleep aid Online Pharmacy Store. Guaranteed Shipping.
  • Buy Cheapest tramadol doses Online 24/Online Pharmacy. Best Internet.
  • Buy Cheapest clomid take Now Top Online Pharmacy. Free Viagra Pills!
  • Buy Cheapest herbal based diet products Now Best Online. Special Prices For herbal based diet products!