Ir para conteúdo

Bem vindo ao Fluttership

Fluttership

Entre para seguir isso  
vinicius-ps

Flutter - O que é e como utilizar o banco de dados hive

Recommended Posts

1*9I2lqp77cuDjWMbEWcaxCw.png

Hive é um banco de dados do tipo chave-valor, leve e extremamente rápido feito em Dart puro. Essa é a descrição que você encontra no pub.dev e documentação do projeto.

Como o hive trabalha

O hive utiliza o conceito de caixas para armazenar os dados. Uma caixa pode ser comparada com uma tabela do SQL, mas as caixas não tem uma estrutura fixa e podem conter qualquer coisa.

Vantagens

O hive se apresenta como uma opção extremamente vantajosa em relação as outras opções de persistência de dados no Flutter, o conhecido shared_preferences e o SQLite por dois motivos:

O primeiro, atualmente o shared_preferences não funciona na plataforma web pois encapsula os nativos NSUserDefaults no iOS e SharedPreferences no Android.

E o segundo, o desempenho do hive é muito superior ao SQLite tanto em leitura quanto escrita. Em relação ao shared_preferences, os dois são equiparáveis em leitura, porém o hive ganha na escrita.

1*iUMEQvjvlhytBgjLK8oW4Q.png

 

A diferença na escrita é bem grande, mas você não precisa acreditar nos resultados apresentados na documentação, você mesmo pode executar o benchmark.

Como executar o benchmark

Pra manter artigo mais resumido aqui vou deixar o link do artigo original de como executar o benchmark. Eu consegui esses resultados:

ypenKuU.png

A diferença entre o hive e SQLite parece ser menor nos meus resultados, porém devemos lembrar que o tempo no aparelho usado é muito maior, chegando a 53832ms, enquando no benchmark da documentação o tempo máximo é 14760ms.

Como utilizar

Agora que já ficou comprovado o desempenho do hive vamos conferir como utilizá-lo.

Crie um projeto

Primeiro crie um projeto padrão do flutter.

Adicionando hive no projeto

Em pubspec.yaml adicione:

dependencies:
  hive: ^1.0.0
  path_provider: ^1.2.0dev_dependencies:
  hive_generator: ^0.5.1
  build_runner: ^1.7.1

Nós precisamos além do hive, incluir o path_provider para podermos pegar o diretório atual do aplicativo.

 

Agora apague todo o conteúdo do arquivo main.dart e inclua uma estrutura básica de um StatelessWidget:

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';void main() => runApp(MaterialApp(home: MyApp()));class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Exemplo hive',
      home: Container()
    );
  }
}

Agora vamos criar uma função para pegar os dados de uma caixa:

Future _abrirCaixa() async {  
  var dir = await getApplicationDocumentsDirectory();
  Hive.init(dir.path);
  return await Hive.openBox('minhaCaixa');
}

Como essa operação envolve a leitura de um arquivo você precisa utilizar o modificador async e usar o await.

Se você estiver utilizando o flutter web você não precisa do path_provider no projeto e também não precisa utilizar o Hive.init().

 

Nós vamos utilizar um FutureBuilder pra criar a estrutura do nosso projeto. No future será utilizado a função _abrirCaixa, se algo der errado nós vamos exibir um Center com essa mensagem, se estiver tudo ok retornaremos nossa página principal.

Altere a classe MyApp:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
  return MaterialApp(
    title: 'Exemplo hive',
    home: FutureBuilder(
    future: _abrirCaixa(),
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        if (snapshot.error != null) {
          return Scaffold(
            body: Center(
              child: Text('Algo deu errado :('),
            ),
          );
        } else {
          return MinhaPagina();
        }
      } else {
        return CircularProgressIndicator();
      }
    },
   ),
  );
 }
}

Agora nós vamos criar o widget MinhaPagina:

class MinhaPagina extends StatefulWidget {
  @override
  _MinhaPaginaState createState() => _MinhaPaginaState();
}class _MinhaPaginaState extends State<MinhaPagina> {
  Box _caixa;
  @override
  void initState() {
    _caixa = Hive.box('minhaCaixa');
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Exemplo hive'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Reinicie o aplicativo para testar'),
            SizedBox(height: 8),
            Text('You have pushed the button this many times:'),
            WatchBoxBuilder(
              box: _caixa,
              builder: (context, box) {
                return Text(
                  box.get('contador', defaultValue: 0).toString(),
                  style: Theme.of(context).textTheme.display1,
                );
              },
            ),],
          ),
        ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
         _caixa.put(
           'contador', 
           _caixa.get('contador', defaultValue: 0) + 1);
         },
         tooltip: 'Aumentar',
         child: Icon(Icons.add),
      ),);
}}

Para exibir o valor do contador nós vamos utilizar um widget criado pelo desenvolvedor do hive. O WatchBoxBuilder se recria toda vez que o valor de uma caixa ou de uma chave específica muda.

Para usar vamos inserir no pubspec.yaml:

dependencies:
  hive: ^1.0.0
  path_provider: ^1.2.0
  hive_flutter: anydev_dependencies:
  hive_generator: ^0.5.1
  build_runner: ^1.7.1

Depois adicione o import em main.dart:

import 'package:hive_flutter/hive_flutter.dart';

Sempre que o aplicativo é iniciado ele lê o valor de contador e exibe na tela. Sempre que o botão é pressionado o valor também é atualizado na caixa, o que faz com que o WatchBoxBuilder seja atualizado.

1*bAU2ReuopMTsOmdlRCUguQ.png

Esse é um exemplo bem simples porém já consegue mostrar um pouco de como utilizar o hive. Ele aparenta ser uma ótima opção de persistência no flutter, com um desempenho excelente e sem dependências nativas.

Esse projeto foi baseado na documentação do hive e pode ser encontrado no Github.

1 X8lgnGjge_B_CPnwyvBpig.png

  • Gostei! 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Visitante
Responder

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Entre para seguir isso  

×
×
  • Criar Novo...