Você está na página 1de 6

Como usar banco de dados em uma aplicao android

29 de maio de 2010 41 comentrios Um dos grandes diferenciais da plataforma android a grande quantidade de mdulos e

APIs que as aplicaes tem disposio para usar. Eles do muito poder ao desenvolvedores, permitindo que estes faam coisas que eram impossveis em outras plataformas mveis. Um dos mais importantes mdulos o SQLite. Sim, amigos, j temos um SGDB (Sistema gerenciador de bancos de dados) instalado e pronto para usar! E exatamente o que faremos no artigo de hoje. No artigo anterior vimos como criar um Content Provider. Usaremos este provider para acessar o banco de dados. Para fazer isso, precisamos implementar os mtodos da classe ContentProvider que vimos no artigo passado (query(), delete(), update(), etc) para prover ao usurio os mtodos para criar, atualizar, deletar e recuperar os dados. Alm disso, usaremos a classe SQLiteOpenHelper para gerenciar a conexo com o banco de dados.

A classe SQLiteOpenHelper
A classe SQLiteOpenHelper, como dito anteriormente, ser usada para gerenciar o banco de dados. Para us-la, preciso criar uma subclasse implementando os mtodos abaixo:

onCreate() Este mtodo chamado quando a conexo com o banco de dados for aberta pela primeira vez. aqui que criaremos o banco de dados, com o comando sql CREATE. onUpdate() Este mtodo chamado quando a verso do banco de dados muda. Por exemplo, digamos que voc criou uma nova verso de seu aplicativo que usa uma tabela a mais no banco de dados. Quando esta nova verso for instalada (em um telefone que j possuir a primeira verso) este mtodo ser chamado, ento voc poder criar apenas a nova tabela, mantendo os dados do usurio.

O cdigo
O cdigo do QuickNotesProvider fica assim, acessando o banco de dados. A seguir, eu explico algumas coisas que podem gerar dvidas. view plaincopy to clipboardprint?

1. package br.com.felipesilveira.quicknotes; 2. 3. import java.util.HashMap; 4. 5. import android.content.ContentProvider; 6. import android.content.ContentUris; 7. import android.content.Context; 8. import android.content.UriMatcher; 9. import android.net.Uri; 10. import android.provider.BaseColumns; 11. import android.content.ContentValues; 12. import android.database.Cursor; 13. import android.database.sqlite.SQLiteDatabase; 14. import android.database.sqlite.SQLiteOpenHelper; 15. import android.database.sqlite.SQLiteQueryBuilder; 16. 17. public class QuickNotesProvider extends ContentProvider { 18. 19. // Authority do nosso provider, a ser usado nas Uris. 20. public static final String AUTHORITY = 21. "br.com.felipesilveira.quicknotes.quicknotesprovider"; 22. 23. // Nome do arquivo que ir conter o banco de dados. 24. private static final String DATABASE_NAME = "quicknotes.db"; 25. 26. // Versao do banco de dados. 27. // Este valor importante pois usado em futuros updates do DB. 28. private static final int DATABASE_VERSION = 1; 29. 30. // Nome da tabela que ir conter as anotaes. 31. private static final String NOTES_TABLE = "notes"; 32. 33. // 'Id' da Uri referente s notas do usurio. 34. private static final int NOTES = 1; 35. 36. // Tag usada para imprimir os logs. 37. public static final String TAG = "QuickNotesProvider"; 38. 39. // Instncia da classe utilitria 40. private DBHelper mHelper; 41. 42. // Uri matcher - usado para extrair informaes das Uris 43. private static final UriMatcher mMatcher; 44. 45. private static HashMap<string, string=""> mProjection; 46. 47. static { 48. mProjection = new HashMap<string, string="">(); 49. mProjection.put(Notes.NOTE_ID, Notes.NOTE_ID); 50. mProjection.put(Notes.TEXT, Notes.TEXT);

51.

} static { mMatcher = new UriMatcher(UriMatcher.NO_MATCH); mMatcher.addURI(AUTHORITY, NOTES_TABLE, NOTES); } ///////////////////////////////////////////////////////////////// // Mtodos overrided de ContentProvider // ///////////////////////////////////////////////////////////////// @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = mHelper.getWritableDatabase(); int count; switch (mMatcher.match(uri)) { case NOTES: count = db.delete(NOTES_TABLE, selection, selectionArgs); break; default: throw new IllegalArgumentException( "URI desconhecida " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { switch (mMatcher.match(uri)) { case NOTES: return Notes.CONTENT_TYPE; default: throw new IllegalArgumentException( "URI desconhecida " + uri); } }

