Android - Kontakty Łukasz Dudzioski
Kontakty informacje Oparte na androidowej bazie danych Contact API zarządzany dostęp do bazy danych Niskopoziomowy dostęp Duża zmiana od wersji 2.0
Schemat bazy danych wersja 1.x Deprecated!!! Pakiet Contacts Główne klasy People Phones Photos Organizations
Schemat bazy danych wersja >2.0 Pakiet ContactsContract Główne klasy danych Contact, RawContact, Data Projekcje CommonDataKinds Email, Event, Im, Nickname, Note, Organization, Phone, Photo, Relation, StructuredName, StructuredPostal, Website Stare klasy działają, ale są deprecated
Schemat bazy danych wersja >2.0 Trzy Tabele Contact RawContact Data
Inne dane Grupy - ContactsContract.Group Konta emailowe Account Z kontami powiązane są ContactsContract.RawContact Ustawienia - ContactsContract.Settings Tabela PhoneLookup do szybkiego znajdywania numerów Status komunikatorów StatusUpdates
Używanie ContactAPI Klasy to po prostu zbiory stałych Udostępniają ponadto kilka statycznych metod Do zamiany typu na tekst gettypelabel, gettypelabelresource Do wspomagania wyszukiwania getcontactlookupuri, getlookupuri, lookupcontact Klasa Contact markascontacted opencontactphotoinputstream
Używanie ContactAPI cd. Z powodu braku specjalnych klas i metod do zarządzania kontaktami wszystko trzeba robid ręcznie Używamy do tego standardowego mechanizmu dostępu do bazy danych wbudowanego w Androida Stałe z klas przydają się jako parametry do zapytao
Słówko o bazie danych - URI Wszystkie obiekty bazy mają swój URI A Standardowy prefix mówiący o tym, że dane kontrolowane są przez Content Providera B Identyfikator Content Providera C Identyfikuje typ danych D Identyfikator wiersza danych
Baza danych Content Provider Content Provider to po prostu klasa rozszerzająca klasę ContentProvider i implementująca metody query, insert, update, delete, gettype, oncreate Gdy jest to nasza własna klasa, w Uri musi byd podana pełna nazwa klasy np. pl.umk.luk.conpro To co klasa robi zależy tylko i wyłącznie od twórcy, może np. komunikowad się ze zwykłą bazą danych, może czytad dane z pliku xml, czy z pamięci
Zapytania do bazy danych Musimy posiadad obiekt Content Providera Musimy posiadad Uri do konkretnego obiektu, lub do określonego typu danych ContentValues klasa do przekazywanych danych do zapytania przy insert i update Możemy podad opcję Where która jest zwykłym stringiem i wyglądą jak SQL W Where można używad znaków?, które będą później zastąpione przez WhereArgs
Zapytania do bazy danych Wywołujemy na Content Providera jedną z metod Uri insert(uri uri, ContentValues values) zwraca Uri nowoutworzonego obiektu int delete(uri uri, String selection, String[] selectionargs) zwraca liczbę usuniętych wierszy int update(uri uri, ContentValues values, String selection, String[] selectionargs) zwraca liczbę zaktualizowanych wierszy Cursor query(uri uri, String[] projection, String selection, String[] selectionargs, String sortorder) Podajemy w projection wybrane kolumny, a także porządek sortowania w sortorder, zwraca obiekt Cursor
Cursor Klasa, dzięki której możemy przeglądad bazę danych Ważne metody getcount() zwraca liczbę wierszy getcolumncount() zwraca liczbę kolumn getdouble, getint,, getstring(int columnindex) zwraca wartośd komórki z podanej kolumny getcolumnindex(string columnname) zwraca indeks kolumny movetofirst(), movetolast(), movetonext(), movetoprevious() przesuwanie na wybrany wiersz, zwraca boolean, czyli idealne do while, czy if close() zalecane używanie
Przykładowe zapytanie Dodanie notatki do kontaktu ContentValues values = new ContentValues(); values.put(data.raw_contact_id, rawcontactid); values.put(data.mimetype, CommonDataKinds.Note.CONTENT_ITEM_TYPE); values.put(commondatakinds.note.note, data); getcontentresolver().insert(data.content_uri, values); Wyszukanie kontaktu Cursor cur = getcontentresolver().query( Contacts.CONTENT_URI, null, Contacts.DISPLAY_NAME + " =?", new String[] { displayname }, null); Usunięcie obiektu getcontentresolver().delete(uri, null, null);
Dodanie kontaktu Nie jest to wcale takie proste Nie można po prostu stworzyd obiektu Contact Kontakt tworzymy na podstawie Display Name, który jest obowiązkowym argumentem Musimy najpierw stworzyd RawContact Dopiero w tym momencie tworzony jest automatycznie obiekt Contact
Dodanie kontaktu cd. Następnie tworzymy podstawowy obiekt zawierający informacje o nazwie (StructuredName) Niedodanie StructuredName powoduje błędy Dodanie kolejnego RawContact o tym samej Display Name nie tworzy nowego kontaktu, tylko dodaje kolejny RawContact do istniejącego już Contact
Dodawanie innych danych Wszystkie dane dodajemy do tabeli Data Także te specjalne, mające własne ContentUri Phone, Email Obowiązkowe jest podane RawContactId, nie można podad ContactId, bo dane powiązane są z konkretnym RawContact, wyjątek to Starred (Ulubione) i Photo (Zdjęcie)
Intencje przypomnienie Uri uri = Uri.parse("tel:2342343"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startactivity(it); static final int PICK_CONTACT = 123; Intent it = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startactivityforresult(it, PICK_CONTACT); void onactivityresult(int reqcode, int resultcode, Intent data) { if(reqcode == PICK_CONTACT && resultcode == Activity.RESULT_OK) { Uri contactdata = data.getdata(); } }
Intencje Dzwonienie Uri / tel:646432528 + ACTION_DIAL / ACTION_CALL Wyświetlenie kontaktu Uri + ACTION_VIEW Sms smsto:646432528 + ACTION_SENDTO Email mailto:zxc@abc.com + ACTION_SENDTO Trzeba mied uprawnienia!!!
Obiektowa nakładka Brak takowej w SDK Androida Stworzyłem własną Demo w postaci managera kontaktów podobnego do systemowego, ale umożliwiającego edycję wszystkich danych
Bibliografia http://stackoverflow.com/ http://developer.android.com/reference/andr oid/provider/contactscontract.html http://developer.android.com/resources/articl es/contacts.html http://developer.android.com/guide/topics/pr oviders/content-providers.html http://snipt.net/martin/android-intent-usage/