Programar para Iphone desde tres. NSMutableArray. Nivel Luis Aragonés.

Share


Hoy juega España la final de la Eurocopa y publicar el nivel Luis Aragonés es nuestra forma de conmemorar este evento,

Hemos aprendido ya muchas cosas. En el ejemplo anterior aprendimos a adquirir datos, que el usuario insertaba en un formulario. Hoy vamos a aprender a guardar esos datos de manera permanente, es decir, creando array de datos y guardarlos en ficheros.

Empezamos:
Como este es el Artículo “Programar para Iphone desde Tres” me basaré en los anteriores, “desde Cero”, “desde Uno” y "desde Dos", y doy por sabidas las cosas expuestas en ellos.

Explicación del ejemplo:

Pretendo realizar un programa que sea como una agenda de contactos, que guarde el nombre, la dirección y el teléfono de mis amigos. Evidentemente pretendo poder añadir nuevos contactos y también eliminarlos. Por lo tanto, crearé en mi ventana, tres UITextField que me servirán tando para adquirir datos como para mostrar información. Y además pondré 4 botones, uno de añadir contacto, otro de borrar contacto, y otros dos de siguiente y anterior.

Creación del proyecto:

1.- Abrimos xcode.app y creamos un proyecto de tipo window.

Definición de Objetos y Acciones:

Como ya tenemos una cierta base ire al grano.

2.- En el archivo.h de nuestra app delegate, crearemos todos los Outlet y todas las Actions. Además necesitaré un NSMutableArray, que será la variable que guarde todos mis datos.

Antes de nada hay que hablar un poco del NSMutableArray. Se trata de un Array en el que en cada posición de su tabla interna de datos, puedes guardar cualquier tipo de objeto, es decir, en cada posición podría guardar un entero, o una cadena. En nuestro caso, en cada posición de nuestro NSMutableArray tendremos a otro NSMutableArray. Con esto logramos crear una especie de estructura. Este segundo Array tendrá tres cadenas, una para el nombre, otra para la dirección y otra la el teléfono.

C++:
  1. #import
  2. @class DATOSViewController;
  3.  
  4. @interface DATOSAppDelegate : NSObject
  5. {
  6. IBOutlet UIWindow *window;
  7.  
  8. IBOutlet id BOTON_SIGUIENTE;
  9. IBOutlet id BOTON_ANTERIOR;
  10. IBOutlet id BOTON_ANADIR;
  11. IBOutlet id BOTON_BORRAR;
  12.  
  13. IBOutlet id FORM_NOMBRE;
  14. IBOutlet id FORM_DIRECCION;
  15. IBOutlet id FORM_TELEFONO;
  16. NSMutableArray *DATOS;
  17.  
  18. NSString *NOMBRE;
  19. NSString *DIRECCION;
  20. NSString *TELEFONO;
  21.  
  22. NSUInteger INDICE;
  23. NSUInteger NUMERO_ELEMENTOS;
  24. }
  25. @property (nonatomic, retain) UIWindow *window;
  26.  
  27. - (IBAction) PULSAR_BOTON_SIGUIENTE: (id) sender;
  28. - (IBAction) PULSAR_BOTON_ANTERIOR: (id) sender;
  29. - (IBAction) PULSAR_BOTON_ANADIR: (id) sender;
  30. - (IBAction) PULSAR_BOTON_BORRAR: (id) sender;
  31. - (IBAction) CARGAR_DATOS: (NSUInteger) indice;
  32.  
  33. @end

Creación de interface y asignación de elementos:

3.- Ahora hacemos doble click sobre el archivo.xib para abrir y editar con el interface builder nuestra pantalla. Simplemente pongo la captura, ya que las vinculaciones ya las deberiais saber hacer.

Implementación de funciones:

Como ya lo tenemos todo vinculado, es hora de implementar nuestras funciones.

4.- Cerramos interface builder y nos vamos al Archivo.m. Allí escribiremos las funciones.

Como vamos a trabajar con ficheros, lo primero que tiene que hacer nuestra aplicación es cargar los datos del fichero para luego gestionarlos. El fichero se llamará: "datos.txt".

