Вы находитесь на странице: 1из 6

10/05/2015 AndroidPersistnciadeDadosusandoSQLite

Anterior PrximoSwitchtoourmobilesite

AndroidPersistnciadeDadosusandoSQLite
Postado15dejulhode2013porLucianoLuzzi

ComomencionadonoTutorialdeAndroiddeRenanDrabach,namaioriadasaplicaesprecisamosteralgum
tipo de persistncia de dados. Sabendo disso, neste tutorial vamos atender esta necessidade utilizando o
bancodedadosSQLite.

Paraintroduodecomocobrirpontosmaisbsicos,comoacriaodeaplicaes/projetos,vejaoTutorialde
PrimeirosPassosnoAndroiddeRogerMack.

PorqueSQLite?

O SQLite um banco autocontido, compacto, com suporte nativo no Android e sem necessidade de
configurao ou instalao. Isto tornao a escolha natural para um ambiente em que devemos prezar por
desempenho,disponibilidadedememriaepraticidadedeuso.

Criandoabase

Para criar o banco de dados, primeiro devemos criar uma classe (DatabaseHelper, no nosso exemplo) e
estenderdaclasseSQLiteOpenHelper,conformesegueabaixo:

1. publicclassDatabaseHelperextendsSQLiteOpenHelper{
2.
3. privatestaticfinalintDATABASE_VERSION=2
4.
5. DatabaseHelper(Contextcontext){
6. super(context,DATABASE_NAME,null,DATABASE_VERSION)
7. }
8. }

Oconstructordaclassecriaobancocomonome(DATABASE_NAME)eaverso(DATABASE_VERSION)
do banco de dados. Por padro, o banco ser criado no seguinte caminho: //data/data/(Pacoteda
Aplicao)/databases/(NomedoBanco)

Pode ser interessante crilo no armazenamento externo para termos uma maior acessibilidade. Neste caso,
alteramosachamadaparaaseguinte:

1. super(context,Environment.getExternalStorageDirectory().getAbsolutePath()
2. +"/nomedaaplicacao/database/"+DATABASE_NAME,null,DATABASE_VERSION)

Istofeito,sobrescrevemosomtodoonCreatedasuperclasse.neleondeaconteceacriaodastabelas.

1. privatestaticfinalStringDICTIONARY_TABLE_CREATE=

http://www.mobiltec.com.br/blog/index.php/androidpersistenciadedadosusandosqlite/ 1/6
10/05/2015 AndroidPersistnciadeDadosusandoSQLite
2. "CREATETABLE"+DICTIONARY_TABLE_NAME+"("+
3. "NOMETEXT,"+
4. "VALORTEXT)"
5. @Override
6. publicvoidonCreate(SQLiteDatabasedb){
7. db.execSQL(DICTIONARY_TABLE_CREATE)
8. }

Nocasoacima,estamoscriandoobancodedadosdemaneiraprtica,apartirdeumaqueryarmazenadaem
umastring. Caso opte por uma soluo mais elegante, crie o script SQL necessrio para a criao de todo o
banco,faaainclusodelenoprojetoecoloqueobancoparafazersualeituraapartirdestearquivo.

Noexemploabaixo,estamoslendoumscriptSQLdapastaassets,dentrodoprojeto.

AsconstantesDatabaseConstantes.FOLDER_DATABASE_ASSETSe
DatabaseConstantes.FILE_SCRIPT_DATABASEindicamopathenomedoarquivoaserlido.

