Armazenamento de Dados



Documentos relacionados
Armazenamento de Dados

Android #4. antonio deusany de carvalho junior

Programação para Android. Aula 07: Persistência de dados Shared Preferences, Internal e External Storage

Android e Bancos de Dados

Android Banco de Dados. Ivan Nicoli

Programação para Android. Aula 08: Persistência de dados SQL

Armazenamento de dados

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

persistência de dados

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

Java na WEB Banco de Dados

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ARMAZENAMENTO EM BD NO DM. Prof. Angelo Augusto Frozza, M.Sc.

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ARMAZENAMENTO EM BD NO DM. Prof. Angelo Augusto Frozza, M.Sc.

Comandos de Manipulação

Leonardo Gresta Paulino Murta

Programação Orientada a Objetos JDBC Java Database Connectivity

Android e Bancos de Dados

Integrando Java com Banco de Dados

JDBC. Prof. Márcio Bueno

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Armazenamento em Banco de Dados em Aplicações Android. Prof. Fellipe Aleixo

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br

Introdução à Engenharia da Computação. Banco de Dados Professor Machado

Manipulação de Banco de Dados com Java 1. Objetivos

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Programação para a Plataforma Android Aula 11. Banco de Dados

SQL comando SELECT. SELECT [DISTINCT] <campos> FROM <tabela> [condição] [ ; ] Paulo Damico - MDK Informática Ltda.

Programação com Acesso a Banco de Dados

Aula 1 Acesso a Banco de Dados

Persistência de Classes em Tabelas de Banco de Dados

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

PHP INTEGRAÇÃO COM MYSQL PARTE 1

Programação para Dispositivos Móveis

Prof. Carlos Majer Aplicações Corporativas UNICID

Android e Bancos de Dados

Computação II Orientação a Objetos

Introdução à linguagem SQL

Java & Bancos de Dados Adaptado de Slides da Universidade Salgado de Oliveira Goiânia

Capítulo 04: Persistência com SQLite

INTRODUÇÃO. No entanto, o que pode ser considerado um produto (resultado) da criação de BDs?

Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha

Persistência de Dados

LINGUAGEM SQL. SQL Server 2008 Comandos iniciais

Android BANCO DE DADOS - SQLITE. Prof. Joaquim assunção.

PHP (Seções, Cookies e Banco de Dados)

JDBC Java Database Connectivity

Programação Orientada a Objetos (DPADF 0063)

Programação para Android. Aula 06: Activity, menus e action bar

APOSTILA BANCO DE DADOS INTRODUÇÃO A LINGUAGEM SQL

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

Fernando Freitas Costa. Pós-Graduando em Gestão e Docência Universitária. blog.fimes.edu.br/fernando nando@fimes.edu.br

SQL Server Ferramenta de administração. SQL Server Management Studio. 1º passo conectar ao banco de dados 2ª Query (consulta) usando SQL

Structured Query Language (SQL) Ambiente Simplificado de um SGBD

Android e Bancos de Dados

SQL Structured Query Language

Banco de Dados. Prof. Leonardo Barreto Campos 1

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

MySQL. Prof. César Melo. com a ajuda de vários

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

Introdução à Banco de Dados. Nathalia Sautchuk Patrício

Acesso a Bancos de Dados em Java (JDBC)

Criando Banco de Dados, Tabelas e Campos através do HeidiSQL. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Básico da Linguagem SQL. Definição de Esquemas em SQL. SQL(Structured Query Language)

Banco de Dados. Marcio de Carvalho Victorino Exercícios SQL

SQL TGD/JMB 1. Projecto de Bases de Dados. Linguagem SQL

Structured Query Language (SQL)

Google Drive. Passos. Configurando o Google Drive

SQL. Autor: Renata Viegas

Provedores de Conteúdo

Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos

Banco de Dados. Prof. Antonio

DSS 09/10. DSS 09/10 Que métodos é que fazem parte de cada camada? Aplicações Multi-camada JDBC. Aula 3 DSS 09/10

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

