Niedlichen Kerl Isst Behaarte Und Versaute Muschi Von Alten Platten Schlampe, Tinker Bell Porn, Jodi West Porno, Teen 69 Porn, Xhamsterdeutschbiz, Porn Jungfrau, Arrogante Zicke Erweist Freundschaftsdienst Mit Blowjob, Wuenschenswert Bruenette Hacke Stefani Bekommt Knallte In Dreier, Kathleen White Pornos, Porno Gratis Filme, Studentin Braucht Geld, Rothaarigemollig Schlampe Kurvige Quinn, Ehefrauen Bumsen, Erotischebilder, Hd Filme Porn, Free Bi Porn, Remy Lacroix Com, Conny Dachs Fickt Die Sekretaerin, Rewe Magirusstrasse Ulm, Heisse Latina Brunette Karmen Santana Ist So In Das Reiten Steifen Schwanz, Zwerg Porn, Nymphe Porn, Anal Sexcom, Wie Macht Man Ein Kondom Drauf, Geile Lesben Teens, Public Disgrace Pornos, Pinkelnde Frauen Video, Sexvidio, Wicked Pictures Porn, Homemade Amateur Porn, Wecken Blonde Katie Kay Finger Getrimmt Muschi, Mature Handjobs, Ggg Hanna, Forbondage German Lady Mia De Berg Experience Bondage Fun With A Kinky Sexual Master, Deutsche Hausfrau Und Mutter Fickt Mit Liebhaber Im Freien, Klein Titten Schlampe Aus Deutschland Durch Genagelt, Porno Film Frei, Frauen Ficken Mit Dildo, X Hamster Alt, Devote Oma Mit Dickem Titten Fleisch Gefickt, Frauen Beim Sex Kostenlos, Meine Freundin Ficken, Lucy Cat Kostenlos, Ficken Ohne Ende, Frau Nackt Porno, Die Vollbusige Blonde Schoenheit Chloe Foster Fuehlt Sich Gut Wenn Sie Schlampige Fette Bbc Faehrt, Sexy Zeichentrick, Val Dodds, Teacher Stockings, Suche Sex Chat, Votzen Filme, Klassenfahrt Sex Tube, Teresa Olowski Porno, Stars Nackt Free, Comic Porn Movies, Pornqueen, Spang Bang, Lederladys, Deutsche Pornos Online, Inzest Tube Porn, Sex Treffen In Siegen, Nagie Nastki, Mydurtyhobby, Deutsches Babe Wird Geil Gefickt Und Schlucktexcl, Fkk Sex Strand, Porno Hd Jung, Harley Quinn Anal, Gayteen Com, Two Shy Girls Want To Masturbate Togetherexcl, Nakte Frauen Zeigen Sich, Deutsche Sexszenen, Freiluft Fick In Der Kiesgrube Beim Amateur Casting, V Sex Tube, Nackte Frauen Heimlich Gefilmt, Getragene Damenwaesche, Omas Fallen Ueber Seinen Schwanz Her, Privat Haus Sex, Beim Ficken Telefonieren, Die Beliebtesten Videos Von Tag Vergewaltigt, Pornhubhu, Ao Sex Frankfurt, Porno Kostenlos Teen, Die Blonde Fittnessschlampe Wird Gefickt Und Vollgespritzt, Bondage Gangbang Porn, Porno Sex Film Tube, Exklusiv Porno, Reife Deutsche Milf Beim Usertreff Durchgefickt, Heisser Analsex Mit Karina Grand, Huebsche Thai, Pussy Von Hinten, Nackt Unterricht, Deutsch Schwanger Porno, Rothaarige Schoenheit Mit Faszinierenden Formen Bekommt Eine Wunderbare Erotische Massage, Naughty Amarica, Laengste Videos Nach Tag Oma Doggystyle, Hart Fiken, Erste Mal Im Swingerclub, Fistingporn, Sie Sucht Ihn Erotik Bielefeld, Webcam Luder Fickt Ihre Extrem Behaarte Fotze, Skinny German Brunette Sucking And Fucking A Big Cock Outside, Lucy Catporn, Hodenmassage, Bisexual Foursome, Blondie Fesser, Bbw Sm, Paare Am Fkk Strand, Natalydeville, Amateur Deutsch Anal, Zur Hure Abgerichtet, Tree Porn, Rita Massage Room, Erotic Filimler, Bbw Step Mperiod, Oma Hairy, Big George Fickt Im Porno Deutsch Die Ostblock Putze Durch, Mein Feutzchen, Nackt Twister, Schlankes Teen Liebt Zu Tun Anal, Vanilla X Der Film, Omapornofilme, Owl Sexkontakte, Blonde Stiefelschlampe Beim Kuechenfick, Er Sucht Ihn Markt De Erotik, Schwabelige Hausfrau Wird Im Badezimmer Gefickt, Massage Essen Erotik, Haarige Moesen Porno, Sisterporno, Teen Throat Fuck, Top Bewertete Videos Von Tag Junges Paar, Laengste Videos Nach Tag Deutscher Inzest Porno, Mydirtyhobby Amateur Chubby Redhead Dirtytalks And Teases Her Man Into Cuming On Her Pussy, Amateur Sex Treffen, Melanie73 Dessau, Zeichentrickpornos, Tumblr Fick, Versaute Comic, Ballbusting Handjob, Ebony Sex Tube, Mit Jungschwanz Poppt Die Reife Deutsche Dirty Tina, In High Heels Ficken, Janine Pink Porno, Bamberg Huren, Muschi Gepierct, Sex Mit Omis, Swinger Bumsen, Milf Latex, Uralte Moesen, Brueste Grapschen, Cam To Cam Sex Chat Kostenlos, Foxy Di Hd, Wassermann Frau Im Bett, Westernporno, Playboy De, Cameltoe Teen, Slim Milf Enjoys Piledriver 69 And A Good Fuck Until He Busts A Nut In Her Mouthexcl, Fickpuppe, Sex Cam Chatrolette, Pornos Junge Frauen, Grosse Sex Tube, Ao Braunschweig, Solarium Squirt, Swingerclub In Malsch, Milf Over 40, Porno Lizanie Cipki, Anime Hot Porn, Sex In Pirmasens, Herrliche Transen Aus Thailand Emma In Sinnlichen Schwanz Solo Zucken, Sexy Studentin Fickt Mit Ihrem Freund Auf Weihnachtsfeier, Erotik Vechta, Live Cam Sex Gratis, German Skinny Girl Heftig Im Bad In Den Arsch Gefickt, Free Born Sex Tube, Sex Download Hd, Big Coock Porn, Japan Porm, Nami Xxx, Deutsche Privatschlampe In Den Arsch Gepoppt, Gruppe Sex Orgie Mit Kelly Taylor Und Chance Caldwell, Gewalt Sex Videos, Frauenorgasmus Porno, Geile Wichsanleitungen, Selfie Erotik, Porno Movie Free, Junge Paare Haben Sex, Tina Cheri, Deutsche Porno Lara Bergmann Auf Dem Audi Gefickt, Die Sinnliche Rothaarige Tracy Reitet Einen Harten Schwanz Fuer Ihren Gefaehrten, Junge Amateur Bruenette Von Mega Schwanz Ins Arschloch Gefickt, Spanische Porno, German Blonde Mature Anal And Creampie, Sex Mit Reifen Frauen, Porn Cum Compilation, Mia Khalifa First Porn, Reingewichst, Arschficken Und Pissen, Freeporn Hub, Chloe Skyy, Foze Lecken, Kostenfreie Fickfilme, Marilyn Porn, Ficken In Muschi, Celler Ladies, Sex In Highheels, Hot German Milf Sira Yvonne, Filmiki 18, Milf Se, X Sex Tube, Fick Meine Frau Porn, Reife Frau Lecken, Heutepornp, Sex Schwarze, Mia Malkova Pool, Sex Mit Sportlehrerin, Junge Amateur Schlampe Wird Bei Sexparty Von Vielen Maennern Besamt, Perfektgirlsnet, Porno Ru Tv, Porno Strapse, Phoenix Maries, Mollige Girlfriend Schlampe Im Privat Porno Deutsch Gefickt, Pissschlampe, Wie Die Eigene Mutter Ficken Reales Sexdate Auf Video Festgehalten, Rottweil Bordell, Pornob, Katy Annxo, Anal Brazzers, Anal Sex Hd, Www Porno Filme De, Blonde Junge Maedchen Ist Ein Fan Von Grossen Schwanz Und Anal Sex, Sex X Tube, Harter Sm Porno, Flittchen Natascha Beim Gangbang Brutal Durch Gefickt, Mature Nl Solo, Atemberaubende Asa Akira Zeug Muschi Mit Vibrator, Tantra Massage Paderborn, Parkplatz Treff De, Nackte Tattoo Girls, Sex In Der Dusche Porno, Hobby Huren Bremerhaven, Ehefrau Zusehen, Blowjob Surprise, Der Penis Voll Mit Urin Wird Geblasen, 50 Porno, Free Transe, Specksau Mit Brille Laesst Sich Von Jungem Nerd Typen Knallen, Suche Nach Tag Mareen Deluxe, Trailer Porno, Kostenfrei Ficken, Devote Oma, Porn De, Brunette Patricia Petite Bekommt Ein Dp Mmf Flotter Dreier, Top Bewertete Videos Von Tag Susanna De Garcia, Blonde Schlampe Nina Elle Bekommt Ihr Schlitz Leckte Und Knallte, Epxv1369, Sport Muschis, Best Real Sex Tube, Schoene Maedchen Melissa Moore Hat Sich Ein Maedchen Suchen Wie Sie Lesbischen Sex, Verfickte Nachbarin, Free Free Porn, Son Sex Tube, The White Boxxx Porn, Mydirtyhobby German Amateur Chubby Babe Proposes That Her Boyfriends Best Friends Fucks Her Outsid, Fussballerinnen Nackt, Saftige Muschis, Boots Anal, Erotico Italiano, Tuerkische Porno Darstellerin, Fickstory, Parkplatz Erotik, Willige Deutsche Alt Saeue Im Geilen Sex Trieb, Free Squirt Porn, Cuckold Creampie Porn, Opa Fick Enkelin, Gruppensex Im Swingerclub, Schlanke 18 Jahre Junge Nachbarin Beim Privaten Ficken Aufgenommen, Lonnie Waters, Krystal Boyd Video, Familienbumsen, Femdom Sperma, Ausschnitt Porn, Geile Deutsche Weiber Ficken, Kv Lady Berlin, Die Beliebtesten Videos Von Tag Omas Ficken, You Porn Free Videos, Titten Spanner, Xhamster Verfuehrung, Porn300 Anal, Omas Meuse, Strapsmaeuse, Porno Mit Hausfrau, Paerchentausch Pornos, Er Wird Gefickt, Latexklamotten, Mastubartion, Free Sexcom, Missionar Sex Tube, Italien Inzest Porn, Jada Stevens Xxx, Kinki Sex Tube, Escort Damen In Duesseldorf, Sinnliche Bruenette Chloe Carter Hart Gefickt Auf Pov Kamera, Schlanke Blonde Und Bruenette Lesben Sind Beschaeftigt Mit Ihren Sinnlichen Masturbation, Moms Teaching Teens, Filme Oorno, Hd Stream Porn, Frauen Die Gemolken Werden, Sex Prono Free, Mutter Erwischt Sohn Beim Wichsen Porn, Hotelsex, Fick Auf Dem Kuechentisch, Best Hentai Blowjob, Maedchen Fingert Sich, Nackten Frauen, Lebensmittelkontrolleurin Wird Mit Ficksahne Bezahlt, Free Piss Sex, Bonnie Rotten Veronica Avluv, Die Beliebtesten Videos Von Tag Oma Fickt Enkel, Junge Schlampe Mit Mega Eutern Gepoppt, Sis Loves, Mit Was Trinkt Man Malibu, Fotze Englisch, Deutsche Pornos De, Pornto, Laengste Videos Nach Tag Woodman Casting, Pornos Italia, Lana Ivans Schoen Durch Gepoppt, Marsha May Pornos, Grosse Kitzler Kostenlos, Kacken Tube, Porn Night, Dirty Tina Voegelt In Ihrer Wohnung Mit Ihrem Stecher, Heisse Milf Vom Jugendlichen Lover Gefickt, Porno Filmovi, Auf Arbeit Gefickt, Nurxxc, Leetizia Videos, Deutsche Hausfrau Laesst Sich Von Asylant Ficken, Suche Nach Tag Harter Grannie Sex, Gianna Dior Porno, Ohne Slip Tennis Spielen, Stark Behaarte Reife Frauen, Spider Man Porn, Latina Milfs, Nackt Arbeiten, Porno Schwarzhaarige, Suche Nach Tag Omaporno Gratis, Old Mature Hd, Sex In Brandenburg Havel, Nutten Homburg, Porno Alexis Texas, Free Geile Pornos, Free Tube 8, Deutsche Mutter Fotzen Beim Willigen Sex, Hardcore Die Blonde Deutsche Von Hinten Genagelt, Private Porn Vids, Teen Porn Doggy, Gay Gratis Porno, Teen Bound Porn, Jessyca Wilson Porno, Vintage Porno Videos, Pipi Porno, Momsbangteens Porno, Hot Granny Fuck, Pornobilder Gay, Alte Geile Oma, Mega Tit, Gay Masturbation Videos, Vagena Massage, Erotik Date, Aalen Bordell, Sarah Star Gibt Einen Blowjob Auf Dem Tretboot, Teen Cam Sex Video, Xxx Paare, Deutschsprachige Pornos Gratis, Mutter Zeigt Tochter Das Ficken, Porno Mutter Dusche, Raven Redmond Pornos Sexfilme Kostenlos Frauporno, Geile Nackte Bitch, Horrorporn Free, Bruenette Sexy, Carmen Herzog Macht Willig Die Beine Breit, Katerina Kay Pornos Sexfilme Kostenlos Frauporno, Besamte Vagina, Vom Handwerker Gefickt, Milf Fickt Jungen, Top Bewertete Videos Von Tag Vergewaltigung Porno, Sex Markt Wuppertal, Voyeur Locker Room, Oma Kathleen Violet Will Ihr Alter Nachbar, Swinger Plauen, Alter Omasex, Mmv Films Are You Feeling Lucky, Lesbische Pissspiele, Teen Nackte, Penisabdruck Selber Machen, Deutsche Fickparty, Vater Bumst Tochter Porno, Blonde Girl Porn, Fitness Maus Von Mydirtyhobby Fickt Im Badezimmer, Ava Rose Porno, Inzest Vater Und Tochter, Quoka Leipzig Erotik, Erotik Von Frauen Fuer Frauen, Parkplatz Sex Owl, German Long Porn, Sex Clips, Deutsche Molli Mutter Vom Stiefsohne Durch Gefickt, Kelsey Michaels, Ava Taylor Pov, Suche Nach Tag Omaporno, Joy Babescom, Pornos Mit Geschichte, Laengste Videos Nach Tag Sex Mit Urin, Freeporn Filme, Masturbating Together, Lisa Ann New Videos, Erotikum De Weimar, Sie Sucht Ihn Erotik Paderborn, Harry Potter Ficken, Geile Nutte Wird Gefickt, Lesbian Punishment Porn, Geile Swinger Party, Tiger Benson, Pornoszenen, Hatefuck Porn Como criar um CRUD com Ionic e Firebase - Em alguns simples passos - Fábrica de Código