52. 53. 54. 55.


56.

57. 58. 59. 60. 61. 62.


63.

64. 65. 66. 67.


68.

69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79.
80.

81. 82. 83. 84. 85. 86. 87. 88. 89. 90.

@Override public Uri insert(Uri uri, ContentValues values) { 91. switch (mMatcher.match(uri)) { 92. case NOTES: 93. SQLiteDatabase db = mHelper.getWritableDatabase(); 94. long rowId = db.insert(NOTES_TABLE, Notes.TEXT, values); 95. if (rowId > 0) { 96. Uri noteUri = ContentUris.withAppendedId( 97. Notes.CONTENT_URI, rowId); 98. getContext().getContentResolver().notifyChange( 99. noteUri, null); 100. return noteUri;

101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.
116.

} default: throw new IllegalArgumentException( "URI desconhecida " + uri); } } @Override public boolean onCreate() { mHelper = new DBHelper(getContext());; return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // Aqui usaremos o SQLiteQueryBuilder para construir // a query que ser feito ao DB, retornando um cursor // que enviaremos aplicao. SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); SQLiteDatabase database = mHelper.getReadableDatabase(); Cursor cursor; switch (mMatcher.match(uri)) { case NOTES: // O Builer receber dois parametros: a tabela // onde ser feita a busca, e uma projection // que nada mais que uma HashMap com os campos // que queremos recuperar do banco de dados. builder.setTables(NOTES_TABLE); builder.setProjectionMap(mProjection); break; default: throw new IllegalArgumentException( "URI desconhecida " + uri); } cursor = builder.query(database, projection, selection, selectionArgs, null, null, sortOrder); cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = mHelper.getWritableDatabase(); int count;

117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138.
139.

140. 141. 142. 143. 144. 145. 146.


147.

148. 149.

150. 151. 152.


153.

154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168.
169.

switch (mMatcher.match(uri)) { case NOTES: count = db.update(NOTES_TABLE, values, selection, selectionArgs); break; default: throw new IllegalArgumentException( "URI desconhecida " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } ///////////////////////////////////////////////////////////////// // Inner Classes utilitrias // ///////////////////////////////////////////////////////////////// public static final class Notes implements BaseColumns { public static final Uri CONTENT_URI = Uri.parse("content://" + QuickNotesProvider.AUTHORITY + "/notes"); public static final String CONTENT_TYPE = "vnd.android.cursor.dir/" + QuickNotesProvider.AUTHORITY public static final String NOTE_ID = "_id"; public static final String TEXT = "text"; } private static class DBHelper extends SQLiteOpenHelper { DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSI

170. 171.
172.

; 173. 174. 175. 176.


177.

178. 179. 180.


181.

182. ON);
183.

} 184. 185. /* O mtodo onCreate chamado quando o provider executado pel a 186. * primeira vez, e usado para criar as tabelas no database 187. */ 188. @Override 189. public void onCreate(SQLiteDatabase db) { 190. db.execSQL("CREATE TABLE " + NOTES_TABLE + " (" + 191. Notes.NOTE_ID + " INTEGER PRIMARY KEY AUTOIN CREMENT," + 192. Notes.TEXT + " LONGTEXT" + ");"); 193. } 194.

195. os 196. 197. 198. 199. 200.


201.

/* O mtodo onUpdate invocado quando a verso do banco de dad * muda. Assim, usado para fazer adequaes para a aplicao * funcionar corretamente. */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Como ainda estamos na primeira verso do DB, // no precisamos nos preocupar com o update agora. } } } </string,></string,>

202. 203. 204. 205. 206. 207.

Cursores
O primeiro conceito importante a se falar o conceito dos Cursores. Como voc deve percebido, este o tipo de retorno do mtodo query(), e no por acaso: Os cursores so apontadores de dados do banco de dados ou seja, uma interface que permite o acesso aos dados retornados pela query enviada pelo usurio.

notifyChanges()
Em todos os mtodos em que alteramos o banco de dados (inserimos, deletamos ou modificamos dados) importante chamar o mtodo modifyChanges(). Isso far com que as aplicaes que estejam utilizando este conjunto de dados sejam notificadas, permitindo a estas atualizar tambm os dados mostrados ao usurio. No prximo post iremos usar o QuickNotesProvider na nossa aplicao.

Você também pode gostar