JAVA JDBC COMO FUNCIONA. Programação Orientada a Objetos Flávio de Oliveira Silva 315. Programação Orientada a Objetos Flávio de Oliveira Silva 316

A linguagem SQL

Revisando sintaxes SQL e criando programa de pesquisa. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Linguagem de Consulta Estruturada SQL- DML

Linguagem SQL Sub-linguagem DDL

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Apresentação de um Processo Cria4vo de Desenvolvimento de uma App Android. Realização de Dinâmica Hands- On para Construção de uma App Android

BANCO DE DADOS BANCO DE DADOS. Prof. Patrícia Lucas 3º Trimestre

Tutorial: Utilização do sqlite no Android (Parte I)

Python Acessando o Banco de Dados MySQL

JAVA JDBC Java Database Connectivity

RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS

UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN CURSO SUPERIOR DE TECNOLOGIA EM SISTEMAS PARA INTERNET. Programação para Internet I

Linguagem SQL (Parte I)

Como funcionam os comandos de SQL no Logic Basic Por Alan Oliveira

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

Noções de. Microsoft SQL Server. Microsoft SQL Server

JDBC. Java DataBase Connectivity

Armazenamento organizado facilitando SCRUD; Agiliza processo de desenvolvimento de sistemas;

Banco de Dados I. Aula 12 - Prof. Bruno Moreno 04/10/2011

Programação SQL. Introdução

Transcrição:

Persistência...

Armazenamento de Dados Diversas opções para armazenar dados da aplicação. A escolha de acordo com a necessidade: dados privados ou públicos, quantidade de espaço necessário, etc. 2

Armazenamento de Dados Shared Preferences Armazena dados primitivos em um conjunto de pares do tipo chave valor; Internal Storage Armazena dados privados na memória do dispositivo; External Storage Armazena dados públicos na mídia externa de armazenamento; SQLite Databases Armazena dados estruturados em um banco de dados privado; Network Connection Armazena dados na web com o seu próprio servidor de rede. 3

Shared Preferences Provê um framework para salvar e recuperar pares de dados primitivos do tipo chave-valor. Dados armazenados mesmo quando a aplicação é finalizada. obter instância de SharedPreferences: getsharedpreferences() se precisar de múltiplos arquivos de preferências identificados por um nome que é passado como parâmetro; getpreferences() se precisar de um único arquivo de preferências para a Activity. Como se trata de um único arquivo, não é necessário fornecer um nome. 4

Shared Preferences 5

Utilizando o SharedPreferences para ler informações Uma string, nome, que será a chave para indicar o SharedPreferences SharedPreferences prefs = getsharedpreferences (nome, modo ); modo: indica a permissão 0 - modo privado. É possível utilizar vários SharedPreferences por aplicação Para ler os dados chamar o método get correspondente ao tipo de informação que você quer. Em SharedPreferences você só pode armazenar informações de tipo primitivo e Strings. String somestring = prefs.getstring (chave, null ); int someint = prefs.getint ( outrachave, 0); O segundo parâmetro indica um valor padrão caso a chave não seja encontrada. 6