Fábrica de Código

Nessa vídeo aula eu mostro como criar um CRUD (CRUD significa, em inglês, Create, Read, Update e Delete e em português é Incluir, Alterar, Excluir e Consultar) com Ionic e Firebase Realtime Database usando a nova versão do AngularFire2 (5.0.0). 

Mostro também diferentes maneiras de salvar um objeto e de fazer algumas queries simples.

 

Esse tutorial está utilizando as seguintes versões das dependências:

  • Ionic: 3.18.0
  • AngularFirebase2: 5.0.0-rc.3
  • Firebase: 4.6.2

 

O que é o Firebase Realtime database

O Firebase Realtime Database é um banco de dados NoSQL hospedado na nuvem. Com ele, você armazena e sincroniza dados entre os seus usuários em tempo real.

Para saber mais você pode acessar diretamente a página do Firebase clicando aqui.

 

Criando uma aplicação de exemplo

Será criado uma aplicação para castro de contato com nome e telefone.

O passo a passo abaixo é o mesmo mostrado no vídeo.

  • Passo 1: Criar o aplicativo.
  • Passo 2: Instalar as dependências (AngularFire2 e Firebase).
  • Passo 3: Criar o provider para fazer o CRUD de contatos.
  • Passo 4: Ajustar a pagina home para exibir os contatos cadastrados.
  • Passo 5: Criar a pagina para inclusão/alteração de contatos.

 

