Meu maior motivador em construir este repositório é meu desejo em compartilhar com vocês o que venho aprendendo sobre tudo isto. Este pequeno projeto, usando puro Dart, servirá também para alguns testes com back4app.com no que envolve database.
Este texto é um roteiro para os vídeos desta playlist ??. E com a ajuda de vocês vou acrescentando o que for necessário neste texto e atualizando nos vídeos.
Antes de começar talvez voĉe se pergunte. Porque back4app ? Ou ate mesmo. O que é back4app ?
Em rápidas palavras foi assim...
Ao iniciar meus estudos em Dart/Flutter fui logo para o Firebase. Então analisando melhor a documentação vi que o Firebase é openCredCard, ou seja, você cadastra seu cartão de crédito e se sua aplicação crescer, ou for atacado ou cometer um erro de loop o Firebase não quer saber. Vai te cobrar e pronto.
Ai buscando outras alternativas, meu grande amigo Paulo Roberto Cruz, me indicou esta solução completa para um backend que outrora foi iniciativa do Facebook mas agora esta nas boas mãos da comunidade.
E aqui estou eu. Após várias cabeçadas compartilhando com vocês o que aprendi. E espero ajudar alguns. E aceito ajuda de todos. Neste repo trato apenas de banco de dados os demais tópicos deixarei indicado meus repos de aprendizado no referido assunto.
No back4app.com encontramos:
- Autenticação
- Banco de dados
- Hospedagem
- Funções em nuvem
- E outras coisas...
Este conteúdo será compartilhado:
no tabnews https://www.tabnews.com.br/catalunha
na udemy: https://www.udemy.com/course/back4app-um-backend-completo-para-dartflutter-database/
E sobre tudo isto vamos conversando no chat do tabnews ou neste discord https://discord.com/channels/766282533292998691/766282694967296030
Este texto é melhor detalhado neste vídeo: https://youtu.be/btNzdAqjcHc
Você pode assiste aos vídeos do sumário nesta playlist
- Introdução
- Vídeo: https://youtu.be/btNzdAqjcHc
- Apresentação do projeto Dart/Flutter
- Vídeo: https://youtu.be/RM3gYIrJjrY
- Dart (ok)
- Flutter (em construção)
- As tabelas, seus campos, e suas relações.
- Vídeo: https://youtu.be/pkNyrW2Xg58
- Relações num DataBase b4a
- Tipos comuns em b4a
- json objects
- DateTime e UTC
- Criando o database no back4app.com
- Vídeo: https://youtu.be/SQ5sUlg8wgU
- Genre
- Author
- Shape
- Publisher
- Book
- Criando o app Dart e Conexão do app com a b4a
- Vídeo: https://youtu.be/IqQ2nke4Ot0
- app console dart
- Dados em Genre via App Dart
- Vídeo: https://youtu.be/joj68zuxlgE
- typeString
- typeBoolean
- typeNumber
- typeDateTime
- typeArray
- add
- addAll
- update
- unset
- delete
- removeAll
- typeNumberIncrement
- typeNumberDecrement
- typeArraySetAdd
- typeArraySetAddUnique
- typeArraySetAddAll
- typeArraySetAddAllUnique
- typeArraySetRemove
- typeArraySetRemoveAll
- lib/data/b4a/tables/genre/genre_repository.dart
- lib/core/models/genre_model.dart
- lib/data/b4a/entity/genre_entity.dart
- lib/app/presentation/genre/genre_page.dart
- lib/app/presentation/genre/genre_view.dart
- lib/app/presentation/genre/genre_controller.dart
- Buscas em Genre via App Dart
- Vídeo: https://youtu.be/n52yn52uavQ
- count
- getObject
- getAll
- queryBuilder
- queryBuilder_OrderByAscending
- queryBuilder_OrderByDescending
- queryBuilder_ExcludeKeys
- queryBuilder_KeysToReturn
- queryBuilder_Pagination
- queryBuilder_WhereEqualToSimpleColumn
- queryBuilder_WhereNotEqualToSimpleColumn
- queryBuilder_WhereGreaterThan
- queryBuilder_WhereGreaterThanOrEqualsTo
- queryBuilder_WhereLessThan
- queryBuilder_WhereLessThanOrEqualTo
- queryBuilder_WhereValueExists
- queryBuilder_WhereStartsWith
- queryBuilder_WhereEndsWith
- queryBuilder_WhereContains
- queryBuilder_WhereContainedIn
- queryBuilder_WhereArrayContainsAll
- queryBuilder_Or
- Dados em Author via App Dart
- Vídeo: https://youtu.be/4bcg90pIoGo
- typePointer to Genre
- Buscas em Author via App Dart
- Vídeo: https://youtu.be/0vf6yp_2lWs
- queryBuilder_IncludeObject
- queryBuilder_WhereEqualToPointer
- queryBuilder_WhereMatchesQuery
- queryBuilder_WhereDoesNotMatchQuery
- queryBuilder_WhereMatchesKeyInQuery
- queryBuilder_WhereDoesNotMatchKeyInQuery
- Dados em Shape via App Dart
- Vídeo: https://youtu.be/oRga5HqokXc
- typeFile
- typeObject
- Buscas em Shape via App Dart
- Vídeo: https://youtu.be/dgOddus97PQ
- Dados em Publisher via App Dart
- Vídeo: https://youtu.be/qtd7MRriJbs
- typePointer to Shape
- Buscas em Publisher via App Dart
- Vídeo: https://youtu.be/8kGgIJc8p9Q
- Dados em Book via App Dart
- Vídeo: https://youtu.be/Ha8ffU5bxP4
- typePointer to Publisher
- typeRelation to Author
- Buscas em Book via App Dart
- Vídeo: https://youtu.be/97g5ZL51thA
- queryBuilder_IncludeObject
- queryBuilder_WhereEqualToRelation
- queryBuilder_WhereMatchesQuery
- queryBuilder_WhereDoesNotMatchQuery
Este texto é melhor detalhado neste vídeo: https://youtu.be/RM3gYIrJjrY
Neste momento como nosso foco é entender back4app como um database escolher o Dart puro é mais produtivo e não afeta em nada a aplicação destes conhecimentos em Flutter.
O projeto em Dart nos permite entender o b4a de uma forma mais completa e simples no que se refere ao database. Sem as interferencias provocadas por uma interface como é o Flutter.
Depois de vencida a etapa de entender o b4a aplicar isto ao Flutter é simples. Para quem entende de Flutter.
Em construção...
Neste segundo momento iremos desenvolver uma aplicação Flutter para abranger também a parte de login com cadastro de usuarios, emails de verificação e recuperação de senhas.
E trataremos também um pouco sobre cloud functions no cadastro do usuario.
Colocaremos também todos estes conhecimentos de cadastro, atualização e busca de dados vistos no Dart de uma forma visual com Flutter.
Faremos o deploy da aplicação em Flutter Web no b4a.
Este texto é melhor detalhado neste vídeo: https://youtu.be/pkNyrW2Xg58
Bora codar...
Criei uma estrutura teórica de relacionamento apenas para facilitar nosso cadastro e busca de dados:
Adotei coloca o tipo da coluna como nome da coluna pra facilitar o entendimento e no caso de Pointer e Relation informar a tabela relacionada.
Como o nome da coluna informa se tipo você pode imaginar qualquer dado para exemplo e buscas.
As tabelas e os seus campos serão:
- Book
- objectId
- typeString
- typeBoolean
- typeNumber
- typeDateTime
- typeArray
- typePointerPublisher
- typeRelationAuthor
- Publisher
- objectId
- typeString
- typeBoolean
- typeNumber
- typeDateTime
- typeArray
- typePointerShape
- Author
- objectId
- typeString
- typeBoolean
- typeNumber
- typeDateTime
- typeArray
- typePointerGenre
- Genre
- objectId
- typeString
- typeBoolean
- typeNumber
- typeDateTime
- typeArray
- Shape
- objectId
- typeString
- typeBoolean
- typeNumber
- typeDateTime
- typeArray
- typeFile
- typeObject
Os tipos padroes do b4a são
- String
- Boolean
- Number (que pode ser int ou double)
- DateTime
- Array (normalmente pode ser de)
- String
- Boolean
- Number
- Object (que é um json livre)
- File
- Pointer (uma associação com outra tabela do tipo 1:n)
- Relation (uma associação com outra tabela do tipo m:n)
- GeoPoint (não abordaremos este recurso desta vez)
Pra não deixar duvidas segue uma revisao de estrutura de um json.
Os objetos json, simples sem lista, podem ser do tipo typeString, typeBoolean (true ou false), typeNumber (int ou doble), typeArray (de qualquer tipo), typeObject (um outro json)
Veja que datas e tempos, ou seja DateTime, não são json padroes e são usados em formato de texto.
{
"typeString": "example",
"typeBoolean1": true,
"typeBoolean2": false,
"typeNumber1": 1,
"typeNumber2": 3.14,
"typeNull": null,
"typeArray": [
"example",
true,
false,
1,
3.14,
null,
{}
],
"typeObject": {}
}
Mas os objetos json também pode vir em formato de lista desta forma.
[
{},
{}
]
Este sempre é salvo em UTC no b4a. No caso do Brasil em +3h
Ou seja.
DateTime em sua aplicação | DateTime no b4a |
---|---|
2022-01-01 00:00:00 | 2022-01-01 03:00:00 |
Este texto é melhor detalhado neste vídeo: https://youtu.be/SQ5sUlg8wgU
Veremos sobre:
- criação das tabelas
- criação das colunas
- exemplos de edição dentro do database do b4a
Bora codar...
Acesse o site https://www.back4app.com/
Realize seu cadastro.
Sua tela após cadastro deve se parecer com a minha.
Clique então em NEW APP.
Para padronizar informe
App name: learning_about_b4a_2
Database: mongoDB
Então o projeto que já fiz e esta testado se chama learning_about_b4a e este que faço junto com vc se chama learning_about_b4a_2.
Este é o processo de criação e configuração do seu database e demais capacidades de backend que o b4a fornece.
Ao final do processo teremos esta tela:
O b4a chama as tabelas de Class, os campos de Column e as linhas de linhas Objetos.
Vamos então criar as tabelas/classes e seus campos clicando em Create a class
Criando a tabela Genre conforme esta imagem. Não abordaremos permissões de acesso e outras restrições nesta verão Dart do projeto. Então marque Public Read and Write enabled. Clique em Create class & add columns
Criaremos agora as colunas desta tabela. Conforme as imagens a seguir. Após cada preenchimento clique em Add columns & continue
Este campo aceita qq coisa. Conforme ja comentamos. Basta tratar o tipo no seu código.
A lista final de colunas ficou assim:
As colunas objectId, updatedAt, createdAt e ACL são criadas automaticamente.
Agora vamos a proxima tabela
Crie as colunas typeString, typeBoolean, typeNumber, typeDateTime e typeArray igual vc criou na tabela Genre. Acrescentando agora a coluna typePointerGenre que é um ponteiro, 1:n, para a tabela Genre. Desta forma
A lista final de colunas ficou assim:
Agora vamos a proxima tabela
Crie as colunas typeString, typeBoolean, typeNumber, typeDateTime e typeArray igual vc criou na tabela Genre. Acrescentando agora a coluna typeFile e typeObject. Desta forma
A lista final de colunas ficou assim:
Crie as colunas typeString, typeBoolean, typeNumber, typeDateTime e typeArray igual vc criou na tabela Genre. Acrescentando agora a coluna typePointerShape que é um ponteiro, 1:n, para a tabela Shape. Desta forma
A lista final de colunas ficou assim:
Agora vamos a proxima tabela
Crie as colunas typeString, typeBoolean, typeNumber, typeDateTime e typeArray igual vc criou na tabela Genre. Acrescentando agora a coluna typePointerPublisher que é um ponteiro, 1:n, para a tabela Publisher. E acrescentando agora a coluna typeRelationAuthor que é um relacionamento, m:n, para a tabela Author. Desta forma
A lista final de colunas ficou assim:
O esquema completo com todas as tabela ficou assim
reveja o post/video sobre as relações entre elas para que apartir dagora você tenha uma clareza nas adição e busca dos dados.
Este texto é melhor detalhado neste vídeo: https://youtu.be/IqQ2nke4Ot0
Bora codar...
Para criar passo a passo nosso App em puro Dart e ir desenvolvendo conforme cada video. Faça assim:
- Abra seu VSCode
- tecle F1
- selecione o busque Dart: New project
- selecione Console application
- selectione a pasta onde salvar este projeto
- informe este nome para o projeto: learning_about_b4a_2_dart
- espere o VSCode criar o projeto
Edite o arquivo pubspec.yaml desta forma. Atualize-o.
dependencies:
path: ^1.8.0
dotenv: ^4.0.1
parse_server_sdk: ^3.1.3
Crie o arquivo .env na raiz do projeto e adicione as credenciais de acesso ao database.
Estas informações podem ser obtidas em seu projeto b4a no dashboard -> App Settings -> Security & Keys
appId = 'your appId'
clientKey = 'your clientKey'
Existem outros recursos do liveQuery que é tipo uma stream do database. Mas não iremos abordar sobre ela neste momento.
Maiores comentários sobre cada parte eu farei nos videos.
Iremos construir cada arquivo a medida de sua necessidade
Mas a seguir apresento a estrutura completa para nosso acompanhamento.
app/
├── app.dart
├── core
│ └── models
│ ├── author_model.dart
│ ├── book_model.dart
│ ├── genre_model.dart
│ ├── publisher_model.dart
│ └── shape_model.dart
├── data
│ └── b4a
│ ├── connect_b4a.dart
│ ├── entity
│ │ ├── author_entity.dart
│ │ ├── book_entity.dart
│ │ ├── genre_entity.dart
│ │ ├── publisher_entity.dart
│ │ └── shape_entity.dart
│ └── tables
│ ├── author
│ │ └── author_repository.dart
│ ├── book
│ │ └── book_repository.dart
│ ├── genre
│ │ └── genre_repository.dart
│ ├── publisher
│ │ └── publisher_repository.dart
│ └── shape
│ └── shape_repository.dart
└── presentation
├── author
│ ├── author_page.dart
│ └── author_view.dart
├── book
│ ├── book_controller.dart
│ ├── book_page.dart
│ └── book_view.dart
├── genre
│ ├── genre_page.dart
│ └── genre_search.dart
├── publisher
│ ├── publisher_page.dart
│ └── publisher_search.dart
└── shape
├── shape_page.dart
└── shape_search.dart
Execute o app em modo Debug para pegar as saídas dos log().
Não esqueça de enviar este projeto ao seu github como privado enquanto vc desenvolve. Depois pode colocar publica pois as credenciais já vão estar salvas pelo dotenv. Voltar ao sumário
Este texto é melhor detalhado neste vídeo: https://youtu.be/joj68zuxlgE
Trataremos apenas dos seguintes campos
- typeString
- typeBoolean
- typeNumber
- typeDateTime
- typeArray
A manipulação de dados nesta tabela envolverá:
- add
- addAll
- update
- unset
- delete
- removeAll
- typeNumberIncrement
- typeNumberDecrement
- typeArraySetAdd
- typeArraySetAddUnique
- typeArraySetAddAll
- typeArraySetAddAllUnique
- typeArraySetRemove
- typeArraySetRemoveAll
Bora codar...
Procurei criar uma certa estrutura no app para tentar organizar algumas coisa mais proximo de um app real.
Então a seguencia de criação dos arquivos será
- lib/core/models/genre_model.dart
- lib/data/b4a/entity/genre_entity.dart
- lib/data/b4a/tables/genre/genre_repository.dart
- lib/app/presentation/genre/genre_page.dart
- lib/app/presentation/genre/genre_view.dart
- lib/app/presentation/genre/genre_controller.dart
Esta será a etapa mais trabalhosa, pois será a referencia para todas as outras. Então preste a atenção que nas demais não repetirei o processo.
Este texto é melhor detalhado neste vídeo: https://youtu.be/n52yn52uavQ
Bora codar...
As buscas na tabela Genre serão:
- count
- getObject
- getAll
- queryBuilder
- queryBuilderOrderByAscending
- queryBuilderOrderByDescending
- queryBuilderExcludeKeys
- queryBuilderKeysToReturn
- queryBuilderPagination
- queryBuilderWhereEqualToSimpleColumn
- queryBuilderWhereNotEqualToSimpleColumn
- queryBuilderWhereGreaterThan
- queryBuilderWhereGreaterThanOrEqualsTo
- queryBuilderWhereLessThan
- queryBuilderWhereLessThanOrEqualTo
- queryBuilderWhereValueExists
- queryBuilderWhereStartsWith
- queryBuilderWhereEndsWith
- queryBuilderWhereContains
- queryBuilderWhereContainedIn
- queryBuilderWhereArrayContainsAll
- queryBuilderOr
Este texto é melhor detalhado neste vídeo: https://youtu.be/4bcg90pIoGo
Bora codar...
A manipulação de dados nesta tabela envolverá:
- addAll
- add
- update
- unset
- delete
- removeAll
Este texto é melhor detalhado neste vídeo: https://youtu.be/0vf6yp_2lWs
Bora codar...
As buscas na tabela Author serão:
- queryBuilderIncludeObject
- queryBuilderWhereEqualToPointer
- queryBuilderWhereMatchesQuery
- queryBuilderWhereDoesNotMatchQuery
- queryBuilderWhereMatchesKeyInQuery
- queryBuilderWhereDoesNotMatchKeyInQuery
Este texto é melhor detalhado neste vídeo: https://youtu.be/oRga5HqokXc
Bora codar...
A manipulação de dados nesta tabela envolverá:
- addAll
- add
- update
- unset
- delete
- removeAll
Este texto é melhor detalhado neste vídeo: https://youtu.be/dgOddus97PQ
Bora codar...
As buscas na tabela Shape serão:
- getObject
Este texto é melhor detalhado neste vídeo: https://youtu.be/qtd7MRriJbs
Bora codar...
A manipulação de dados nesta tabela envolverá:
- addAll
- add
- update
- unset
- delete
- removeAll
Este texto é melhor detalhado neste vídeo: https://youtu.be/8kGgIJc8p9Q
Bora codar...
As buscas na tabela Publisher serão:
- getObject
Este texto é melhor detalhado neste vídeo: https://youtu.be/Ha8ffU5bxP4
Bora codar...
A manipulação de dados nesta tabela envolverá:
- addAll
- add
- update
- unset
- delete
- removeAll
Este texto é melhor detalhado neste vídeo: https://youtu.be/97g5ZL51thA
Veremos sobre:
- buscas
Bora codar...
As buscas na tabela Book serão:
- queryBuilderIncludeObject
- queryBuilderWhereEqualToRelation
- queryBuilderWhereMatchesQuery
- queryBuilderWhereDoesNotMatchQuery