Android

Android

Xamarin Android – Exibindo dados de um banco de dados SQLite existente

9 fev, 2018
Publicidade

Neste artigo, vou mostrar como exibir os dados de um banco de dados SQLite existente em uma aplicação Xamarin Android.

O Android oferece várias maneiras de armazenar e recuperar dados de um banco de dados e o SQLite é um banco de dados muito leve, que vem com o sistema operacional Android.

Eu já mostrei como fazer o CRUD usando o banco de dados SQLite em uma aplicação Xamarin Android neste artigo:

Hoje veremos como acessar dados de um banco de dados SQLite já existente. Então primeiro vamos criar um banco de dados SQLite e uma tabela, usando o SQLite DB Browser, e depois vamos incluir alguns dados na tabela e em seguida, criar a aplicação Android para acessar esses dados.

O SQLite DB Browser que iremos usar para criar o banco de dados SQLite pode ser obtido neste link:

O DB Browser para SQLite é uma ferramenta de alta qualidade, visual e de código aberto para criar, projetar e editar arquivos de banco de dados compatíveis com o SQLite.

Ele pode ser usado por desenvolvedores que desejam criar bancos de dados, pesquisar e editar dados. Ele usa uma interface familiar, semelhante a uma planilha, e você não precisa aprender comandos SQL complicados.

A seguir, um resumo sobre os controles e assistentes disponíveis na ferramenta:

  • Criar e compactar arquivos de banco de dados
  • Cria, define, modifiqua e exclui tabelas
  • Cria, define e exclui índices
  • Navega, edita, adiciona e exclui registros
  • Pesquisa registros
  • Importar e exportar registros como texto
  • Importar e exportar tabelas de/para arquivos CSV
  • Importe e exporte bancos de dados de/para arquivos dump SQL
  • Emite consultas SQL e inspeciona os resultados
  • Examina um log de todos os comandos SQL emitidos pelo aplicativo

Agora, sem mais delongas, vamos ao trabalho.

Nota: Esse projeto foi adaptado do original: http://www.c-sharpcorner.com/article/xamarin-android-working-with-existing-db/

Recursos usados:

Criando o banco de dados SQLite com o SQLite DB Browser

Abra o SQLite DB Browser e clique em Novo banco de dados e a seguir escolha um local e informe o nome do banco de dados que deseja criar.

Eu vou criar um banco de dados na pasta : c:\dados\DB\ chamado MacSqlite:

A seguir, vamos criar uma tabela chamada Contato com os seguintes campos:

  • ID – INTEGER, Primary Key – Auto-Increment
  • Nome – TEXT
  • Email – TEXT

Para encerrar essa etapa, inclua alguns dados na tabela Contato:

Criando a aplicação Xamarin Android

Abra o VS 2017 Community e clique em Visual C# -> Android, escolha o template Blank App (Android) e informe o nome Droid_SQLiteDB:

Em seguida, inclua o pacote sqlite-net-pcl no projeto via menu Tools em Manage Nuget Packages for Solution:

Agora, abra o projeto e crie uma pasta chamada Raw dentro da pasta Resources e copie o banco de dados SQLite criado para esta pasta:

Crie uma pasta Model no projeto e nesta pasta crie uma classe Contato incluindo o código abaixo:

Abra o arquivo de layout Main.axml na pasta Resources/Layout e inclua o código abaixo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:text="Carregar Dados"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnCarregaDados" />
    <LinearLayout
        android:orientation="vertical"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/container" />
</LinearLayout>

Esta página de layout será a página inicial da aplicação apresentando um botão para carregar os dados da tabela Contato.

Vamos incluir um novo arquivo de layout chamado row.axml na pasta Resources/Layout, onde vamos definir o layout para exibir as informações obtidas do banco de dados.

No menu Project, clique em Add New Item, e a seguir em Android Layout e informe o nome row.axml:

Após isso, inclua o código abaixo neste arquivo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_light">
    <TextView
        android:text="ID"
        android:textColor="White"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtID" />
    <TextView
        android:text="Nome"
        android:textColor="White"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtNome" />
    <TextView
        android:text="Email"
        android:textColor="White"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtEmail" />
</LinearLayout>

Temos no código 3 TextViews onde vamos exibir o ID, o Nome e o E-mail do contato obtido da tabela Contato.

Criando o código para copiar e acessar o banco de dados

Vamos agora criar uma rotina que vai copiar o banco de dados que criamos e que colocamos na pasta Raw para o Android.

Crie uma pasta Service no projeto e nesta pasta crie uma classe chamada DBHelper com o seguinte código:

using Android.Content;
using Android.Database.Sqlite;
using System;
using System.IO;
namespace Droid_SQLiteDB.Service
{
    public class DBHelper : SQLiteOpenHelper
    {
        private static string DB_PATH = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        private static string DB_NAME = "MacSQLite.db";
        private static int VERSION = 1;
        private Context context;
        public DBHelper(Context context) : base(context, DB_NAME, null, VERSION)
        {
            this.context = context;
        }
        private string GetSQLiteDBPath()
        {
            return Path.Combine(DB_PATH, DB_NAME);
        }
        public override SQLiteDatabase WritableDatabase
        {
            get
            {
                return CriaSQLiteDB();
            }
        }
        private SQLiteDatabase CriaSQLiteDB()
        {
            SQLiteDatabase sqliteDB = null;
            string path = GetSQLiteDBPath();
            Stream streamSQLite = null;
            FileStream streamWriter = null;
            Boolean isSQLiteInit = false;
            try
            {
                if (File.Exists(path))
                    isSQLiteInit = true;
                else
                {
                    streamSQLite = context.Resources.OpenRawResource(Resource.Raw.MacSQLite);
                    streamWriter = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                    if (streamSQLite != null && streamWriter != null)
                    {
                        if (CopiaSQLiteDB(streamSQLite, streamWriter))
                            isSQLiteInit = true;
                    }
                }
                if (isSQLiteInit)
                    sqliteDB = SQLiteDatabase.OpenDatabase(path, null, DatabaseOpenFlags.OpenReadonly);
            }
            catch { }
            return sqliteDB;
        }
        private bool CopiaSQLiteDB(Stream streamSQLite, FileStream streamWriter)
        {
            bool isSuccess = false;
            int lenght = 256;
            Byte[] buffer = new Byte[lenght];
            try
            {
                int bytesRead = streamSQLite.Read(buffer, 0, lenght);
                while (bytesRead > 0)
                {
                    streamWriter.Write(buffer, 0, bytesRead);
                    bytesRead = streamSQLite.Read(buffer, 0, lenght);
                }
                isSuccess = true;
            }
            catch { }
            finally
            {
                streamSQLite.Close();
                streamWriter.Close();
            }
            return isSuccess;
        }
        public override void OnCreate(SQLiteDatabase db)
        {}
        public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {}
    }
}

A classe DBHelper herda de SQLiteOpenHelper que é uma classe de ajuda para gerenciar a criação do gerenciamento de versão do banco de dados. Usamos essa classe para ler o arquivo SQLite e copiá-lo para System.Environment.SpecialFolder.Personal.

Acessando e exibindo os dados do SQLite

Para concluir, abra o arquivo MainActivity e inclua o código abaixo:

using Android.App;
using Android.Widget;
using Android.OS;
using Android.Database.Sqlite;
using Droid_SQLiteDB.Model;
using Droid_SQLiteDB.Service;
using System.Collections.Generic;
using Android.Database;
using Android.Views;
using Android.Content;
namespace Droid_SQLiteDB
{
    [Activity(Label = "Droid_SQLiteDB", MainLauncher = true)]
    public class MainActivity : Activity
    {
        DBHelper db;
        SQLiteDatabase sqliteDB;
        LinearLayout container;
        Button btnGetDados;
        List<Contato> listaContatos = new List<Contato>();
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            db = new DBHelper(this);
            sqliteDB = db.WritableDatabase;
            container = FindViewById<LinearLayout>(Resource.Id.container);
            btnGetDados = FindViewById<Button>(Resource.Id.btnCarregaDados);
            btnGetDados.Click += delegate
            {
                ObtemDados();
            };
        }
        private void ObtemDados()
        {
            ICursor dadosSelecionados = sqliteDB.RawQuery("select * from Contato", new string[] { });
            if (dadosSelecionados.Count > 0)
            {
                dadosSelecionados.MoveToFirst();
                do
                {
                    Contato contato = new Contato();
                    contato.ID = dadosSelecionados.GetString(dadosSelecionados.GetColumnIndex("ID"));
                    contato.Nome = dadosSelecionados.GetString(dadosSelecionados.GetColumnIndex("Nome"));
                    contato.Email = dadosSelecionados.GetString(dadosSelecionados.GetColumnIndex("Email"));
                    listaContatos.Add(contato);
                }
                while (dadosSelecionados.MoveToNext());
                dadosSelecionados.Close();
            }
            foreach (var item in listaContatos)
            {
                LayoutInflater layoutInflater = (LayoutInflater)BaseContext.GetSystemService(Context.LayoutInflaterService);
                View addView = layoutInflater.Inflate(Resource.Layout.row, null);
                TextView txtID = addView.FindViewById<TextView>(Resource.Id.txtID);
                TextView txtNome = addView.FindViewById<TextView>(Resource.Id.txtNome);
                TextView txtEmail = addView.FindViewById<TextView>(Resource.Id.txtEmail);
                txtID.Text = item.ID;
                txtNome.Text = item.Nome;
                txtEmail.Text = item.Email;
                container.AddView(addView);
            }
        }
    }
}

Neste código acessamos o banco de dados SQLite e obtemos todos os dados da tabela Contato (select * from Contato) exibindo-os no layout row.axml.

Executando o projeto iremos obter o seguinte resultado:

Essa abordagem é uma solução adequada apenas para banco de dados pequenos.

Pegue o projeto completo aqui: Droid_SQLiteDB.zip (sem as referências).