Passo 1: Criar o aplicativo

ionic start NOME_DO_APP blank

Criar o provider e as páginas

ionic g provider contact
ionic g page contact-edit

 

Passo 2: Instalar as dependências (AngularFire2 e Firebase)

npm install firebase angularfire2 --save

Arquivo no app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';

import { AngularFireModule } from 'angularfire2';
import { AngularFireDatabaseModule } from 'angularfire2/database';

import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { ContactProvider } from '../providers/contact/contact';

@NgModule({
  declarations: [
    MyApp,
    HomePage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    AngularFireModule.initializeApp({
      apiKey: "SEU API KEY",
      authDomain: "SEU AUTH DOMAIN",
      databaseURL: "SUA DATABASE URL",
      projectId: "SEU PROJECT ID",
      storageBucket: "SEU STORAGE BUCKET",
      messagingSenderId: "SEU MESSAGING SENDER ID"
    }),
    AngularFireDatabaseModule
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    ContactProvider
  ]
})
export class AppModule {}

 

Passo 3: Criar o provider para fazer o CRUD de contatos

Arquivo providers/contact/contact.ts

import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';

@Injectable()
export class ContactProvider {
  private PATH = 'contacts/';

  constructor(private db: AngularFireDatabase) {
  }

  getAll() {
    return this.db.list(this.PATH, ref => ref.orderByChild('name'))
      .snapshotChanges()
      .map(changes => {
        return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
      })
  }