Utilizando o SharedPreferences para gravar informações Para salvar os dados no SharedPreferences é necessário usar um editor. SharedPreferences prefs = getsharedpreferences (nome, modo ); Editor editor = prefs. edit (); editor.putstring ("curso", android"); editor.commit (); É necessário chamar o método commit() no final, senão as alterações não serão salvas. 7

ShardPreferences Métodos boolean contains(string key) boolean getboolean(string key, boolean) float getfloat(string key, float) int getint(string key, int) long getlong(string key, long) String getstring(string key, String) SharedPreferences.Edit edit() Retorna true caso a chave key exista. Retorna o valor de uma chave. O segundo parâmetro indica o valor default que deve ser retornado caso a chave não exista. Note que é necessário que o desenvolvedor saiba o tipo do dado armazenado na chave. Caso a chave exista mas o tipo seja diferente do especificado no método será lançado um ClassCastException. Retorna um editor para as preferências que permite editar e salvar informações. 8

SharedPreferences.Editor Usada para editar as preferências boolean commit() Salva as preferências no objeto SharedPreferences associado e em disco. Operação síncrona, ou seja, só retorna após ter salvo em disco retornando true em caso de sucesso, ou false senão. void apply() Aplica os novos valores das preferências ao objeto em memória e retorna. O armazenamento em disco será feito de forma assíncrona, ou seja, não é possível saber se houve algum error durante o armazenamento. clear() putboolean(string key, boolean) putfloat(string key, float) putint(string key, int) putlong(string key, long) putstring(string key, String) remove(string key) Remove todos os valores de preferências do objeto. Adiciona ou altera o valor de uma chave. O nome do método e o segundo parâmetro indicam o tipo do valor da chave. Remove a chave definida por key e consequentemente o seu valor. 9

Exemplo //Restaura as preferencias gravadas SharedPreferences settings = getsharedpreferences(prefs_name, 0); etusuario.settext(settings.getstring("prefusuario", "")); /**Chamado quando a Activity é encerrada.*/ @Override protected void onstop(){ super.onstop(); //Caso o checkbox esteja marcado gravamos o usuário CheckBox chksalvar = (CheckBox)findViewById(R.id.chkSalvar); if (chksalvar.ischecked()){ SharedPreferences settings = getsharedpreferences(prefs_name, 0); SharedPreferences.Editor editor = settings.edit(); editor.putstring("prefusuario", etusuario.gettext().tostring()); } } //Confirma a gravação dos dados editor.commit();

Internal Storage Para criar e escrever em um arquivo privado para a memória interna, chama-se o método openfileoutput() com o nome do arquivo e o tipo de operação, obtendo-se um FileOutputStream. Em seguida, basta escrever com o write() e finalizar com close(). Para ler um arquivo da memória interna, chama-se o método openfileinput() passando o nome do arquivo a ser lido como parâmetro. Esse método retorna um FileInputStream. Assim, basta ler com read() e finalizar com close(). 11

Internal Storage É possível armazenar arquivos como cache, usando o método getcachedir() para obter uma instância de File na qual sua aplicação possa salvar arquivos temporários de cache. Quando o dispositivo está com pouca memória, o Android pode excluir os arquivos de cache para recuperar espaço. Contudo, é responsabilidade do desenvolvedor manter seus arquivos de cache e usar apenas um espaço razoável com os mesmos, como 1MB. A o desinstalar o aplicativo, os arquivos de cache do mesmo são removidos. 12

Internal Storage Outros métodos interessantes: getfilesdir() retorna o caminho absoluto dos arquivos salvos; getdir() Cria ou abre um diretório para armazenamento interno; deletefile() Exclui um arquivo; filelist() Lista de arquivos atualmente salvos por sua aplicação. 13

External Storage Todo dispositivo Android suporta uma mídia externa de armazenamento: cartão removível (como SD Card) ou espaço de armazenamento interno (não removível). Em ambos os casos, os arquivos podem ser lidos e modificados por outras aplicações ou pelo usuário quando se conecta o dispositivo via USB para transferência de dados. 14

External Storage Antes de se trabalhar com o armazenamento externo, deve-se chamar o método getexternalstoragestate() para verificar se a mídia está disponível: 15

Acessando arquivos em um External Storage API Level 8 (Android 2.2) ou superior, usa-se o método getexternalfilesdir() para obter um File que representa o diretório da mídia externa em que se deve salvar seus arquivos. Esse método recebe como parâmetro o tipo de subdiretório desejado, tais como DIRECTORY_MUSIC ou DIRECTORY_RINGTONES. Caso se deseje armazenar na raiz, passa-se null como parâmetro. API Level 7 (Android 2.1) ou inferior, usa-se o getexternalstoragedirectory(). Os dados serão armazenados em /Android/data/nome_do_pacote/files/. O nome do pacote é no estilo Java, por exemplo: com.example.android.app. Caso o usuário desinstale a aplicação, esse diretório e todo o seu conteúdo será excluído. 16

Salvando arquivos que devem ser compartilhados Caso se queira salvar arquivos que não são específicos da aplicação e devem permanecer mesmo após a aplicação ser desinstalada, basta salvá-los em diretórios de armazenamento públicos, tais como Music/, Pictures/, Ringtones/ e outros. API Level 8 ou superior, usa-se getexternalstoragepublicdirectory() passando como parâmetro o tipo de diretório público que se deseja, tais como: DIRECTORY_MUSIC, DIRECTORY_PICTURES, etc. API Level 7 ou inferior, usa-se o getexternalstoragedirectory(). Em seguida, salva-se os arquivos compartilhados em algum desses diretórios: Music/, Podcasts/, Ringtones/, Alarms/, Notifications/, Pictures/, Movies/ e Download/. 17

Salvando arquivos externos de cache Na API Level 8 ou superior, usa-se getexternalcachedir(). API Level 7 ou inferior, usa-se o getexternalstoragedirectory(). salva-se os dados de cache no seguinte diretório: /Android/data/nome_do_pacote/cache/ O nome do pacote é no estilo Java. Por exemplo: com.example.android.app. 18

Resumindo a Classe Environment 19

Banco de Dados SQLite Android provê suporte completo a bancos de dados SQLite. Os bancos criados serão acessíveis pelo nome para qualquer classe da aplicação, mas não poderão ser acessados externamente. 20

Criando um banco de dados Para se criar um banco de dados, pode-se usar o método openorcreatedatabase() do contexto. É recomendado criar uma subclasse de SQLiteOpenHelper e sobrescrever o método oncreate() para a criação das tabelas. 21

SQLiteOpenHelper O construtor de SQLiteOpenHelper recebe quatro parâmetros. context Usado para abrir ou criar banco de dados name nome do database; null para database na memória factory usado para criar cursores, or null para o padrão version Número da versão do database (começando de 1); A versão do banco de dados é muito útil para o caso de o banco já existir e precisar ser atualizado (através da adição de novas tabelas e/ou colunas, por exemplo). 22

SQLiteOpenHelper Com uma instância dessa subclasse obtida por meio do construtor criado, tem-se acesso a dois métodos que retornam um SQLiteDatabase: getwritabledatabase() inserção, edição e remoção de dados, e getreadabledatabase() consulta de dados. 23

Consultas Pode-se executar consultas no SQLite usando o método query() de SQLiteDatabase que permite a passagem de diversos parâmetros, tais como: tabela a ser consultada, projeção, seleção, colunas, agrupamento e outros. Para consultas complexas, pode-se usar uma instância de SQLiteQueryBuilder. Cada consulta retorna um objeto Cursor que aponta para todos os registros encontrados pela query. Por meio do objeto Cursor que se navega entre os resultados. Usam-se os métodos insert() e delete() de SQLiteDatabase para inserção e remoção de registros, respectivamente. 24

SQLiteDatabase - query() As consultas com query() retornam um Cursor para navegação e recebem diversos parâmetros, cada qual com sua utilidade para a consulta. 25

SQL - Structured Query Language Linguagem padrão para consulta a bancos de dados Construções básicas SELECT Campo1, Campo2,... FROM Tabela1, Tabela2 WHERE <condição> ORDERBY CampoX; INSERT INTO Tabela(Campo1, Campo2,...) VALUES (Valor1, Valor2,...); DELETE FROM Tabela WHERE <condição>; UPDATE Tabela SET Campo1 = <expressao1>, Campo2 = <expressao2> WHERE <condição>; Criação e exclusão de tabelas CREATE TABLE Tabela ( id INTEGER PRIMARY KEY AUTOINCREMENT, Campo1 Tipo1 [[UNIQUE] NOT NULL], Campo2 Tipo2 [NOT] NULL,...); []=opcional DROP TABLE IF EXISTS Tabela 26

SQL Exemplos de <expressão> Preço Taxas LENGTH(Tabela.Nome) Tabela.Idade IS [NOT] NULL Exemplos de <condição> (Nome = Maria OR Nome = João ) AND Idade <= 40 AND Idade >= 18 LENGTH(Nome) > 4 Preço Taxas > 10.0 Tipos INTEGER, REAL, TEXT 27

Criação do banco de dados API do Android (executar SQL) Adotado aqui pois permite criar pela aplicação Cliente gráfico do SQLite SQLite Expert Personal (gratuito) www.softsland.com/sqlite_expert_personal.html Usando SQL via linha de comando Programa na pasta do SDK do Android <pasta_android>\android-sdk-windows\tools\sqlite3.exe Nos 2 últimos, após criar, é preciso mover o arquivo para a pasta /data/data/<pacote>/databases do emulator No eclipse (com emulador aberto): Window > Show view > Other... > FileExplorer 28

Resumo da Classe SQLiteOpenHelper Auxilia abertura e criação de um banco de dados SQLiteOpenHelper(Context, String name, SQLiteDatabase.CursorFactory, int version) SQLiteDatabase getreadabledatabase() Cria um objeto para auxiliar no gerenciamento da base de dados. Cria ou abre um banco de dados apenas para leitura. SQLiteDatabase getwritabledatabase() Cria ou abre um banco de dados para leitura e escrita. void oncreate(sqlitedatabase db) void onopen(sqlitedatabase db) void onupgrade(sqlitedatabase db, int oldversion, int newversion) Chamado quando o banco de dados precisa ser criado, ou seja, não existe. Chamado quando o banco de dados é aberto. Chamado quando a versão do banco de dados sendo aberto é diferente da versão existente. 29

Resumo da Classe SQLiteDatabase Representa o banco de dados e executa operações de consulta, inclusão, alteração e exclusão de registros static SQLiteDatabase opendatabase(string path, CursorFactory factory, flags) Abre banco de dados de acordo com os flags: OPEN_READWRITE, OPEN_READONLY, CREATE_IF_NECESSARY, NO_LOCALIZED_COLLATORS. static SQLiteDatabase openorcreatedatabase(string path, CursorFactory factory) static SQLiteDatabase openorcreatedatabase(file file, CursorFactory factory) Abre ou cria banco de dados. Equivalente a usar opendatabase( ) com flags = CREATE_IF_NECESSARY boolean isopen() Verifica se está aberto void close() void execsql(string sql) Fecha banco de dados Executa script SQL que não seja SELECT. Exemplo: CREATE TABLE, INSERT, UPDATE, etc. 30

Resumo da Classe SQLiteDatabase Cursor query(string table, String[] columns, String selection, String[] selectionargs, String groupby, String having, String orderby) Cursor query(table, columns, selection, selectionargs, groupby, having, orderby, limit) Cursor query(boolean distinct, table, columns, selection, selectionargs, groupby, having, orderby, String limit) long insert(table, null, ContentValues values) int update(table, ContentValues values, whereclause, whereargs) Mostra e executa um SQL de consulta na forma: SELECT <distinct> <columns> FROM <table> WHERE <selection+selectionargs> GROUP BY <groupby> HAVING <having> ORDER BY <orderby> LIMIT <limit> Insere um registro e retorna o id. INSERT INTO <table> (values) VALUES (values) Altera registro(s) e retorna quantidade de linhas modificadas. UPDATE <table> SET <values> WHERE <whereclause+whereargs> int delete(table, whereclause, whereargs) Deleta registro(s) e retorna quantidade de linhas modificadas. DELETE FROM <table> WHERE <whereclause+whereargs> 31

Classes ContentValues e Cursor ContentValues Usado para armazenar o conteúdo de um registro para uma operação Equivalente a um HashMap Cursor put(string key, valor) Equivalente a um ResultSet no JDBC Lista de resultados de uma consulta no banco 32

Usando o SQLite Para utilizar o SQLite, é necessário que você crie uma subclasse de SQLiteOpenHelper. Em seguida é necessário sobrescrever os métodos OnCreate() e OnUpgrade(). O primeiro é chamado quando ainda não existe um banco de dados, nele você deve incluir os comandos para criar tabelas e inicializar qualquer tipo de dados, se preciso. O segundo é chamado quando a versão da base de dados é alterada, e nele você deve incluir quaisquer comandos relacionados à alteração do esquema, como alterações em tabelas e colunas. 33

Exemplo public class CustomSQLiteOpenHelper extends SQLiteOpenHelper { public static final String TABLE_NOTES = " notes "; public static final String COLUMN_ID = " _id "; public static final String COLUMN_NOTES = " note "; private static final String DATABASE_NAME = " notes.db"; private static final int DATABASE_VERSION = 1; // Database creation sql statement private static final String DATABASE_CREATE = " create table " + TABLE_NOTES + "(" + COLUMN_ID + " integer primary key autoincrement, +COLUMN_NOTES + " text not null );"; public CustomSQLiteOpenHelper ( Context context ) { super ( context, DATABASE_NAME, null, DATABASE_VERSION ); } 34

Exemplo @Override public void oncreate ( SQLiteDatabase database ) { database. execsql ( DATABASE_CREATE ); } @Override public void onupgrade ( SQLiteDatabase db, int oldversion, int newversion ) { db. execsql (" DROP TABLE IF EXISTS " + TABLE_NOTES ); oncreate (db); } } 35

Usando DAO (encapsular acesso ao DB) public class NotesDao { private SQLiteDatabase database ; private String [] columns = { CustomSQLiteOpenHelper. COLUMN_ID, CustomSQLiteOpenHelper. COLUMN_NOTES }; private CustomSQLiteOpenHelper sqliteopenhelper ; public NotesDao ( Context context ) { sqliteopenhelper = new CustomSQLiteOpenHelper ( context ); } public void open () throws SQLException { database = sqliteopenhelper. getwritabledatabase (); } public void close () { sqliteopenhelper. close (); } 36

Usando DAO public Note create ( String note ) { ContentValues values = new ContentValues (); // inserindo na tabela values. put ( CustomSQLiteOpenHelper. COLUMN_NOTES, note ); long insertid = database. insert ( CustomSQLiteOpenHelper. TABLE_NOTES, null, values ); // realizando leitura da nota inserida Cursor cursor = database. query ( CustomSQLiteOpenHelper. TABLE_NOTES, columns, CustomSQLiteOpenHelper. COLUMN_ID + " = " + insertid, null, null, null, null ); cursor. movetofirst (); } // criando uma Note para retornar Note newnote = new Note (); newnote. setid ( cursor. getlong (0) ); newnote. setnote ( cursor. getstring (1) ); cursor. close (); return newnote ; 37

Usando DAO public void delete ( Note note ) { long id = note. getid (); database. delete ( CustomSQLiteOpenHelper. TABLE_NOTES, CustomSQLiteOpenHelper.COLUMN_ID + " = " + id, null ); } public List <Note > getall () { List <Note > notes = new ArrayList <Note >() ; Cursor cursor = database. query ( CustomSQLiteOpenHelper.TABLE_NOTES, columns, null, null, null, null, null ); cursor. movetofirst (); while (! cursor. isafterlast ()) { Note note = new Note (); note. setid ( cursor. getlong (0) ); note. setnote ( cursor. getstring (1) ); notes. add ( note ); cursor. movetonext (); } cursor. close (); return notes ; } } 38

Network Connection Há, ainda, uma quinta forma de persistência em Android: o armazenamento remoto. Pode-se usar uma rede (quando disponível) para armazenar e recuperar dados de seus serviços baseados na Web. Para realizar operações na rede, usam-se classes dos seguintes pacotes: java.net; android.net. 39