C++:
  1. - (void)applicationDidFinishLaunching:(UIApplication *)application
  2. {
  3. //Cargamos los datos del fichero.
  4. DATOS = [[NSMutableArray alloc] initWithContentsOfFile:@"datos.txt"];
  5. //    DATOS = [[NSMutableArray alloc] init]; Asi se inicializaria normal.
  6.  
  7. [window makeKeyAndVisible];
  8. [application setStatusBarHidden:YES animated:NO];//Oculta la status Bar
  9. NUMERO_ELEMENTOS = [DATOS count]; // inicializamos esta variable al numero de objetos en DATOS
  10. INDICE = 0;
  11. // ejecutamos el metodo CARGAR_DATOS
  12. [self CARGAR_DATOS:INDICE];
  13. }

Si compilaramos ahora mismo, aparecerían todos los elementos, e incluso podríamos rellenar datos en los UITextField, asi que ahora escribiremos el Método de Añadir (PULSAR_BOTON_ANADIR).

C++:
  1. - (IBAction) PULSAR_BOTON_ANADIR: (id) sender
  2. {
  3. NOMBRE =[FORM_NOMBRE text];
  4. DIRECCION =[FORM_DIRECCION text];
  5. TELEFONO =[FORM_TELEFONO text];
  6.  
  7. NSMutableArray *ESTRUC = [[NSMutableArray alloc] initWithObjects:NOMBRE,DIRECCION,TELEFONO,nil];
  8. [DATOS addObject:ESTRUC];
  9. [DATOS writeToFile:@"datos.txt" atomically:YES];
  10. NUMERO_ELEMENTOS = NUMERO_ELEMENTOS + 1;
  11. [FORM_TELEFONO resignFirstResponder]; //oculta teclado
  12. [FORM_DIRECCION resignFirstResponder];
  13. [FORM_NOMBRE resignFirstResponder];
  14. }

Tengo creadas tres variable globales, son tres cadenas, en las que introduciré los datos que haya en el momento de pulsar el botón en los UITextField (este paso no es necesario para hace al código más entendible). Seguidamente me creo un NSMutableArray local, que lo inicializo con las tres cadenas de antes. Es importante respetar el mismo orden de para la carga de datos. Primero nombre, después dirección y por último teléfono. Añado este NSMutableArray local, a nuestro NSMutableArray general, y además lo escribo en el fichero, sobreescribiendo. Y Actualizo la variable NUMERO_ELEMENTOS. Cada vez que pulse el botón se añadirá un elemento, aunque no haya cambiado los datos.

El método CARGAR_DATOS nos servirá para cambiar el texto de los UITextField e introducirles los datos que haya en la posición del NSMutableArray que indique INDICE. Hay que tener en cuenta que este método será de la siguiente manera:

C++:
  1. - (IBAction) CARGAR_DATOS: (NSUInteger) indice;
  2. {
  3. NSMutableArray *ESTRUC = [[NSMutableArray alloc] init];
  4. ESTRUC = [DATOS objectAtIndex:indice]; //devuelve el objeto de esa posición.
  5. [FORM_NOMBRE setText:[ESTRUC objectAtIndex:0]]; //respetamos el orden
  6. [FORM_DIRECCION setText:[ESTRUC objectAtIndex:1]];
  7. [FORM_TELEFONO setText:[ESTRUC objectAtIndex:2]];
  8. }

El resto del código no tiene ninguna complicación así que lo pondré tal cual.

C++:
  1. - (IBAction) PULSAR_BOTON_SIGUIENTE: (id) sender
  2. {
  3. if (INDICE == (NUMERO_ELEMENTOS - 1))
  4. {
  5. [self CARGAR_DATOS: INDICE];
  6. }
  7. else
  8. {
  9. INDICE = INDICE + 1;
  10. [self CARGAR_DATOS: INDICE];
  11. }
  12. }
  13. - (IBAction) PULSAR_BOTON_ANTERIOR: (id) sender
  14. {
  15. if (INDICE == 0)
  16. {
  17. [self CARGAR_DATOS: INDICE];
  18. }
  19. else
  20. {
  21. INDICE = INDICE - 1;
  22. [self CARGAR_DATOS: INDICE];
  23. }
  24. }
  25.  
  26. - (IBAction) PULSAR_BOTON_BORRAR: (id) sender
  27. {
  28. [DATOS removeObjectAtIndex:INDICE];
  29. NUMERO_ELEMENTOS = NUMERO_ELEMENTOS - 1;
  30. INDICE = INDICE - 1;
  31. [DATOS writeToFile:@"datos.txt" atomically:YES];
  32. [self CARGAR_DATOS:INDICE];
  33. }