  get(key: string) {
    return this.db.object(this.PATH + key).snapshotChanges()
      .map(c => {
        return { key: c.key, ...c.payload.val() };
      });
  }

  save(contact: any) {
    return new Promise((resolve, reject) => {
      if (contact.key) {
        this.db.list(this.PATH)
          .update(contact.key, { name: contact.name, tel: contact.tel })
          .then(() => resolve())
          .catch((e) => reject(e));
      } else {
        this.db.list(this.PATH)
          .push({ name: contact.name, tel: contact.tel })
          .then(() => resolve());
      }
    })
  }

  remove(key: string) {
    return this.db.list(this.PATH).remove(key);
  }
}

 

Salvando objetos

Abaixo vou explicar 2 maneiras diferente para salvar um objeto:

1 – Usando a lista: 

this.db.list('CAMINHO')
  .update(contact.key, { name: contact.name, tel: contact.tel })
  .then(() => resolve())
  .catch((e) => reject(e));

Observe que no exemplo acima, no método “update” é necessário passar a chave do objeto que será atualizado.

 

2 – Usando o objeto:

this.db.object('CAMINHO' + contact.key)
  .update({ name: contact.name, tel: contact.tel })
  .then(() => resolve())
  .catch((e) => reject(e));

Observe que no exemplo acima, no método “update” eu não preciso da key do objeto pois ela é usada para compor o caminho até no objeto

 