1. @Override
2. publicvoidonCreate(SQLiteDatabasedb){
3. createTables(db)
4. }
5.
6. privatevoidcreateTables(SQLiteDatabasedb){
7. AssetManagermanager=context.getAssets()
8.
9. InputStreaminputStream=null
10. BufferedReaderreader=null
11.
12. try{
13. inputStream=manager.open(DatabaseConstants.FOLDER_DATABASE_ASSETS
14. File.separator+DatabaseConstants.FILE_SCRIPT_DATABASE
15.
16. reader=newBufferedReader(newInputStreamReader(inputStream
17.
18. StringBuilderstringBuilder=newStringBuilder()
19.
20. Stringline=null
21. while((line=reader.readLine())!=null){
22. stringBuilder.append(line)
23. }
24.
25. String[]sqls=stringBuilder.toString().split("")
26.
27. for(Stringsql:sqls){
28. db.execSQL(sql)
29. }
30.
31. }catch(IOExceptione){
32. throwe
33. }finally{
34. try{
35. if(inputStream!=null){
36. inputStream.close()
37. }
38.
39. if(reader!=null){
40. reader.close()
41. }
42. }catch(IOExceptione){
43. throwe
44. }
45. }
46. }

Devemos tambm sobrescrever o mtodo onUpgrade. Este mtodo chamado automaticamente quando
detectado um incremento no nmero de verso do banco de dados. Nele podemos efetuar qualquer operao,
comodroparoualteraralgumatabela.Omtodoexecutadodentrodeumatransao,entoseumaexceo
forlanada,umrollbackexecutado.

O funcionamento do mtodo o mesmo do onCreate. Deste modo, podemos efetuar o upgrade do banco
atravsdeoutroarquivo.sqlcolocadodentrodenossoprojeto.

http://www.mobiltec.com.br/blog/index.php/androidpersistenciadedadosusandosqlite/ 2/6
10/05/2015 AndroidPersistnciadeDadosusandoSQLite
INSERT,SELECT,UPDATEeDELETE

O gerenciamento do banco e a execuo de queries feita a partir da classe SQLiteDatabase sendo


relativamentesimples.

Aseguir,segueumexemplodecadaumadasoperaesbsicasutilizadasembanco:Insert,Select,Updatee
Delete.

Parademonstrar,utilizaremosumatabelacomumdeusuriocomNome,LogineSenha,eumaclassemodelo
Usurio,comcamposequivalentesaosdatabela.

SELECT

1. publicUsuarioselect(StringuserLogin)throwsException{
2. Usuariousuario=null
3. Cursorcursor=null
4.
5. SQLiteDatabasesqlLite=newDatabaseHelper(context).getReadableDatabase
6.
7. Stringwhere="LOGIN=?"
8.
9. String[]colunas=newString[]{LOGIN,NOME,SENHA}
10.
11. Stringargumentos[]=newString[]{userLogin}
12.
13. cursor=sqlLite.query(UsuarioTable.TABLE_NAME,colunas,where
14.
15. if(cursor!=null&amp&ampcursor.moveToFirst()){
16. usuario=newUsuario()
17. usuario.setLogin(cursor.getString(cursor.getColumnIndex
18. usuario.setNome(cursor.getString(cursor.getColumnIndex
19. usuario.setSenha(cursor.getString(cursor.getColumnIndex
20. }
21.
22. if(cursor!=null)
23. cursor.close()
24.
25. returnusuario
26. }

Acima,temosummtodoquerecebeologindousurioedevolveumobjetodeUsuariopopuladocomlogin,
nomeesenha.

Na quarta linha do cdigo, instanciamos a nossa classe DatabaseHelper e, atravs dela, retornamos um
objeto de banco SQLite. importante notar que guardamos os nomes das colunas da tabela Usuario em
constantes,paratermosmaioracessibilidadeefacilidadenahoradamanuteno.

Navarivelwhere temos a condio/filtro do select. Como buscamos um usurio que tenha o login igual ao
que passamos por parmetro para o mtodo, devemos colocar o nome da table e um placeholder que ser
substitudopelonossoargumento.

AscolunasaserretornadassoarmazenadasemumvetordeString,bemcomoosargumentosdoselect.

O mtodo query recebe como parmetros o nome da tabela a percorrer, as colunas a selecionar, a
condio/wheredaseleo,osargumentosdowhere,seguidodepossveisgroupBy,havingeorderBy,queem
nossocasoforammantidosnulos.

Instanciamos a nossa varivel da interface Cursor, que ir nos prover os mtodos necessrios para acessar
osvaloresretornadosapartirdoresultadodaquery.

Emseguida,verificamosseainstnciadeCursornula(nocasodenoexistiremresultados),instanciamos
epopulamosnossoobjetodeUsuarioatravsdosmtodosdocursor.
Tambmverificamossepossvelmoverocursorparaasuaprimeiraposio,oqueretornafalsecasoocursor
estejavazio.

OmtodogetStringdaclassecursorretornaumvalordotipostring,erecebeporparmetroondicedacoluna
quequeremospegarovalor.

Paraumamaiorcompreensodocdigo,maiorseguranaefacilidadedemanuteno,buscamosondiceda
colunautilizandoomtodogetColumnIndexpassandoonomedacoluna.

http://www.mobiltec.com.br/blog/index.php/androidpersistenciadedadosusandosqlite/ 3/6
10/05/2015 AndroidPersistnciadeDadosusandoSQLite
Porfim,fechamosainstnciadoCursor,liberandoosseusrecursoseretornamosousurio.

INSERT

1. publiclonginsert(Usuariousuario)throwsException{
2. SQLiteDatabasesqlLite=newDatabaseHelper(context).getWritableDatabase
3.
4. ContentValuescontent=newContentValues()
5.
6. content.put(LOGIN,usuario.getLogin())
7. content.put(NOME,usuario.getNome())
8. content.put(SENHA,usuario.getSenha())
9.
10. returnsqlLite.insert(UsuarioTable.TABLE_NAME,null,content)
11. }

Nesteexemplodeinsert,recebemosumobjetodeUsuariojpopuladocomosseusvaloresdelogin,nomee
senha.Valenotarquenasegundalinhadocdigo,utilizamosogetWritableDatabase(),enquantonoexemplodo
select utilizamos o getReadableDatabase(): Isto porque no select no precisamos de permisso de escrita,
apenasdeleitura.

Utilizamos a classe ContentValues para armazenar a nossa relao chave/valor. Fazemos isso atravs do
mtodoput, que recebe o nome da chave e o valor dela. Mais uma vez, utilizamos constantes no nome das
colunasaoinvsdeumastringhardcoded.

Logo aps, inserimos os nossos valores no banco utilizando o mtodo insert. importante notar que este
mtodotemcomoretornoumlongindicandooIDdalinhainseridaenolanaexceoemcasodeerro,apenas
retornaumvalor1casoainseronotenhaxito.Porissoretornamosovalordoinsert,paraquesejatratado
umnvelacima.

UPDATE

1. publicintupdate(Usuariousuario)throwsException{
2. SQLiteDatabasesqlLite=newDatabaseHelper(context).getWritableDatabase
3.
4. ContentValuescontent=newContentValues()
5.
6. content.put(LOGIN,usuario.getLogin())
7. content.put(NOME,usuario.getNome())
8. content.put(SENHA,usuario.getSenha())
9.
10. Stringwhere="LOGIN=?"
11.
12. Stringargumentos[]{usuario.getLogin()}
13.
14. returnsqlLite.update(UsuarioTable.TABLE_NAME,content,where
15. }

O mtodo update bastante similar aos dois anteriores, recebendo tanto a condio/where quanto a classe
comaschaves/valordoinsert.

Omtodoupdatetemcomoretornoumintindicandoonmeroderowsafetadas.

DELETE

1. publicintdelete(Stringlogin){
2. SQLiteDatabasesqlLite=newDatabaseHelper(context).getWritableDatabase
3.
4. Stringwhere="LOGIN=?"
5.
6. String[]args=newString[]{login}
7.
8. returnsqlLite.delete(UsuarioTable.TABLE_NAME,where,args)
9. }

http://www.mobiltec.com.br/blog/index.php/androidpersistenciadedadosusandosqlite/ 4/6
10/05/2015 AndroidPersistnciadeDadosusandoSQLite
Omtododeletebastantesimples,recebendoapenasonomedatable,acondioeosargumentosparaa
deleo.

Tem como valor de retorno um int indicando o nmero de linhas afetadas. Retorna zero caso nenhuma
condiowhere tenha sido passada, mas para deletar todas as linhas e receber um count possvel passar o
valorpara1.

Concluso

Conformevimos,abibliotecanativadoAndroidemconjuntocomoSQLitetornaamanipulaodebancode
dados uma tarefa simples em qualquer aplicao, sendo possvel armazenarmos dados no dispositivo sem
maiorespreocupaes.

VimosataquiobsicodapersistnciadedadosutilizandoAndroideSQLite,osuficienteparaajudlosadar
osprimeirospassoseesperamosinstiglosaconhecermais.

Cabe dizer que o SQLite possui certas peculiaridades per se, mas isto assunto para outro post nesta
mesmahora,nestemesmocanal.

EscritoporLucianoLuzzi.

Share 3 Curtir 17 0 Share 17 Tweet 1

PostRelacionados

TUTORIALAndroidParte4PersistnciadeDados
DesvendandoasDataInteractionsdoEspresso
TestesdeInterfacecomoEspresso
PersistnciadedadoscomoPhonegap
NotificaesPushemAndroid

EssepostfoipublicadoemAndroid,TutorialporLucianoLuzzi

TagsAndroid,OperaesBsicas,PersistnciadeDados,Query,SQLite,SQLiteDatabase,Tutorialde
Android

4THOUGHTSONANDROIDPERSISTNCIADEDADOSUSANDOSQLITE

PedroFerreira
nodia29denovembrode2013at1:27amfalou:

Ol!
EstoufazendofaculdadedeAnliseegostariadesaberseessasclassesforamcriadasnoprrpio
SQLiteounumaferramentadotipoEclipse/NetBeans.NuncauseioSQLitemasprecisareidaquih
algunsmeses.

LucianoLuzzi
nodia29denovembrode2013at12:54pmfalou:

OlPedro.
Noseiseentendibematuapergunta,asclassesusadasnestepostsotodasdoframeworkdo
prprioandroid.

TodocdigodeexemplodessepostfoiescritoeexecutadonoEclipse.

marcos
nodia16dejaneirode2014at9:40amfalou:

DumaolhadaemumaferramentagratuitaValentinaStudio.Produtosurpreendente!IMOesteo
melhorgerenteparaoSQLiteparatodasasplataformas.http://www.valentinadb.com/en/valentina
studiooverview

http://www.mobiltec.com.br/blog/index.php/androidpersistenciadedadosusandosqlite/ 5/6
10/05/2015 AndroidPersistnciadeDadosusandoSQLite

CharlesMendes
nodia4defevereirode2014at11:36amfalou:

Excelente!muitofciltrabalharcomoSQLite,timotutorial

http://www.mobiltec.com.br/blog/index.php/androidpersistenciadedadosusandosqlite/ 6/6

Вам также может понравиться