5.- Compilamos y comprobamos el funcionamiento.

Ya se que las últimas tres funciones no las tengo explicadas, pero no deberiais tener problemas en entenderlas por vosotros mismo, ya que solo hay que relacionar conceptos ya adquiridos para saber que es lo que hacen.

Como siempre es conveniente que investigueis por vuestra cuenta y mejoreis el programa a vuestro estilo.

Otros Artículos de la serie:

Programar para Iphone desde cero. UIButton. Nivel Tarzán.

Programa para Iphone desde uno. UIView. Nivel Piolín.

Programar para Iphone desde dos. UITextField. Nivel Barragán.

Programar para Iphone desde cuatro. Controllers. Nivel Cantinflas.

banner ad

32 Responses to “Programar para Iphone desde tres. NSMutableArray. Nivel Luis Aragonés.”

  1. Manuel says:

    Lo primero agradecer tu esfuerzo por ayudarnos en el desarrollo sobre iPhone, pero al menos desde mi experiencia con tu ejemplo hay una serie de mejoras (o fallos):
    - (void)applicationDidFinishLaunching:(UIApplication *)application
    {
    //Cargamos los datos del fichero.
    DATOS = [[NSMutableArray alloc] initWithContentsOfFile:@”datos.txt”];

    if (DATOS == nil) {
    DATOS = [[NSMutableArray alloc] init]; // Asi se inicializaria normal – No existe el fichero
    }

    [window makeKeyAndVisible];
    [application setStatusBarHidden:YES animated:NO];//Oculta la status Bar
    NUMERO_ELEMENTOS = [DATOS count]; // inicializamos esta variable al numero de objetos en DATOS
    INDICE = 0;
    // ejecutamos el metodo CARGAR_DATOS
    [self CARGAR_DATOS:INDICE];
    }

    - (IBAction) CARGAR_DATOS: (NSUInteger) indice;
    {
    if (indice < [DATOS count]) {
    NSMutableArray *ESTRUC = [DATOS objectAtIndex:indice]; //devuelve el objeto de esa posición.
    [FORM_NOMBRE setText:[ESTRUC objectAtIndex:0]]; //respetamos el orden
    [FORM_DIRECCION setText:[ESTRUC objectAtIndex:1]];
    [FORM_TELEFONO setText:[ESTRUC objectAtIndex:2]];
    }
    }

  2. Macgrafic says:

    El fichero datos.txt se tiene que crear o ya lo crea automaticamente si no existe!?

  3. pequenionoa says:

    Se crea si no existe.

    Saludos.

  4. Macgrafic says:

    Hola una pregunta, en el codigo de ejemplo:
    #import
    @class DATOSViewController;
    @interface DATOSAppDelegate : NSObject
    {
    IBOutlet UIWindow *window;
    IBOutlet id BOTON_SIGUIENTE;
    IBOutlet id BOTON_ANTERIOR;
    IBOutlet id BOTON_ANADIR;
    IBOutlet id BOTON_BORRAR;
    IBOutlet id FORM_NOMBRE;
    IBOutlet id FORM_DIRECCION;
    IBOutlet id FORM_TELEFONO;
    NSMutableArray *DATOS;
    NSString *NOMBRE;
    NSString *DIRECCION;
    NSString *TELEFONO;
    NSUInteger INDICE;
    NSUInteger NUMERO_ELEMENTOS;
    }
    @property (nonatomic, retain) UIWindow *window;
    - (IBAction) PULSAR_BOTON_SIGUIENTE: (id) sender;
    - (IBAction) PULSAR_BOTON_ANTERIOR: (id) sender;
    - (IBAction) PULSAR_BOTON_ANADIR: (id) sender;
    - (IBAction) PULSAR_BOTON_BORRAR: (id) sender;
    - (IBAction) CARGAR_DATOS: (NSUInteger) indice;
    @end

    Os habeis dejado de poner la clase a importar…
    ¿¿¿la clase tiene que ser, #import ????

  5. Macgrafic says:

    perdón por el comentario pero he puesto símbolos no admitidos… esta es la pregunta:

    “Os habeis dejado la clase a importar o no sale en el código. ¿tendría que ser la clase “UIKit/UIKit.h”????”
    Gracias

  6. pequenionoa says:

    Si, exactamente. Es un fallo. Gracias por corregirlo.

    Saludos.

  7. Macgrafic says:

    Gracias por estos magníficos tutoriales !!!
    Me ha ido perfecto ! Muchas gracias !

  8. Macgrafic says:

    Acabo de descubrir que, datos.txt, escribe en formato XML !! Esto amplia las posibilidades de cargar y compartir información ! Esto se esta poniendo calientito !! Gracias

  9. pepersview says:

    hola, tengo una duda, por que a mi no me crea el archivo?
    He probado con
    DATOS = [[NSMutableArray alloc] initWithContentsOfFile:@”./datos.txt”];

    pero tampoco:)

  10. pequenionoa says:

    [DATOS writeToFile:@"datos.txt" atomically:YES];

    con esto es con lo que se crea el archivo.

    saludos.

  11. pepersview says:

    Si, eso lo tengo en el metodo Añadir, pero no me creo el archivo, ese es mi problema, el código esta como el que hay aqui, por eso no se que puede pasar.

    Gracias!

  12. pepersview says:

    Tengo tb las asociaciones hechas:)

  13. pepersview says:

    Ok, ya lo he solucionado, muchas gracias por interesarte:) un saludo!!

  14. txam says:

    Lo siento x la pregunta pero es q soy muy novato. Hay q hacerle alguna asociación a CARGAR_DATOS?? No le he hecho ninguna asociación y se me para la aplicación en cuanto pulso anterior o siguiente.

  15. pequenionoa says:

    a CARGAR_DATOS, no hay que hacerle ninguna asociacion ya que no es un IBAction. Leete los comentarios que hay en el post, quizas sea lo de las comillas.

  16. falcon says:

    por que truena la aplicacion cuando borras el primer datos o rwgstro de datos?

  17. Carlos says:

    A mi me pasa igual que a pepersview… no crea el archivo ni graba absolutamente nada al darle a añadir… y creo que he seguido bien todos los pasos.

    ¿Alguien sabe que puede estar fallando?

  18. Carlos says:

    Arreglado, me faltaba asociar la AppDelegate al File’s owner… es una conexion que no entiendo pq hay que hacer, pero bueno, ha funcionado :P

  19. Carlos says:

    Otra preguntita, dónde habría que poner lo de “resignFirstResponder” para que al terminar de introducir cada campo, por ejemplo el nombre, si el usuario apreta “done”, se escondiera el teclado? Ahora sólo se me esconde al darle a añadir, pero una vez he empezado a escribir en un textfield no desaparece en ningun momento hasta darle al boton de añadir

  20. Carlos says:

    Se me ocurre crear un método por cada textfield para que cuando suceda el evento de darle al “done” (no recuerdo el nombre) se llame al método y éste tenga la orden resignfirstresponder dentro, pero estoy seguro de que tiene que haber una forma más sencilla..

  21. Pedro says:

    Hola, me sucede algo muy extraño coloque un NSLog para ver el valor de INDICE cada vez que avanzamos o retrocedemos y lo que puedo ver es que el valor en vez de añadir o restar 1 lo hace con 4, es decir empezamos con INDICE = 0, al presionar siguiente se ejecuta esta linea INDICE = INDICE+1 lo cual se sobre entiende que el nuevo valor de INDICE debería ser 1 pero por alguna extraña razón el nuevo valor es 4. Alguien tiene idea de que esta sucediendo ahí? Muchas gracias de antemano por la ayuda.

  22. Miguel Perez says:

    Este programa no me corre, me pone la pantalla en negro, no sale ni nada, alguien puede ayudarme con esto….. gracias

  23. SALVA says:

    Hola, Tengo un problema a la hora de ejecutar el programa. He seguido todos los pasos, he hecho todas las asociaciones etc….
    Me crea el archivo datos.txt:

    pepe
    gran via
    655555555

    El problema esta cuando le doy a anterior o a siguiente, “NO HACE NADA” :( y el problema GORDO esta cuando le doy a borrar, “PETA!”

    Alguien sabe que puede estar pasando….??
    Gracias de antemano!

  24. SALVA says:

    Problema Solucionado!
    Hay un pequeño error desde mi punto de vista que me gustaria corregir.

    En el ACTION de BORRAR, si borras cuando el INDICE es 0 peta!

    - (IBAction) PULSAR_BOTON_BORRAR: (id) sender
    {
    [DATOS removeObjectAtIndex:INDICE];
    NUMERO_ELEMENTOS = NUMERO_ELEMENTOS – 1;
    if(INDICE == 0)
    {//no hacer nada
    }
    else
    {
    INDICE = INDICE – 1;
    }

    [DATOS writeToFile:@"datos.txt" atomically:YES];
    [self CARGAR_DATOS:INDICE];
    }

  25. ANgel says:

    Una duda donde se supone que crea el archivo datos.txt??? al ejecutarlo con el emulador una vez q se cierra…se vuelve a borrar???esq me da un fallo el programa y necesito saber eso xa encontrarlo

  26. pequenionoa says:

    En el simulador no debería borrarse. Si no recuerdo mal se guarda en la raiz de tu Disco Duro o de tu usuario.
    En el terminal, (iphone o ipod touch) es normal que se borre, porque se guardará como temporal. En el foro hay información para conseguir que no se borre. Es cambiando el path de donde se guarda.

    Saludos.

  27. lisergio says:

    muy buenas..
    estoy un poco atascado…

    no me crea el fichero datos.txt …

    pero haciendo el debug paso a paso… resulta que en el paso anterior al que se escribe el archivo

    [DATOS addObject:ESTRUC];

    los datos que hay en ESTRUC (que según el debug, tengo 3 objetos (nombre,dirección y teléfono)
    no se pasan al array DATOS, por lo que imagino que si no hay ningún dato en el array no crea el archivo.

    ¿alguna idea? no me da ningún error y creo que tengo todo bien relacionado.

  28. Anonymous says:

    Creo que lo he solucionado…

    En las primeras lineas de código de appdelegate.m pone:

    //Cargamos los datos del fichero.
    DATOS = [[NSMutableArray alloc] initWithContentsOfFile:@”datos.txt”];
    // DATOS = [[NSMutableArray alloc] init]; Asi se inicializaria normal.

    pues si el archivo datos.txt no existe al iniciar el array con
    DATOS = [[NSMutableArray alloc] initWithContentsOfFile:@”datos.txt”];
    no inicia el array, por lo que no puedo darle el valor de ESTRUC.

    entonces he añadido lo siguiente

    DATOS = [[NSMutableArray alloc] initWithContentsOfFile:@”datos.txt”];
    if (DATOS == nill)
    {
    DATOS = [[NSMutableArray alloc] init];
    }

    asi en caso de no tener ningún dato o no existir el fichero datos.txt inicializa de forma normal, y así si deja introducirle datos desde ESTRUC.

  29. fpiquer says:

    Puedes indicarme el path para que no se borrre ¿?

  30. sniper says:

    Hola. Soy nuevo en esto. Estoy intentando probar este ejemplo pero no hay manera de que funcione. Cuando pulso añadir el programa se peta. Alguien lo ha exo funcionar? me podriais pasar el codigo para ver que hago mal.

  31. Nicolas says:

    la verdad es que yo tambien tengo problemas con el path, no se como hacer para que en el terminal no se borre, alguna recomendacion?

  32. Patricia says:

    Hola a todos!
    os recordamos que tenéis a vuestra disposición un foro donde podéis plantear las dudas que tengáis:

    http://www.iphonesoftware.es/foro/

    Gracias!

Leave a Reply

  • 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!