3 – Diferença entre set e update

Nos dois exemplos acima é possível utilizar o método “set” no lugar do “update”, a grande diferença entre os dois é:

  • Set: Substitui o objeto inteiro no servidor pelo valor enviado.
  • Update: Substitui apenas os valores que estão sendo enviados.

 

Passo 4: Ajustar a pagina home para exibir os contatos cadastrados

Arquivo home.ts

import { ContactProvider } from './../../providers/contact/contact';
import { Component } from '@angular/core';
import { NavController, ToastController } from 'ionic-angular';
import { Observable } from 'rxjs/Observable';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {
  contacts: Observable<any>;

  constructor(public navCtrl: NavController, private provider: ContactProvider,
    private toast: ToastController) {

    this.contacts = this.provider.getAll();
  }

  newContact() {
    this.navCtrl.push('ContactEditPage');
  }

  editContact(contact: any) {
    // Maneira 1
    this.navCtrl.push('ContactEditPage', { contact: contact });

    // Maneira 2
    // this.navCtrl.push('ContactEditPage', { key: contact.key });
  }

  removeContact(key: string) {
    if (key) {
      this.provider.remove(key)
        .then(() => {
          this.toast.create({ message: 'Contato removido sucesso.', duration: 3000 }).present();
        })
        .catch(() => {
          this.toast.create({ message: 'Erro ao remover o contato.', duration: 3000 }).present();
        });
    }
  }
}

 

Arquivo home.html

<ion-header>
  <ion-navbar color="primary">
    <ion-title>
      Contatos
    </ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>

  <ion-list>
    <ion-item-sliding *ngFor="let contact of contacts | async">
      <ion-item>
        <h1>{{ contact.name }}</h1>
        <p>{{ contact.tel }}</p>
      </ion-item>
      <ion-item-options side="left">
        <button ion-button color="secondary" (click)="editContact(contact)">
          <ion-icon name="create"></ion-icon>
        </button>
        <button ion-button color="danger" (click)="removeContact(contact.key)">
          <ion-icon name="trash"></ion-icon>
        </button>
      </ion-item-options>
    </ion-item-sliding>
  </ion-list>

  <ion-fab bottom right>
    <button ion-fab color="primary" (click)="newContact()">
      <ion-icon name="add"></ion-icon>
    </button>
  </ion-fab>
