BancodeDados
IntroduoalinguagemSQL ObancodedadosSQLite ComocriaremanipularumbancodedadosemAndroid Comoapresentardadosnateladoaparelhocelular Comocriarumlogsimplesdeeventos QuaissoasestruturasdedadosmaiscomunsemJava?
SQLite
Androiddisponibilizaumbancodedados chamadoSQLite. SQLiteobancodedadospadroemvrias outrasaplicaes:Firefox,iPhone,Symbia, Skype,etc. SQLitenopossuilicena,sendodedomnio Para usar SQLite, pblico.
preciso saber um pouco de SQL. Vocs lembram de alguma query?
ComandosdeDenio
Paracriarumatabela,podemosusaro comandoabaixo:
createtablemytable( _idintegerprimarykeyautoincrement, nametext, phonetext Qu al o quais is a m E ); signica s ns
do desse com ando?
ComandosdeModicao
Parainseriralgumasentradasemnossobanco dedadosdeexemplo,podemosusaros comandosabaixo:
insertintomytablevalues(null,'StevenKing','5551212'); insertintomytablevalues(null,'JohnSmith','5552345'); insertintomytablevalues(null,'FredSmitheizen','5554321');
Falta uma categoria de comandos
ComandosdeConsulta
OquefazemosseguintescomandosSQL?
select*frommytablewhere(_id=3); selectname,phonefrommytablewhere(namelike"%smith%");
LogdeEventos
Logando Eventos
Crie um banco de dados que logue eventos. Um evento possui um ttulo e o tempo em que aconteceu. Eventos so criados via um mtodo addEvents(ttulo).
EventsData.java
OBancodeDados
importsta*candroid.provider.BaseColumns._ID; importsta*ccom.aula11.Constants.TABLE_NAME; importsta*ccom.aula11.Constants.TIME; importsta*ccom.aula11.Constants.TITLE; publicclassEventsDataextendsSQLiteOpenHelper{ privatestahcnalStringDATABASE_NAME="events.db"; E o que faz esse privatestahcnalintDATABASE_VERSION=1; comando SQL? publicEventsData(Contextctx){ super(ctx,DATABASE_NAME,null,DATABASE_VERSION); } publicvoidonCreate(SQLiteDatabasedb){ db.execSQL("CREATETABLE"+TABLE_NAME+"("+_ID +"INTEGERPRIMARYKEYAUTOINCREMENT,"+TIME +"INTEGER,"+TITLE+"TEXTNOTNULL);"); } publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ db.execSQL("DROPTABLEIFEXISTS"+TABLE_NAME); onCreate(db); } }
ImportaesEsthcas
Constants.java
BomeVelhoScrollLayout
main.xml
<?xmlversion="1.0"encoding="u/8"?> <ScrollView xmlns:android="h5p://schemas.android.com/apk/res/android" android:layout_width="ll_parent" android:layout_height="ll_parent"> <TextView android:id="@+id/text" eria o s o m o c E android:layout_width="ll_parent" ma a r g o r p android:layout_height="wrap_content"/> cipal? n i r p </ScrollView>
OProgramaPrincipal
publicclassAulaAchvity11extendsAchvity{ privateEventsDataevents; @Override publicvoidonCreate(BundlesavedInstanceState){ Como criar novos super.onCreate(savedInstanceState); eventos?
setContentView(R.layout.main); events=newEventsData(this); Como ler try{ esses addEvent("Hello,Android!"); eventos?
Cursorcursor=getEvents(); showEvents(cursor); }nally{ E como events.close(); mostrar } tos esses even } na tela?
} AulaAchvity11.java
CriandoEventos
AulaAchvity11.java
AulaAchvity11.java
LendoEventos
MostrandoEventosnaTela
AulaAchvity11.java
privatevoidshowEvents(Cursorcursor){ StringBuilderbuilder=newStringBuilder("Savedevents:\n"); while(cursor.moveToNext()){ Vocs saberiam longid=cursor.getLong(0); logar eventos de longhme=cursor.getLong(1); D-pad? Stringhtle=cursor.getString(2); E even builder.append(id).append(":"); tos de teclad builder.append(hme).append(":"); o? builder.append(htle).append("\n"); } ros t TextViewtext=(TextView)ndViewById(R.id.text); u o que ? E text.setText(builder); tos n e v e }
publicbooleanonKeyDown(intkeyCode,KeyEventevent){ switch(keyCode){ caseKeyEvent.KEYCODE_0: caseKeyEvent.KEYCODE_1: caseKeyEvent.KEYCODE_2: caseKeyEvent.KEYCODE_3: caseKeyEvent.KEYCODE_4: caseKeyEvent.KEYCODE_5: caseKeyEvent.KEYCODE_6: caseKeyEvent.KEYCODE_7: caseKeyEvent.KEYCODE_8: caseKeyEvent.KEYCODE_9: addEvent("Numberpressed"); Toastt1=Toast.makeText(this, "Numberpressed",Toast.LENGTH_SHORT); t1.setGravity(Gravity.CENTER,0,0); t1.show(); break; caseKeyEvent.KEYCODE_SPACE: addEvent("Spacepressed"); Toastt2=Toast.makeText(this, "Spacepressed",Toast.LENGTH_SHORT); t2.setGravity(Gravity.CENTER,0,0); t2.show(); break; default: returnsuper.onKeyDown(keyCode,event); } showEvents(getEvents()); returntrue; } AulaAchvity11.java
OutrosEventos
AssociandoDadosa Vises
Androiddisponibiliza aosdesenvolvedores algunsrecursosgrcos r a paraaexibiode i r c o E com out y tabelas. a l m
u ? e s s mo e o c Compare,porexemplo:
EventList.java
ListAchvity
importandroid.app.ListAchvity; publicclassEventListextendsListAchvity{ privateEventsDataevents; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.evtlist); events=newEventsData(this); try{ addEvent("Hello,Android!"); Cursorcursor=getEvents(); showEvents(cursor); out y a l m u }nally{ e t Exis ra events.close(); prprio pa } listas. } }
evtlist.xml
LayoutdeLista
<?xmlversion="1.0"encoding="u8"?> <LinearLayout xmlns:android="hp://schemas.android.com/apk/res/android" android:layout_width="ll_parent" android:layout_height="ll_parent"> <!VejaosIDsbuiltinde'list'e'empty'> <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content"/> Agora p <TextView alterar reciso o mtod android:id="@android:id/empty" o showEv ents pa android:layout_width="wrap_content" ra usar a l i s ta, em v android:layout_height="wrap_content" ez da caix a d android:text="@string/empty"/> e texto. </LinearLayout>
EventList.java
Adaptadores
importandroid.widget.SimpleCursorAdapter; importstahcandroid.provider.BaseColumns._ID; privatestahcString[]FROM={_ID,TIME,TITLE,}; privatestahcint[]TO={R.id.rowid,R.id.hme,R.id.htle,}; privatevoidshowEvents(Cursorcursor){ SimpleCursorAdapteradapter=new SimpleCursorAdapter(this,R.layout.item, cursor,FROM,TO); setListAdapter(adapter); Precisamos de } um layout para
cada item de lista.
<?xmlversion="1.0"encoding="u/8"?> <RelahveLayout xmlns:android="h5p://schemas.android.com/apk/res/android" android:layout_width="ll_parent" android:layout_height="ll_parent" android:orientahon="horizontal" android:padding="10sp"> <TextView android:id="@+id/rowid" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/rowidcolon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=":" android:layout_toRightOf="@id/rowid"/> <TextView android:id="@+id/Sme" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/rowidcolon"/> <TextView android:id="@+id/Smecolon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=":" android:layout_toRightOf="@id/Sme"/> <TextView android:id="@+id/Stle" android:layout_width="ll_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:layout_toRightOf="@id/Smecolon"/> </RelahveLayout>
LayoutsRelahvos
O que um layout relativo?
item.xml
evtlist.xml
<?xmlversion="1.0"encoding="u8"?> <LinearLayout xmlns:android="hp://schemas.android.com/apk/res/android" android:layout_width="ll_parent" Qual o papel android:layout_height="ll_parent"> iew tV x te a d <ListView nesse layout? android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content"/> Onde esses <TextView IDs foram android:id="@android:id/empty" declarados? android:layout_width="wrap_content" E onde foi android:layout_height="wrap_content" declarada android:text="@string/empty"/> essa </LinearLayout> constante?
BuiltinIDs
Strings
strings.xml
addEventsegetEvents
Essesmtodossoosmesmosusadosem nossaprimeiraimplementao.
privatevoidaddEvent(Stringstring){ EventList.java SQLiteDatabasedb=events.getWritableDatabase(); ContentValuesvalues=newContentValues(); values.put(TIME,System.currentTimeMillis()); values.put(TITLE,string); db.insertOrThrow(TABLE_NAME,null,values); } privatestahcStringORDER_BY=TIME+"DESC"; privateCursorgetEvents(){ SQLiteDatabasedb=events.getReadableDatabase(); Cursorcursor=db .query(TABLE_NAME,FROM,null,null,null,null,ORDER_BY); startManagingCursor(cursor); returncursor; EventList.java }
ListViewvsScrollView
Aprincipaldiferenadasduasabordagens acontecenomtodoshowEvents.
ScrollView
privatevoidshowEvents(Cursorcursor){ StringBuilderbuilder= newStringBuilder("Savedevents:\n"); while(cursor.moveToNext()){ longid=cursor.getLong(0); longhme=cursor.getLong(1); Stringhtle=cursor.getString(2); builder.append(id).append(":"); builder.append(hme).append(":"); builder.append(htle).append("\n"); } TextViewtext=(TextView)ndViewById(R.id.text); text.setText(builder); }
ListView
privatevoidshowEvents(Cursorcursor){ SimpleCursorAdapteradapter=new SimpleCursorAdapter(this,R.layout.item, cursor,FROM,TO); setListAdapter(adapter); }
Exerccio:eventosdetoque
ModiqueListEvent paraqueessa ahvidadetambm trateeventosdetoque. Esseseventosdevem serdisparadosnatela deahvidade,masno pelalista.
EventosdeToque
EventList.java
MenudeContexto
Apagando itens
Adicione um menu de contexto lista, que d ao usurio a opo de apagar um item da lista.
Registrandoomenu
@Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.evtlist); events=newEventsData(this); registerForContextMenu(getListView()); try{ addEvent("Hello,Android!"); Cursorcursor=getEvents(); showEvents(cursor); }nally{ events.close(); } } EventList.java
DenindooMenu
privatenalintdel=0; @Override publicnalvoidonCreateContextMenu (nalContextMenumenu,nalViewv, nalContextMenuInfomenuInfo){ super.onCreateContextMenu(menu,v,menuInfo); menu.add(Menu.NONE,del,Menu.NONE,"DEL"); }
EventList.java
Tratandoopes
publicnalbooleanonContextItemSelected(nalMenuItemitem){ AdapterContextMenuInfoinfo= (AdapterContextMenuInfo)item.getMenuInfo(); RelahveLayoutrl=(RelahveLayout)info.targetView; TextViewtv=(TextView)rl.getChildAt(0); StringstrId=tv.getText().toString(); switch(item.getItemId()){ casedel: SQLiteDatabasedb=events.getReadableDatabase(); db.delete(TABLE_NAME,"_ID="+strId,null); showEvents(getEvents()); break; } returntrue; } EventList.java
Adicionandomaisopes
Cancel
possvel que o usurio mude de idia ao clicar no item que precisa ser removido. Adicione uma opo CANCEL ao menu, que lhe permita retornar sem remover o item.
Cancel
EventList.java
publicnalbooleanonContextItemSelected(nalMenuItemitem){ AdapterContextMenuInfoinfo= (AdapterContextMenuInfo)item.getMenuInfo(); RelahveLayoutrl=(RelahveLayout)info.targetView; TextViewtv=(TextView)rl.getChildAt(0); StringstrId=tv.getText().toString(); switch(item.getItemId()){ casedel: SQLiteDatabasedb=events.getReadableDatabase(); db.delete(TABLE_NAME,"_ID="+strId,null); showEvents(getEvents()); break; casecancel: break; } returntrue; } EventList.java
Lendoumaentradaespecca
Visualizando itens
Adicione um terceiro item ao seu menu. Esse item, SHOW, dever mostrar um item selecionado. Use a sada de Log para exibir informaes sobre esse item.
EventList.java
Novaopo
Lendoumitemespecco
publicnalbooleanonContextItemSelected(nalMenuItemitem){ if(item.getItemId()!=cancel){ AdapterContextMenuInfoinfo=(AdapterContextMenuInfo)item.getMenuInfo(); RelahveLayoutrl=(RelahveLayout)info.targetView; TextViewtv=(TextView)rl.getChildAt(0); StringstrId=tv.getText().toString(); Mas, como ler SQLiteDatabasedb=events.getReadableDatabase(); os dados do switch(item.getItemId()){ cursor?
casedel: db.delete(TABLE_NAME,"_ID="+strId,null); break; caseshow: Cursorcursor=db .query(TABLE_NAME,FROM,"_ID="+strId,null,null,null,ORDER_BY); break; } showEvents(getEvents()); } returntrue; } EventList.java
EventList.java
ManipulandooCursor
caseshow: Cursorcursor=db .query(TABLE_NAME,FROM,"_ID="+strId,null,null,null,ORDER_BY); Log.v("show",String.valueOf(cursor.getColumnCount())); Log.v("show",cursor.getColumnName(0)); Log.v("show",cursor.getColumnName(1)); Log.v("show",cursor.getColumnName(2)); inthmeColumn=cursor.getColumnIndex(TIME); inthtleColumn=cursor.getColumnIndex(TITLE); cursor.moveToFirst(); StringeventStr=cursor.getString(htleColumn); eventStr+="("+cursor.getLong(hmeColumn)+")"; Log.v("show",eventStr); break;
EventList.java
ManipulandooCursor
caseshow: Cursorcursor=db .query(TABLE_NAME,FROM,"_ID="+strId,null,null,null,ORDER_BY); Log.v("show",String.valueOf(cursor.getColumnCount())); Log.v("show",cursor.getColumnName(0)); Log.v("show",cursor.getColumnName(1)); Log.v("show",cursor.getColumnName(2)); inthmeColumn=cursor.getColumnIndex(TIME); inthtleColumn=cursor.getColumnIndex(TITLE); cursor.moveToFirst(); StringeventStr=cursor.getString(htleColumn); eventStr+="("+cursor.getLong(hmeColumn)+")"; Log.v("show",eventStr); break;
EventList.java privatestahcnalintMAX_MENU_ID=0; @Override publicbooleanonCreateOphonsMenu(Menumenu){ menu.add(Menu.NONE,MAX_MENU_ID,Menu.NONE,"GetOldest"); returntrue; } @Override publicboolean onOphonsItemSelected(MenuItemitem){ switch(item.getItemId()){ caseMAX_MENU_ID: AlertDialog.Builderbuilder=newAlertDialog.Builder(this); builder.setMessage("Youhaveselectedamenu!"); AlertDialogalert=builder.create(); alert.show(); returntrue; default: ; } returnfalse; }
Modique essa aplicao, para ela exibir na caixa o evento mais antigo.
LendooEventomaisAnhgo
Comece criando um mtodo getOldest, que retorna o evento mais antigo. Qual a interface para esse mtodo?
Modique essa aplicao, para ela exibir na caixa o evento mais antigo.
OEventoMaisAnhgo
EventList.java
privatelonggetOldest(Cursorc){ longoldestTime=0L; inthmeColumn=c.getColumnIndex(TIME); Implemente um for(c.moveToFirst();!c.isLast();c.moveToNext()){ algoritmo que leia o longcurrentTime=c.getLong(hmeColumn); evento mais antigo if(currentTime>oldestTime){ dentre os eventos oldestTime=currentTime; }armazenados no } cursor.
returnoldestTime; E como r esse ora p r o c n i } m seu
e cdigo
menu?
ExibindooEventoMaisAnhgo
EventList.java
@Override publicbooleanonOphonsItemSelected(MenuItemitem){ switch(item.getItemId()){ caseMAX_MENU_ID: AlertDialog.Builderbuilder=newAlertDialog.Builder(this); builder.setMessage("Oldestevent=" +String.valueOf(getOldest(getEvents()))); AlertDialogalert=builder.create(); alert.show(); returntrue; default: ; } returnfalse; }