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).