</ion-content>

 

Passo 5: Criar a pagina para inclusão/alteração de contatos

Arquivo contact-edit.ts

import { ContactProvider } from './../../providers/contact/contact';
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ToastController } from 'ionic-angular';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

@IonicPage()
@Component({
  selector: 'page-contact-edit',
  templateUrl: 'contact-edit.html',
})
export class ContactEditPage {
  title: string;
  form: FormGroup;
  contact: any;

  constructor(
    public navCtrl: NavController, public navParams: NavParams,
    private formBuilder: FormBuilder, private provider: ContactProvider,
    private toast: ToastController) {

    // maneira 1
    this.contact = this.navParams.data.contact || { };
    this.createForm();

    // // maneira 2
    // this.contact = { };
    // this.createForm();

    // if (this.navParams.data.key) {
    //   const subscribe = this.provider.get(this.navParams.data.key).subscribe((c: any) => {
    //     subscribe.unsubscribe();

    //     this.contact = c;
    //     this.createForm();
    //   })
    // }

    this.setupPageTitle();
  }

  private setupPageTitle() {
    this.title = this.navParams.data.contact ? 'Alterando contato' : 'Novo contato';
  }

  createForm() {
    this.form = this.formBuilder.group({
      key: [this.contact.key],
      name: [this.contact.name, Validators.required],
      tel: [this.contact.tel, Validators.required],
    });
  }

  onSubmit() {
    if (this.form.valid) {
      this.provider.save(this.form.value)
        .then(() => {
          this.toast.create({ message: 'Contato salvo com sucesso.', duration: 3000 }).present();
          this.navCtrl.pop();
        })
        .catch((e) => {
          this.toast.create({ message: 'Erro ao salvar o contato.', duration: 3000 }).present();
          console.error(e);
        })
    }
  }
}

 

Arquivo contact-edit.html

<ion-header>
  <ion-navbar color="primary">
    <ion-title>{{ title }}</ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <form [formGroup]="form">
    <ion-item>
      <ion-label stacked>Nome</ion-label>
      <ion-input type="text" formControlName="name"></ion-input>
    </ion-item>
    <ion-item *ngIf="!form.controls.name.valid && (form.controls.name.dirty || form.controls.name.touched)" color="danger">
      <div [hidden]="!form.controls.name.errors.required">
        O campo é obrigatório
      </div>
    </ion-item>

    <ion-item>
      <ion-label stacked>Telefone</ion-label>
      <ion-input type="tel" formControlName="tel"></ion-input>
    </ion-item>
    <ion-item *ngIf="!form.controls.tel.valid && (form.controls.tel.dirty || form.controls.tel.touched)" color="danger">
      <div [hidden]="!form.controls.tel.errors.required">
        O campo é obrigatório
      </div>
    </ion-item>

    <div padding>
      <button ion-button block type="submit" [disabled]="!form.valid" (click)="onSubmit()">Salvar</button>
    </div>
  </form>
</ion-content>

 

Clique no botão abaixo para ver o código fonte gerado nessa aula

 

