Você está na página 1de 41

ProgramaoparaaPlataformaAndroidAula11

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?

comando temos em SQL?

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); } }

Algum sabe o que so essas importaes estticas?

ImportaesEsthcas
Constants.java

importandroid.provider.BaseColumns; publicinterfaceConstantsextendsBaseColumns{ nalStringTABLE_NAME="events"; nalStringTIME="hme"; nalStringTITLE="htle"; }


Precisamos de um layout para mostrar eventos.

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

privatevoidaddEvent(Stringstring){ SQLiteDatabasedb=events.getWritableDatabase(); ContentValuesvalues=newContentValues(); values.put(TIME,System.currentTimeMillis()); values.put(TITLE,string); db.insertOrThrow(TABLE_NAME,null,values); }


Qual a semntica desse mtodo?

Ainda falta sermos capazes de ler eventos!

AulaAchvity11.java

LendoEventos

privatestahcString[]FROM={_ID,TIME,TITLE,}; privatestahcStringORDER_BY=TIME+"DESC"; privateCursorgetEvents(){ SQLiteDatabasedb=events.getReadableDatabase(); Cursorcursor=db .query(TABLE_NAME,FROM,null,null,null,null,ORDER_BY); startManagingCursor(cursor); returncursor; }


Qual deve ser a semntica de cada um desses argumentos?

r E o que deve se um cursor? Quais mtodos ele deve ter?

E como mostrar todos os eventos logados na tela?

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. } }

Listas so feitas para exibir itens de um banco de dados.

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?

O que ser exibido em cada linha d a lista?

E como deve ser o layout da lista em si?

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

?xmlversion="1.0"encoding="u8"?> <resources> <stringname="app_name">Events</string> <stringname="empty">Noevents!</string> </resources>

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

@Override publicbooleanonTouchEvent(MohonEventevent){ if(event.getAchon()!=MohonEvent.ACTION_DOWN){ addEvent("TouchEvent!"); Toastt1=Toast.makeText(this,"Touch!",Toast.LENGTH_SHORT); t1.setGravity(Gravity.CENTER,0,0); t1.show(); } showEvents(getEvents()); returntrue; }

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

privatenalintcancel=1; @Override publicnalvoidonCreateContextMenu(nalContextMenumenu,nalViewv, nalContextMenuInfomenuInfo){ super.onCreateContextMenu(menu,v,menuInfo); menu.add(Menu.NONE,del,Menu.NONE,"DEL"); menu.add(Menu.NONE,cancel,Menu.NONE,"CANCEL"); }


E como tratar a escolha do novo item?

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

privatenalintshow=2; @Override publicnalvoidonCreateContextMenu(nalContextMenumenu,nalViewv, nalContextMenuInfomenuInfo){ super.onCreateContextMenu(menu,v,menuInfo); menu.add(Menu.NONE,del,Menu.NONE,"DEL"); menu.add(Menu.NONE,show,Menu.NONE,"SHOW"); menu.add(Menu.NONE,cancel,Menu.NONE,"CANCEL"); }


Tratar esse evento no trivial. Comece sendo capaz de selecionar o item.

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; }

O que esse cdigo faz? Esse um exemplo de um padro de projetos. Qual?

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; }