Quando trabalhamos com desenvolvimento de sistemas, independente de sua plataforma ou linguagem, sempre nos deparamos com a necessidade de ter que armazenar essas informações em uma base de dados, consultar, editar e apagar.

Este artigo tem o intuito de ajudar programadores iniciantes na plataforma Xamarin Studio a criarem suas aplicações móveis possibilitando o armazenamento de suas informações em uma banco de dados SQLite.

O que é o Xamarin Studio

É um IDE autônomo para desenvolvimento de aplicativos móveis que permite o desenvolvimento de aplicações multi-plataforma utilizando a linguagem C#.

O que é o SQLite

SQLite é um mecanismo de banco de dados, compatível com ACID. Ao contrário dos sistemas cliente-servidor, SQLite está ligada à aplicação móvel, tornando-se parte dela. Cada operação é executada dentro do aplicativo móvel através de chamadas e os métodos fornecidos pela biblioteca SQLite são escritos em C e tem um tamanho relativamente pequeno.

Confira os cursos mobile da DevMedia:

Iniciando o Projeto

Se você não possui o Xamarin Studio, pode baixá-lo no Site do Xamarin.

Após a instalação (que é bem simples, abra o programa e escolha a opção Abrir. Clique em Arquivo -> Novo -> Soluções e escolha a opção Android Application. Defina um nome para seu projeto e clique em OK, conforme mostra a Figura 1.

Criando novo projeto
Figura 1. Criando novo projeto

Criar Classe Database

Com o nosso projeto já criado, agora iremos criar nossa primeira classe, a qual chamaremos de "Database". Em seguida, clique com botão direito do mouse sobre o projeto Conexao -> Adicionar -> Novo Arquivo. Selecione a opção Android Class e defina um nome. Ao final, clique em New. A tela desse passo está presente na Figura 2.

Criando nova classe
Figura 2. Criando nova classe

Essa classe permite a comunicação da aplicação com o banco de dados de tal maneira que possamos criar o banco, as tabelas, as colunas, efetuar operações de inserção, edição, exclusão e consulta de dados tudo a partir dela. Na Listagem 1 temos o código da classe com seus comentários para que você possa entender melhor.

Saiba mais Confira Guia Completo de Xamarin
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Database.Sqlite;
using System.IO;

namespace Conexao
{
    class Database
    {
        //objeto para manipulação do banco de dados SQLiteDatabase
        private SQLiteDatabase sqldb;
        //String para manipulação da consulta
        private string sqldb_query;
        //String para manipulação Mensagem
        private string sqldb_mensagem;
        //Bool para verificar a disponibilidade do banco de dados
        private bool sqldb_dispoTalhao;

        //Inicializa uma nova instância de classe de banco de dados
        public Database()
        {
            sqldb_mensagem = "";
            sqldb_dispoTalhao = false;
        }

        //Um construtor argumento, inicializa uma nova instância da classe de banco de dados
        com o parâmetro nome do banco de dados
        public Database(string sqldb_nome)
        {
            try
            {
                sqldb_mensagem = "";
                sqldb_dispoTalhao = false;
                CriarDatabase(sqldb_nome);
            }
            catch (SQLiteException ex)
            {
                sqldb_mensagem = ex.Message;
            }
        }

        //Obtém ou define o valor, dependendo da disponibilidade do banco de dados
        public bool DatabaseDispoTalhao
        {
            get{ return sqldb_dispoTalhao; }
            set{ sqldb_dispoTalhao = value; }
        }

        //Obtém ou define o valor para o tratamento de mensagens
        public string Mensagem
        {
            get{ return sqldb_mensagem; }
            set{ sqldb_mensagem = value; }
        }

        //Cria um novo banco de dados cujo nome é dado pelo parâmetro
        public void CriarDatabase(string sqldb_nome)
        {
            try
            {
                sqldb_mensagem = "";
                string sqldb_location = System.Environment
                .GetFolderPath(System.Environment.SpecialFolder.Personal);
                string sqldb_path = Path.Combine(sqldb_location, sqldb_nome);
                bool sqldb_exists = File.Exists(sqldb_path);
                if(!sqldb_exists)
                {
                    sqldb = SQLiteDatabase.OpenOrCreateDatabase(sqldb_path,null);

                    sqldb_query = "CREATE TABLE IF NOT EXISTS Registros (_id INTEGER PRIMARY
                    KEY AUTOINCREMENT, Produtor VARCHAR, Safra VARCHAR, Propriedade VARCHAR,
                    Plano VARCHAR, Avaliador VARCHAR, Praga VARCHAR, Descricao VARCHAR,
                    Talhao VARCHAR);";
                    sqldb.ExecSQL(sqldb_query);
                    sqldb_mensagem = "Banco de dados '" + sqldb_nome + "' criado com sucesso!";
                }
                else
                {
                    sqldb = SQLiteDatabase.OpenDatabase(sqldb_path, null,
                    DatabaseOpenFlags.OpenReadwrite);
                    sqldb_mensagem = "Banco de dados '"+ sqldb_nome + "'
                    carregado com sucesso!";
                }
                sqldb_dispoTalhao=true;
            }
            catch(SQLiteException ex)
            {
                sqldb_mensagem = ex.Message;
            }
        }

        //Adiciona um novo registro com os parâmetros dados
        public void AddRegistro(string sProdutor, string sSafra, string sPropriedade,string
        sPlano,string sAvaliador,string sPraga, string sDescricao,string sTalhao)
        {
            try
            {
                sqldb_query = "INSERT INTO Registros
                (Produtor,Safra,Propriedade,Plano,Avaliador,Praga,Descricao,Talhao)
                VALUES ('" + sProdutor + "','" + sSafra + "','" + sPropriedade + "','" +
                sPlano + "','" + sAvaliador + "','" + sPraga + "','" + sDescricao
                + "','" + sTalhao + "');";
                sqldb.ExecSQL(sqldb_query);
                sqldb_mensagem = "Registro salvo com sucesso!";
            }
            catch(SQLiteException ex)
            {
                sqldb_mensagem = ex.Message;
            }
        }

        //Atualiza um registro existente com os parâmetros dados, dependendo do parâmetro id
        public void AlterarRegistro(int iId, string sProdutor, string sSafra, string
        sPropriedade,string sPlano,string sAvaliador,string sPraga, string sDescricao,
        string sTalhao)
        {
            try
            {
                sqldb_query="UPDATE Registros SET Produtor ='" + sProdutor + "', Safra ='" +
                sSafra + "', Propriedade ='" + sPropriedade + "', Plano ='" + sPlano + "',
                Avaliador ='" + sAvaliador + "', Praga ='" + sPraga + "', Descricao ='" +
                sDescricao + "', Talhao ='" + sTalhao + "' WHERE _id ='" + iId + "';";
                sqldb.ExecSQL(sqldb_query);
                sqldb_mensagem = "Registro (" + iId + ") alterado com sucesso!";
            }
            catch(SQLiteException ex)
            {
                sqldb_mensagem = ex.Message;
            }
        }

        //Exclui o registro associado ao parâmetro id
        public void DeletarRegistro(int iId)
        {
            try
            {
                sqldb_query = "DELETE FROM Registros WHERE _id ='" + iId + "';";
                sqldb.ExecSQL(sqldb_query);
                sqldb_mensagem = "Registro " + iId + " deletado com sucesso!";
            }
            catch(SQLiteException ex)
            {
                sqldb_mensagem = ex.Message;
            }
        }

        //Procura um registro e retorna um cursor Android.Database.ICursor
        //Mostra todos os registros da tabela
        public Android.Database.ICursor GetRecordCursor()
        {
            Android.Database.ICursor sqldb_cursor = null;
            try
            {
                sqldb_query = "SELECT*FROM Registros;";
                sqldb_cursor = sqldb.RawQuery(sqldb_query, null);
                if(!(sqldb_cursor != null))
                {
                    sqldb_mensagem = "Registro não encontrado!";
                }
            }
            catch(SQLiteException ex)
            {
                sqldb_mensagem = ex.Message;
            }
            return sqldb_cursor;
        }

        //Procura um registro e retorna um cursor Android.Database.ICursor
        //Mostra os registros de acordo com critérios de pesquisa
        public Android.Database.ICursor GetRecordCursor(string sColumn, string sValue)
        {
            Android.Database.ICursor sqldb_cursor = null;
            try
            {
                sqldb_query = "SELECT*FROM Registros WHERE " + sColumn + " LIKE '"
                + sValue + "%';";
                sqldb_cursor = sqldb.RawQuery(sqldb_query, null);
                if(!(sqldb_cursor != null))
                {
                    sqldb_mensagem = "Registro não encontrado!";
                }
            }
            catch(SQLiteException ex)
            {
                sqldb_mensagem = ex.Message;
            }
            return sqldb_cursor;
        }
    }
}

Criando o Layout da Aplicação

Para criar o layout, dê um clique na pasta Resources para abrir as demais pastas. Em seguida, clique com o botão direito do mouse sobre a pasta layout -> adicionar -> novo arquivo e selecione a opção Android Activity. Defina um nome e clique em New, conforme mestra a Figura 3.

Criando o layout
Figura 3. Criando o layout

Precisamos criar um TextView para cada item que iremos utilizar em nosso banco de dados. Na Listagem 2 você confere todo o código do layout.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:text="Id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Id_linha"
        android:layout_weight="1"
        android:gravity="center"
        android:textSize="15dp"
        android:textColor="#ffffffff"
        android:textStyle="bold" />
    <TextView
        android:text="Praga"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Praga_linha"
        android:layout_weight="1"
        android:textSize="15dp"
        android:textColor="#ffffffff"
        android:textStyle="bold" />
    <TextView
        android:text="Descricao"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Descricao_linha"
        android:layout_weight="1"
        android:textSize="15dp"
        android:textStyle="bold"
        android:textColor="#ffffffff" />
    <TextView
        android:text="Proprietario"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Proprietario_linha"
        android:layout_weight="1"
        android:textSize="15dp"
        android:textStyle="bold"
        android:textColor="#ffffffff"
        android:gravity="center" />
    <TextView
        android:text="Propriedade"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Propriedade_linha"
        android:layout_weight="1"
        android:textSize="15dp"
        android:textStyle="bold"
        android:textColor="#ffffffff" />
    <TextView
        android:text="Talhao"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Talhao_linha"
        android:layout_weight="1"
        android:textSize="15dp"
        android:textStyle="bold"
        android:textColor="#ffffffff"
        android:gravity="center" />
</LinearLayout>
Listagem 2. Lista_Itens.axml

Para alterar o layout main, vamos dentro da Pasta Resource -> Layout -> Main.axml. Em seguida, clique duas vezes no Main.axml. Veja o layout principal na Figura 4.

Layout Principal
Figura 4. Layout Principal

Essa será nossa pagina principal onde teremos a maior parte das funcionalidades do sistema.

Na Listagem 3 temos o código do layout.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ff121c11">
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/linearLayout2"
        android:background="#ff636718"
        android:paddingTop="5dp"
        android:paddingBottom="5dp">
        <ImageView
            android:src="@drawable/green_wormhole"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView1"
            android:paddingLeft="10dp" />
        <TextView
            android:text="Catalogar Ocorrências"
            android:textColor="#ffffffff"
            android:textSize="25dp"
            android:gravity="left"
            android:id="@+id/TituloLista"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:paddingLeft="10dp" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ff1e2e1d"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:id="@+id/linearLayout7">
        <TextView
            android:text="Produtor"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textStyle="bold"
            android:textColor="#ffffffff"
            android:id="@+id/textView5" />
        <TextView
            android:text="Safra"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textColor="#ffffffff"
            android:textStyle="bold"
            android:id="@+id/textView6" />
        <TextView
            android:text="Propriedade"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textStyle="bold"
            android:textColor="#ffffffff"
            android:id="@+id/textView7" />
        <TextView
            android:text="Plano de Plantio"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textStyle="bold"
            android:textColor="#ffffffff"
            android:id="@+id/textView8" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ff1e2e1d"
        android:id="@+id/linearLayout6">
        <EditText
            android:id="@+id/txtProdutor"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
        <EditText
            android:id="@+id/txtSafra"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
        <EditText
            android:id="@+id/txtPropriedade"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
        <EditText
            android:id="@+id/txtPlano"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ff1e2e1d"
        android:paddingTop="5dp"
        android:paddingBottom="5dp">
        <TextView
            android:text="Avaliador"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textStyle="bold"
            android:textColor="#ffffffff" />
        <TextView
            android:text="Tipo de Praga"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textColor="#ffffffff"
            android:textStyle="bold" />
        <TextView
            android:text="Descrição"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textStyle="bold"
            android:textColor="#ffffffff" />
        <TextView
            android:text="Talhão"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textSize="20dp"
            android:textStyle="bold"
            android:textColor="#ffffffff" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ff1e2e1d"
        android:paddingBottom="20dp">
        <EditText
            android:id="@+id/txtAvaliador"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
        <EditText
            android:id="@+id/txtPraga"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
        <EditText
            android:id="@+id/txtDescricao"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
        <EditText
            android:id="@+id/txtTalhao"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>
    <TextView
        android:text="msg"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/shMsg"
        android:background="#ff304a2e"
        android:textColor="#ffa1a728"
        android:textStyle="bold"
        android:textSize="20dp"
        android:gravity="center"
        android:paddingTop="10dp"
        android:paddingBottom="10dp" />
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:background="#ff304a2e"
        android:gravity="center"
        android:id="@+id/linearLayout1"
        android:paddingBottom="20dp"
        android:paddingTop="20dp">
        <ImageButton
            android:layout_width="169dp"
            android:paddingLeft="10dp"
            android:layout_height="42dp"
            android:background="@drawable/bug_add"
            android:id="@+id/imgAdd"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp" />
        <ImageButton
            android:layout_width="169dp"
            android:paddingLeft="10dp"
            android:layout_height="42dp"
            android:background="@drawable/bug_edit"
            android:id="@+id/imgEditar"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp" />
        <ImageButton
            android:layout_width="169dp"
            android:paddingLeft="10dp"
            android:layout_height="42dp"
            android:background="@drawable/bug_delete"
            android:id="@+id/imgDeletar"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp" />
        <ImageButton
            android:layout_width="169dp"
            android:paddingLeft="10dp"
            android:layout_height="42dp"
            android:background="@drawable/bug_search"
            android:id="@+id/imgBuscar"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp" />
        <ImageButton
            android:layout_width="169dp"
            android:paddingLeft="10dp"
            android:layout_height="42dp"
            android:background="@drawable/bug_gps"
            android:id="@+id/imgGps"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/linearLayout8"
        android:background="#ff304a2e"
        android:gravity="center"
        android:paddingTop="10dp"
        android:paddingBottom="10dp">
        <TextView
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/latitude"
            android:textColor="#ffa1a728"
            android:textSize="20dp"
            android:textStyle="bold" />
        <TextView
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/longitude"
            android:paddingLeft="20dp"
            android:textColor="#ffa1a728"
            android:textSize="20dp"
            android:textStyle="bold" />
        <TextView
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/provedor"
            android:paddingLeft="20dp"
            android:textColor="#ffa1a728"
            android:textSize="20dp"
            android:textStyle="bold" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/linearLayout2"
        android:background="#ff636718"
        android:paddingTop="5dp"
        android:paddingBottom="5dp">
        <ImageView
            android:src="@drawable/green_yellow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView2"
            android:paddingLeft="10dp" />
        <TextView
            android:text="Lista de Ocorrências"
            android:textColor="#ffffffff"
            android:textSize="25dp"
            android:gravity="left"
            android:id="@+id/TituloLista"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:paddingLeft="10dp" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:background="#ff1e2e1d"
        android:gravity="center"
        android:paddingBottom="5dp"
        android:paddingTop="5dp">
        <TextView
            android:text="Código:"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:textSize="20dp"
            android:layout_weight="1"
            android:gravity="left"
            android:id="@+id/id" />
        <TextView
            android:text="Praga:"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:gravity="left"
            android:textSize="20dp"
            android:layout_weight="1"
            android:id="@+id/nome" />
        <TextView
            android:text="Descrição:"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:layout_weight="1"
            android:gravity="left"
            android:textSize="20dp"
            android:id="@+id/sobrenome" />
        <TextView
            android:text="Produtor:"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:layout_weight="1"
            android:textSize="20dp"
            android:gravity="left"
            android:id="@+id/idade" />
        <TextView
            android:text="Propriedade:"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:layout_weight="1"
            android:gravity="left"
            android:textSize="20dp"
            android:id="@+id/sobrenome" />
        <TextView
            android:text="Talhão:"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:layout_weight="1"
            android:textSize="20dp"
            android:gravity="left"
            android:id="@+id/idade" />
    </LinearLayout>
    <ListView
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:id="@+id/listItems" />
</LinearLayout>
Listagem 3. Main.axml

Para criar a Main Activity class, dê um duplo clique no arquivo MainActivity.cs. Na Main Activity iremos fazer com que todo o processo da classe se comunique com o layout, de forma que todos os processos e eventos funcionem como desejado. Os principais eventos serão adicionar, editar, apagar, pesquisar e pegar as coordenadas do GPS. Dentro da classe também iremos alimentar nosso ListView com os dados armazenados em nosso banco de dados.

Na Listagem 4 temos o código da Main Activity.

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Locations;
using Android.Util;

namespace Conexao
{
    [Activity (Label = "Controle de Pragas 1.0", MainLauncher = true)]
    public class MainActivity : Activity, ILocationListener
    {
        //Classe de banco de dados novo objeto
        Database sqldb;
        //Produtor, Safra, Propriedade, Plano, Avaliador, Praga, Descricao, Talhão
        EditText txtProdutor, txtSafra, txtPropriedade, txtPlano, txtAvaliador,
        txtPraga, txtDescricao, txtTalhao;
        //Mensagem objeto TextView para exibir dados
        TextView shMsg;
        //Adicionar, editar, apagar e pesquisar objetos ImageButton para tratamento eventos
        ImageButton imgAdd, imgEditar, imgDeletar, imgBuscar;
        //ListView objeto para exibir dados do banco de dados
        ListView listItems;
        //Add Gerenciador de Localização
        LocationManager locMgr;
        string tag = "MainActivity";
        ImageButton btLocalizar;
        TextView latitude;
        TextView longitude;
        TextView provedor;
        //Inicia o evento para criar aplicativos
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            //Defina nosso layout principal como exibição padrão
            SetContentView (Resource.Layout.Main);

            //Inicializa novo objeto da classe de banco de dados
            sqldb = new Database("controle_db");

            //Obtém objetos Gps
            SetContentView (Resource.Layout.Main);
            btLocalizar = FindViewById<ImageButton> (Resource.Id.imgGps);
            latitude = FindViewById<TextView> (Resource.Id.latitude);
            longitude = FindViewById<TextView> (Resource.Id.longitude);
            provedor = FindViewById<TextView> (Resource.Id.provedor);

            //Obtém casos ImageButton objeto
            imgAdd = FindViewById<ImageButton> (Resource.Id.imgAdd);
            imgDeletar = FindViewById<ImageButton> (Resource.Id.imgDeletar);
            imgEditar = FindViewById<ImageButton> (Resource.Id.imgEditar);
            imgBuscar = FindViewById<ImageButton> (Resource.Id.imgBuscar);

            //Obtém instâncias de objetos EditText
            txtProdutor = FindViewById<EditText> (Resource.Id.txtProdutor);
            txtSafra = FindViewById<EditText> (Resource.Id.txtSafra);
            txtPropriedade = FindViewById<EditText> (Resource.Id.txtPropriedade);
            txtPlano = FindViewById<EditText> (Resource.Id.txtPlano);
            txtAvaliador = FindViewById<EditText> (Resource.Id.txtAvaliador);
            txtPraga = FindViewById<EditText> (Resource.Id.txtPraga);
            txtDescricao = FindViewById<EditText> (Resource.Id.txtDescricao);
            txtTalhao = FindViewById<EditText> (Resource.Id.txtTalhao);

            //Obtém casos TextView objeto
            shMsg = FindViewById<TextView> (Resource.Id.shMsg);

            //Obtém instância ListView objeto
            listItems = FindViewById<ListView> (Resource.Id.listItems);

            //Define a propriedade mensagem classe de banco de dados a instância shMsg TextView
            shMsg.Text = sqldb.Mensagem;

            //Cria ImageButton evento click para imgAdd, ImgEdit, imgDelete e imgSearch
            imgAdd.Click += delegate {

                //Chama uma função addRecord para adicionar um novo registro
                sqldb.AddRegistro (txtProdutor.Text, txtSafra.Text, txtPropriedade.Text,
                txtPlano.Text, txtAvaliador.Text, txtPraga.Text,
                txtDescricao.Text,txtTalhao.Text);
                shMsg.Text = sqldb.Mensagem;
                txtProdutor.Text = txtSafra.Text = txtPropriedade.Text = txtPlano.Text =
                txtAvaliador.Text = txtPraga.Text = txtDescricao.Text = txtTalhao.Text = "";
                GetCursorView();

            };

            imgEditar.Click += delegate {
                int iId = int.Parse(shMsg.Text);

                //Chama a função UpdateRecord para atualizar um registro existente
                sqldb.AlterarRegistro (iId, txtProdutor.Text, txtSafra.Text,
                txtPropriedade.Text, txtPlano.Text, txtAvaliador.Text, txtPraga.Text,
                txtDescricao.Text,txtTalhao.Text);
                shMsg.Text = sqldb.Mensagem;
                txtProdutor.Text = txtSafra.Text = txtPropriedade.Text = txtPlano.Text =
                txtAvaliador.Text = txtPraga.Text = txtDescricao.Text = txtTalhao.Text = "";
                GetCursorView();

            };

            imgDeletar.Click += delegate {
                int iId = int.Parse(shMsg.Text);

                //Chama a função DeleteRecord para apagar o registro associado ao parâmetro id
                sqldb.DeletarRegistro (iId);
                shMsg.Text = sqldb.Mensagem;
                txtProdutor.Text = txtSafra.Text = txtPropriedade.Text = txtPlano.Text =
                txtAvaliador.Text = txtPraga.Text = txtDescricao.Text = txtTalhao.Text = "";
                GetCursorView();

            };

            imgBuscar.Click += delegate {

                //Chama a função GetCursorView para pesquisar todos os registros ou registro
                único de acordo com critérios de pesquisa
                string sqldb_column = "";
                if (txtProdutor.Text.Trim () != "")
                {
                    sqldb_column = "Produtor";
                    GetCursorView (sqldb_column, txtProdutor.Text.Trim ());
                } else
                    if (txtPropriedade.Text.Trim () != "")
                    {
                        sqldb_column = "Propriedade";
                        GetCursorView (sqldb_column, txtPropriedade.Text.Trim ());
                    } else
                        if (txtTalhao.Text.Trim () != "")
                        {
                            sqldb_column = "Talhao";
                            GetCursorView (sqldb_column, txtTalhao.Text.Trim ());
                        } else
                        {
                            GetCursorView ();
                            sqldb_column = "Todos";
                        }
                shMsg.Text = "Buscar " + sqldb_column + ".";

            };

            //Adicionar manipulador de eventos ItemClick a instância ListView
            listItems.ItemClick += new EventHandler<AdapterView.ItemClickEventArgs>
            (item_Clicked);
        }

        //Lançada quando um item de ListView é clicada
        void item_Clicked (object sender, AdapterView.ItemClickEventArgs e)
        {
            //Obtém instância do objeto TextView de Layout record_view
            TextView shId = e.View.FindViewById<TextView> (Resource.Id.Id_linha);
            TextView shPraga = e.View.FindViewById<TextView> (Resource.Id.Praga_linha);
            TextView shDescricao = e.View.FindViewById<TextView> (
            Resource.Id.Descricao_linha);
            TextView shProdutor = e.View.FindViewById<TextView> (
            Resource.Id.Proprietario_linha);
            TextView shPropriedade = e.View.FindViewById<TextView> (
            Resource.Id.Propriedade_linha);
            TextView shTalhao = e.View.FindViewById<TextView> (Resource.Id.Talhao_linha);

            //Lê os valores e conjuntos de instâncias de objetos EditText
            txtPraga.Text = shPraga.Text;
            txtDescricao.Text = shDescricao.Text;
            txtProdutor.Text = shProdutor.Text;
            txtPropriedade.Text = shPropriedade.Text;
            txtTalhao.Text = shTalhao.Text;

            //Exibe mensagens para operações CRUD
            shMsg.Text = shId.Text;
        }
        //Obtém a exibição cursor para mostrar todos os registros
        void GetCursorView()
        {
            Android.Database.ICursor sqldb_cursor = sqldb.GetRecordCursor ();
            if (sqldb_cursor != null)
            {
                sqldb_cursor.MoveToFirst ();
                string[] from = new string[]
                {"_id","Praga","Descricao","Produtor","Propriedade","Talhao" };
                int[] to = new int[] {
                    Resource.Id.Id_linha,
                    Resource.Id.Praga_linha,
                    Resource.Id.Descricao_linha,
                    Resource.Id.Proprietario_linha,
                    Resource.Id.Propriedade_linha,
                    Resource.Id.Talhao_linha
                };

                //Cria um SimpleCursorAdapter para ListView objeto
                SimpleCursorAdapter sqldb_adapter = new SimpleCursorAdapter (this,
                Resource.Layout.Lista_Itens, sqldb_cursor, from, to);
                listItems.Adapter = sqldb_adapter;
            }
            else
            {
                shMsg.Text = sqldb.Mensagem;
            }
        }

        //Obtém a exibição cursor para mostrar registros de acordo com critérios de pesquisa
        void GetCursorView (string sqldb_column, string sqldb_value)
        {
            Android.Database.ICursor sqldb_cursor = sqldb.GetRecordCursor
            (sqldb_column, sqldb_value);

            if (sqldb_cursor != null)
            {
                sqldb_cursor.MoveToFirst ();
                string[] from = new string[]
                {"_id","Praga","Descricao","Produtor","Propriedade","Talhao" };
                int[] to = new int[]
                {
                    Resource.Id.Id_linha,
                    Resource.Id.Praga_linha,
                    Resource.Id.Descricao_linha,
                    Resource.Id.Proprietario_linha,
                    Resource.Id.Propriedade_linha,
                    Resource.Id.Talhao_linha
                };
                SimpleCursorAdapter sqldb_adapter = new SimpleCursorAdapter (this,
                Resource.Layout.Lista_Itens, sqldb_cursor, from, to);
                listItems.Adapter = sqldb_adapter;
            }
            else
            {
                shMsg.Text = sqldb.Mensagem;
            }
        }

        protected override void OnStart ()
        {
            base.OnStart ();
            Log.Debug (tag, "OnStart Chamado");
        }

        // OnResume é chamado toda vez que a atividade começa, então vamos colocar nossas
        RequestLocationUpdates
        // Código aqui, de modo que
        protected override void OnResume ()
        {
            base.OnResume ();
            Log.Debug (tag, "OnResume Chamado");

            // inicializar locação
            locMgr = GetSystemService (Context.LocationService) as LocationManager;

            btLocalizar.Click += delegate {
                //btLocalizar.Text = "GPS";

                // Passar no provedor (GPS),
                // O mínimo de tempo entre as atualizações (em segundos),
                // A distância mínima que o usuário precisa mover-se para gerar uma
                atualização (em metros),
                // E um ILocationListener (lembre-se que esta classe impletents a interface
                ILocationListener)
                locMgr.RequestLocationUpdates (LocationManager.NetworkProvider, 2000, 1, this);
            };
        }
        protected override void OnPause ()
        {
            base.OnPause ();

            // Parar de enviar atualizações de localização quando o aplicativo vai para o fundo
            // Para aprender sobre a atualização do local em segundo plano,
            consulte o guia de backgrounding
            // Http://docs.xamarin.com/guides/cross-platform/application_
            fundamentals/backgrounding/

            // RemoveUpdates leva uma intenção pendente - aqui, nós passamos a atividade atual
            locMgr.RemoveUpdates (this);
            Log.Debug (tag, "A localização parou porque a aplicação está entrando no fundo");
        }

        protected override void OnStop ()
        {
            base.OnStop ();
            Log.Debug (tag, "OnStop Chamado");
        }

        public void OnLocationChanged (Android.Locations.Location location)
        {
            Log.Debug (tag, "Localização mudou");
            latitude.Text = "Latitude: " + location.Latitude.ToString();
            longitude.Text = "Longitude: " + location.Longitude.ToString();
            provedor.Text = "Provedor: " + location.Provider.ToString();
        }
        public void OnProviderDisabled (string provider)
        {
            Log.Debug (tag, provider + " desabilitado pelo usuário");
        }
        public void OnProviderEnabled (string provider)
        {
            Log.Debug (tag, provider + " habilitado pelo usuário");
        }
        public void OnStatusChanged (string provider, Availability status, Bundle extras)
        {
            Log.Debug (tag, provider + " disponibilidade mudou para " + status.ToString());
        }
    }
}
Listagem 4. MainActivity.cs