[button style=”btn-primary btn-lg” type=”link” target=”true” title=”Código fonte gerado na aula” link=”https://github.com/fabricadecodigo/ionicfirebasecrud” linkrel=””]

 

Quer aprender mais?

Clique no botão abaixo para aprender a criar uma aplicação de delivery com Ionic, Angular e Firebase.

Quer ver como ficou a aplicação? Clicando no botão abaixo, você vai poder ver um video onde eu mostro uma demonstração da aplicação criada e tudo o que você vai aprender no curso.

[button style=”btn-danger btn-lg” type=”link” target=”true” title=”Quero saber mais” link=”https://www.fabricadecodigo.com/ionic-e-firebase/oferta/?utm_source=site&utm_medium=botao-post&utm_campaign=cursoionicfirebase” linkrel=””]

 

Referências

 

Gostou desse artigo? Aproveite e curta e compartilhe para que mais pessoas possam também visualiza-lo!

Ainda ficou alguma dúvida ou tem alguma sugestão? Deixa aí nos comentários!

Respostas de 38

  1. Bom dia! Como eu faço para o Usuário A enxergar apenas o que ele cadastrou, e o usuário B enxergar apenas o que ele cadastrou também? Preciso deixar os dados privados por usuário.

  2. Fala Lucas, você pode fazer isso de 2 maneiras:

    Maneira 1:

    O id do usuário ser uma propriedade do que vc está salvando e depois vc filtra por id do usuario

    //Salva
    let data = {
    uid: this.auth.auth.currentUser.uid,
    description: ‘descrição’
    };

    this.db.list(‘caminho’).push(data);

    //E depois filtra
    this.db.list(‘caminho’, ref => ref.orderByChild(‘uid’).equalTo(this.auth.auth.currentUser.uid)).snapshotChanges();

    Maneira 2:

    O id do usuario ser parte do caminho para savar

    //Salva
    let data = {
    description: ‘descrição’
    };

    this.db.list(‘caminho’ + this.auth.auth.currentUser.uid).push(data);

    //E não precisa de filtro
    this.db.list(‘caminho’ + this.auth.auth.currentUser.uid).snapshotChanges();

    Valeu!

  3. Felipe, essas suas instruções só funciona em Ionic 3 ou em 2 também?

  4. Boa noite Felipe, como vai?

    Gostaria de saber se é possivel mudar a ordem do getAll() para que o último contato inserido seja exibido no topo da listagem?

    Valeu!

  5. Ola Felipe, boa tarde.

    Me ajude, por favor:

    Na minha pagina que corresponde a sua Home, estou tendo o seguinte erro:

    TypeError: this.provider.getAll is not a function

    Na pagina que efetua o cadastro esta dando erro de permissão:

    FIREBASE WARNING: set at /clientes/-L-D1w5BI7azuL137-_U failed: permission_denied
    core.js:1350 ERROR Error: Uncaught (in promise): Error: PERMISSION_DENIED:

    (aonde no seu codigo lê-se contacts e contact eu substitui por clientes e cliente)

  6. Boa tarde Felipe.

    Eu fiz tudo como voce mostrou, porém só estou conseguindo salvar e editar no banco Firebase se eu colocar o acesso como publico “read:true, write:true” .

    Do metodo original que necessita autenticação esta dando erro de PERMISSÃO.

    O que pode ser?

  7. Depois que eu coloquei true para os dois apertei publicar.
    Mas no modo padrao de autenticação dá o erro

  8. Uma duvida diferente:

    Voce teria algum conteudo, seu ou de terceiro que mostre os caminhos para
    – Relacionar “tabelas” do firebase com “chave estrangeira”
    – Salvar imagens originadas do plugin da camera no firebase ligando à “alguma tabela”

  9. De fato sem colocar isso só vai funcionar se você implementar algum tipo de autenticação com o Firebase.
    Isso é apenas para segurança dos dados.
    Entendeu?

    Tenho alguns videos mostrando como criar autenticação dom o Firebase, depois da uma olhada!

    Valeu!

  10. Então, o banco de dados do Firebase é NoSQL, ou seja, não tem tabela, não tem relacionamento, não tem nada que um banco de dados relacional tem.
    É justamente para ele ser mais rápido nas consultas, então a grande sacada é salvar os dados do jeito que você quer consultar depois.

    E sobre salvar imagens, o Firebase tem o Storage. Eu tenho um vídeo mostrando como salvar imagens lá: http://www.fabricadecodigo.com/como-salvar-imagens-no-firebase-storage-com-ionic-2/

    É com um plugin de galeria em vez de ser com a câmera, mas no fim a ideia é a mesma.

    Valeu!

  11. Boa noite Felipe.

    Sabe me dizer como posso retornar a key do contato inserido no banco (método save … novo contato) para o método onSubmit()?

    Obrigado.
    Abraço.

  12. Fala Guilherme

    Logo depois de fazer o push você pode implementar o then, no then você consegue pegar o Id gerado do objeto.

    this.db.list(‘Caminho’).push({ nome: ‘teste’ }).then(result => {
    //aqui você consegue pegar o Id com o result
    let Id = result.key
    });

    Valeu!

  13. Boa tarde Felipe, tudo bem?

    Estou tentando detalhar informações de um item exibido na lista em uma nova pagina, como se fosse detalhar os dados daquele contato, exibindo todas as informaçoes.

    *ngFor=”let cliente of clientes | async; let i= index” (click)=”goToDetalhes(cliente, i)”

    Estou pegando a index assim, mas nao estou conseguindo carregar ela na pagina de detalhes, pode me ajudar?

  14. Na realidade eu nao sei se existe um modo mais facil ou melhor para fazer. O index eu utilizei no ionic 1 entao pensei que seria necessario agora.

  15. Você precisa do index se for identificar algum item em uma coleção.
    Mas você já está com item no ngFor “let cliente of clientes”
    O “cliente” já seria o suficiente.

    Para passar ele como parâmetro para outra tela é só seguir o que foi feito nesse vídeo. Mas em vez da tela ser um cadastro, como é feito nesse vídeo, você pode fazer qualquer outro tipo de tela.

  16. Boa noite Felipe. Tudo joia?

    Consegui retornar o ID, muito obrigado. Agora estou com um cenário diferente e gostaria de saber se voce poderia me ajudar.

    Então, quando o usuário se cadastra é criado uma tabela de users com os dados dele (Nome, sobrenome, telefone, email) posteriormente quando este usuário adicionar um contato vai ser criado uma coleção de Contatos dentro do registro dele ficando assim:

    users
    + KEY de Identificação
    nome: “Guilherme”
    sobrenome: “G”
    telefone: “999999999”
    email: “teste@teste.com.br”
    + contatos:
    + KEY de identificação
    id: “ID recuperado no momento em que o contato foi salvo pelo usuário”

    Porém, não estou conseguindo listar os contatos conforme a lista de contatos que o usuário tem cadastrado.

    Tem ideia de como posso fazer isso? Ou se devo fazer em uma estrutura diferente?

    Desde ja te agradeço.

    Valeu.

  17. Felipe, então o Firebase automaticamente já guarda os dados localmente (ou seja, estarão disponíveis pro usuários mesmo sem internet) e gerencia a persistência?

  18. Não consegui pegar os dados de cada usuário logado, o que preciso fazer?

  19. Uma outra dúvida Felipe, é que as vezes, quando recarrega, dá erro por ele não encontrar o id do usuário, como faço pra evitar este erro na lista de dados que carrego na home? Um abraço!

  20. Fala Daniel,
    Existe um delay até que o “currentUser” seja populado e você consiga usar.
    Talvez nessa primeira tela seja necessário mudar a abordagem de como você carrega os dados.
    Ex.: Antes de usar o “currentUser” na home, implemente o authState.subscribe(). Esse metodo é responsável por detectar o estado de contexão do usuario.

    afAuth.authState.subscribe(user => {
    if (user) {
    // nesse momento usuário está autenticado
    } else {
    // nesse momento não
    }
    });

    Valeu!

  21. Implementei a verificação de autenticação na home, na hora de chamar o getAll(). Muito obrigado por tudo! Funcionou perfeitamente!

  22. Eai Felipe, parabéns pelas videos aula, incrivel!
    Estou com um problema estava seguindo suas aulas desde as autenticações, porém vi essa nova atualização do AngularFire2, como faço para ele separar o resultado para cada usuário?

  23. Fala Itamar, blz?
    Obrigado pelo feedback!
    Duvida: pode me explicar melhor essa parte de separar o resultado para cada usuário?
    Seria um usuário não pode ver o dado do outro?

    Valeu!

  24. Fala Itamar,

    Tem algumas maneira de se fazer isso.
    Alguns exemplos seriam:
    – Parte do caminho ser o id do usuário logado.
    Ex: “contatos/ID DO USUARIO”

    – Ter o id do usuário como uma propriedade do objeto que vai ser salvo
    Ex:
    {
    nome: “Fulano”,
    telefone: “3232-3232”,
    usuarioId: “ID DO USUARIO”
    }
    Nesse segundo exemplo você teria que fazer os filtros pelo Id do usuario logado e isso te impede de fazer outros filtros pois o Firebase Realtime Database só permite filtrar por um campo.

    Você precisa analisar o que você ta fazendo e qual será a melhor opção para você.

    Valeu!

  25. Olá, existe uma forma de manter o real-time database offline? Tenho um app que é essencial que os dados questão retornados do firebase fique disponível offline.

    Obrigado e parabéns pela iniciativa.

    Apenas recebe os dados e mantém offline o app não grava dados só recebe

  26. Fala Murilo, blz?
    Obrigado pelo feedback!
    Seguinte, o Firebase funciona offline somente com a SDK nativa para Android/iOS, a SDK para web (que é usada no Ionic) não funciona.

    No seu caso, aconselho a usar uma API REST para buscar os dados e o SQLite para armazenamento offline no dispositivo.

    Valeu!