Baixe o app para aproveitar ainda mais
Prévia do material em texto
Centro Universitário Estácio/Fic Análise e Desenvolvimento de Sistemas Programação para Dispositivos Moveis – Milton Escóssia Aluno: Jonathan Willian dos Santos Melo – Matricula: 201401129463 Estudo da utilização do Content Provider em conjunto com SQlite como solução de persistência de dados da App Android Assistente Financeiro. Para compreendermos melhor a utilização do contente provider em conjunto com o Sqlite, vamos destacar o conceito e a utilidade de cada um na programação para Android. O Content Provider é um recurso disponibilizado pelo Android para permitir o compartilhamento de dados entre diferentes aplicações. Isso se faz necessário porque o Android não possui um local comum para guardar os dados das aplicações e compartilhá-los entre todos os pacotes Android. Tal recurso se trata de uma abstração das fontes de dados de camadas inferiores (Exemplo: banco de dados SQLite), além de disponibilizar mecanismos de segurança de dados, como controle de permissão de leitura e escrita de dados, e disponibilizar uma interface padrão para compartilhar dados entre aplicações. Cada Content Provider possui um caminho único. O modelo de dados utilizado pelo Content Provider é como uma simples tabela de banco de dados, onde cada linha é um registro e cada coluna são os dados de um tipo particular. O SQLite é uma biblioteca C que implementa um banco de dados SQL embutido. Programas que usam a biblioteca SQLite podem ter acesso a banco de dados SQL sem executar um processo RDBMS separado. SQLite não é uma biblioteca de cliente usada para conectar com um grande servidor de banco de dados. SQLite é o servidor. A biblioteca SQLite lê e escreve diretamente para e do arquivo do banco de dados no disco. O uso do SQLite é recomendado onde a simplicidade da administração, implementação e manutenção são mais importantes que incontáveis recursos que SGBDs mais voltados para aplicações complexas possivelmente implementam. Entretanto situações onde a simplicidade é a melhor escolha são muito mais frequentes do que pode-se imaginar. Exemplos de uso do SQLite são, não restrito a, sites (com menos de cem mil requisições por dia), dispositivos e sistemas embarcados, aplicações desktop, ferramentas estatísticas e de análise, aprendizado de banco de dados, implementação de novas extensões à SQL. Não se recomenda o uso do SQLite para sites com muitos acessos, grandes quantidades de dados (talvez maior que algumas dúzias de gigabytes), sistemas com grande concorrência, aplicações cliente/servidor. Algumas características do SQLite: . Software livre/domínio público e Multiplataforma; . Mecanismo de armazenamento seguro com transações ACID; . Não necessita de instalação, configuração ou administração; . Implementa a maioria do SQL92; . O Banco de Dados é guardado em um único arquivo; . Suporta bases de dados acima de 2 terabytes; . Sem dependências externas. Para criar um Content Provider em memória secundária usando o Banco SQLite nativo no Android. A interface de Content Provider demanda implementação de alguns métodos, onde alguns deles destacamos: query(Uri, String[], String, String[], String)- usado para recuperar dados. insert(Uri, ContentValues) – usado para inserir dados. update(Uri, ContentValues, String, String[]) – usado para atualizar dados. delete(Uri, String, String[]) – usado para deletar dados. Observe que o parâmetro URI está presente em todos os métodos. Uma URI é o que determina identidade de um provedor de dados. Por exemplo, a URI “content://sms/inbox” pode ser usada para acessar as mensagens contidas no inbox do dispositivo. O aplicativo exemplificado será um assistente financeiro abordado em sala de aula com tela inicial com resumo dos valores por categoria: Despesa, receita e investimento. Tela com lista dos lançamentos financeiros ordenados por data de lançamento. Tela de Cadastro do evento financeiro. A classe de Banco de dados deve herdar a classe SQLiteOpenHelper e os métodos onCreate() e onUpgrade() devem ser chamados. Na primeira vez que essa classe é executada (após a instalação do aplicativo) o método onCreate() é chamado. Sua implementação consiste em criar o banco de dados. Em caso de reinstalação do aplicativo o método onUpgrade() é chamado. Nessa implementação, decidiu-se eliminar o banco de dados já existente. A implementação da classe Sqlite 01 public class ImobilisDataBase extends SQLiteOpenHelper { 02 03 public ImobilisDataBase(Context context) { 04 super(context, DB_NAME, null, DB_VERSION); 05 } 06 07 private static final String TAG = "TutListDatabase"; 08 private static final int DB_VERSION = 1; 09 private static final String DB_NAME = "imobilis_data"; 10 11 public static final String TABLE_CONTACTS = "contact_mail"; 12 public static final String ID = "_id"; 13 public static final String COL_NAME = "name"; 14 public static final String COL_MAIL = "mail"; 15 private static final String CREATE_TABLE_TUTORIALS = "create table " + TABLE_CONTACTS 16 + " (" + ID + " integer primary key autoincrement, " + COL_NAME 17 + " text not null, " + COL_MAIL + " text not null);"; 18 19 @Override 20 public void onCreate(SQLiteDatabase db) { 21 db.execSQL(CREATE_TABLE_TUTORIALS); 22 } 23 24 @Override 25 public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 26 db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 27 onCreate(db); 28 } 29 } Essa classe contém atributos com propriedades de banco e da tabela que está sendo usada. A tabela chama-se “contact_mail” e possui “_id”, “name” e “mail” como atributos. Classe Content Provider Essa classe deverá herdar Content Provider e implementar os métodos conforme mencionado anteriormente. Os principais atributos dessa classe são “mDB” do tipo ImobilisDataBase no qual corresponde ao objeto de manipulação do banco. Uma String “AUTHORITY” usada para formação da URI e outra String “CONTENT_BASE_PATH” na qual irá definir o caminho da tabela. A listagem 2 mostra a implementação da classe contente provider 01 </pre> 02 public class ImobilisContentProvider extensa ContentProvider{ 03 04 private ImobilisDataBase mDB; 05 06 private static final String AUTHORITY = "com.example.imobiliscontentprovider"; 07 private static final String CONTACTS_BASE_PATH = "contacts"; 08 public static final int CONTACTS_CODE = CONTACTS_BASE_PATH.hashCode(); 09 public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY 10 + "/" + CONTACTS_BASE_PATH); 11 12 private static final UriMatcher sURIMatcher = new UriMatcher( 13 UriMatcher.NO_MATCH); 14 static { 15 sURIMatcher.addURI(AUTHORITY, CONTACTS_BASE_PATH, CONTACTS_CODE); 16 } 17 @Override 18 public boolean onCreate() { 19 mDB = new ImobilisDataBase(getContext()); 20 return true; 21 } 22 23 @Override 24 public int delete(Uri uri, String where, String[] whereas) { 25 SQLiteDatabase db = mDB.getWritableDatabase(); 26 27 int count = db.delete(ImobilisDataBase.TABLE_CONTACTS, where, whereArgs); 28 29 getContext().getContentResolver().notifyChange(uri, null); 30 31 return count; 32 } 33 34 @Override 35 public String getType(Uri uri) { 36 // TODO Auto-generated method stub 37 return null; 38 } 39 40 @Override 41 public Uri insert(Uri uri, ContentValues values) { 42 43 if (sURIMatcher.match(uri) != CONTACTS_CODE) { 44 throw new IllegalArgumentException("Unknown URI " + uri);45 } 46 47 SQLiteDatabase db = mDB.getWritableDatabase(); 48 long rowId = db.insert(mDB.TABLE_CONTACTS, ImobilisDataBase.COL_NAME, values); 49 if (rowId > 0) { 50 Uri uriContact = ContentUris.withAppendedId(CONTENT_URI, rowId); 51 getContext().getContentResolver().notifyChange(uriContact, null); 52 return uriContact; 53 } 54 return null; 55 } 56 57 58 59 @Override 60 public Cursor query(Uri uri, String[] projection, String selection, 61 String[] selectionArgs, String sortOrder) { 62 SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 63 queryBuilder.setTables(ImobilisDataBase.TABLE_CONTACTS); 64 65 queryBuilder.appendWhere(ImobilisDataBase.ID + "=" 66 mais uri.getLastPathSegment()); 67 68 Cursor cursor = queryBuilder.query(mDB.getReadableDatabase(), 69 projection, selection, selectionArgs, null, null, sortOrder); 70 cursor.setNotificationUri(getContext().getContentResolver(), uri); 71 return cursor; 72 } 73 74 @Override 75 public int update(Uri uri, ContentValues values, String selection, 76 String[] selectionArgs) { 77 return 0; 78 } 79 80 } 81 <pre> Por fim é necessário declarar o provider criado no manifiest da aplicação 1 </pre> 2 <provider android:name=<em>"com.example.imobiliscontentprovider.contentprovider"</em> android:authorities=<em>" com.example.imobiliscontentprovider.contentprovider"</em> /> 3 <pre> Mostramos como criar um Content Provider no Android para persistência em banco de dados usando SQLite.
Compartilhar