Archive for December, 2009

Android’in Veri Tabanlarında Gezinti

Bazen geliştirdiğimiz uygulamalarda cihaz üzerinde tutulan verilere ihtiyacımız oluyor. Telefon rehberi, arama kayıtları, bookmarklar, müzik arşivi, sistem ayarları gibi bilgiler Android’in SQLite veri tabanında sakladıklarından bazıları. Uygulamayı geliştirirken hem ihtiyacımız olan bilgilerin tutulup tutulmadığını görmek, hem de telefonun iç işleyişini keşfetmek için Android’in kendi tuttuğu veri tabanlarında bir gezinti yapmak isteyebiliriz.
 
Andoid için uygulama geliştirme ortamımızı hazırladıktan sonra Android SDK’in tools klasöründe bulunan adb aracı bu konuda bize yardımcı olacak. Android Debug Bridge, emulator/cihaz ile bilgisayarımız aramızda bir köprü görevi gören bir uygulama. Komut satırından tools klasörüne giderek adb devices komutu ile bağlanabileceğimiz cihazları listeliyoruz:
 android1
Birden fazla cihaz bağlı olsa idi, yazacağımız tüm komutları adb -s emulator-5554 komut şeklinde hangi cihaz üzerinde çalışacağını belirterek yazmamız gerekecekti. Fakat bizde tek cihaz olduğu için, komutlarımızı kısaca adb komut şeklinde yazmamız yeterli olacak.
 

Dosya Sisteminde Gezinti

Cihaz üzerinde komut satırına erişmek için adb shell komutunu kullanıyoruz.

Android işletim sistemi Linux kernel’i üzerine kurulu olduğu için, Linux üzerinde alışkın olduğumuz bazı komutları cihaz üzerinde de çalıştırabiliyoruz. Mesela ls komutu ile dizinleri listeleyebilir, cd dizinadı ile istediğimiz dizine geçebilir, cd .. ile bir üst seviyedeki dizine geri dönebiliriz.

android2

Bu şekilde klasörler arasında dolaşarak istediğimiz bilgilerin nerede durduğunu bulmamız gerekiyor. Mesela veri tabanları genellikle /data/data dizinin altında duruyor. Örnek olarak Contacts uygulamasına ait verilere göz atalım. Bu bilgiler /data/data/com.android.providers.contacts/databases dizininde bulunan contacts.db dosyasında bulunuyor. (NOT: SDK 2.0 ve sonraki sürümlerde contacts2.db olarak geçer).

android3

Database’e Erişim 

İncelemek istediğimiz database dosyasını bulduktan sonra, sqlite3 dosyadı komutu ile bu veritabanını inceleyebiliriz. sqlite3 contacts.db diyerek Contacts uygulamasına ait veri tabanını açıyoruz:
android4
 
sqlite3 içerisindeyken .tables komutu ile o veri tabanında bulunan tabloları listeliyor, .header on diyerek kolon isimlerini görünür kılıyoruz. Daha sonra select * from calls; sorgu cümlesi ile arama kayıtlarına ait tabloda tutulan verileri listeliyoruz.
 
sqlite3 içerisinde işimize yarayabilecek diğer komutlar şöyle:
.dump tabloismi diyerek tabloyu oluşturmak için gerekli SQL cümlelerini görebilir, .schema tabloismi ile tablonun yapısını öğrenebilir, .help ile de diğer komutları inceleyebilirsiniz. En son .exit diyerek sqlite3′ten çıkarak Android komut satırına geri dönüyoruz.
 

Cihazdan Dosya Kopyalamak

Komut satırından hoşlanmayanlardansanız, Android’in veri tabanını kendi bilgisayarınıza kopyalayıp, SQLite Database Browser gibi bir araç ile görsel olarak inceleyebilirsiniz. Bunun için adb pull cihazdakidizin localdizin komutunu kullanıyoruz. Mesela Contacts uygulamasına ait veri tabanını bilgisayarımıza kopyalamak için adb pull /data/data/com.android.providers.contacts/databases/contacts.db contacts.db yazarak contacts.db dosyasını tools klasörü altına kopyalamış oluyoruz. (Not: Bu işlemi adb shell içerisinden değil, işletim sisteminin komut satırından yapıyoruz) Daha sonra SQLite Database Browser ile dosyayı açarak içeriğine bakabiliriz:
 
android5
 

Kaynaklar

, , , ,

No Comments

UITableViewCell.textLabel Farklı Arkaplan Rengi

UITableViewCell içerisinde önceden tanımlı olarak gelen textLabel alanının arkaplan rengi, o hücre yaratılırken değiştirilemiyor. Bu sorun farklı renkte ya da bir renk geçişi içeren arkaplana sahip hücre oluşturmak istersek ortaya çıkıyor. Örnek olarak aşağıdaki kod beklediğimiz etkiyi vermeyecektir:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];

[cell.textLabel setBackgroundColor:[UIColor redColor]];
[cell.textLabel setText:[NSString stringWithFormat:@"Cell%d", indexPath.row+1]];

return [cell autorelease];
}

Bu kod satırının sonucunda textLabel’in arkaplanının kırmızı olmasını bekleriz, ancak çalıştırdığımızca arkaplan rengi değişmemiş görünür. Şu şekilde:

Screen shot 2009-11-18 at 11.47.31 AM

Bunun sebebi aslında iPhone SDK’sının otomatik olarak -hücrelerin ekranda kaydırılırken işlemciyi yormaması için- hücrelerin arkaplanlarını opak yapması ve standart bir renk ile göstermesidir. Bu durumun istisnası ise hücrenin seçilmesi durumudur. Dolayısıyla normal durumda textLabel opak olarak gösterilecek, ancak seçili (highlighted) duruma geçtiğinde arkaplanı transparan yapılacak ve arkasına belirttiğimiz backgroundView getirilecek. Normal durumlarda hangi renkte kalması gerektiğini söyleyebileceğimiz bir değişken olmadığı için (3.1.2 SDK’sinde yok en azından) textLabel normal durumda arkaplan rengini bulunduğu tablonun arkaplanı olarak ayarlar.

Eğer biz normal durumda farklı bir renkte görünmesini istiyorsak, bunu hücre yaratılırken (ya da initialize edilirken) değil, hücre ekranda gösterilecekken söylemeliyiz. Bahsettiğimiz UITableView’in delege metodu ‘tableView:willDisplayCell:forRowAtIndexPath:’dir. Bu metod hücre gösterilmeden hemen önce çağırıldığı için textLabel üzerinde istediğimiz değişiklikleri artık yapabiliriz.

Örnek kod olarak yukarıda yazdığımız satırı bahsedilen delege metodu içerisine yazarsak:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.textLabel.backgroundColor = [UIColor redColor];
}

Şu şekilde (ve istediğimiz gibi) bir görüntü elde ederiz:

Screen shot 2009-11-18 at 12.00.25 PM

Son olarak belirtmek istediğim nokta; bu bahsettiğim işlemler detailLabel için de aynen kullanılabilir.

, , , ,

1 Comment

2010 Android’in yılı olacak (mı?)

AdMob Ekim 2009

Google’ın mobil platformlar için Android isimli bir platform geliştirdiği açıklaması ile başlayan süreç hem Apple tarafından ekarte edilmiş operatörler/cihaz üreticileri hem de mobil uygulama geliştiriciler için oldukça heyecan verici bir şekilde başlamıştı. Geçen süre zarfındaki gelişime baktığımızda Android platformunun başarılı olduğunu rahatlıkla söyleyebiliyoruz (AdMob verilerine göre dünya akıllı telefon pazarındaki payı %11 olarak görünse de gerçek değer %4, 2009 büyüme tahmini ise %900 civarındadır) ancak ilk baştaki o büyük beklentilerin karşılanması konusunda bazı sıkıntıların olduğunu da göz ardı edemeyiz.

Android platformu konusundaki en temel sıkıntı cihazlar konusunda oldu. Şu ana kadar yaklaşık 20 tane Android tabanlı telefon piyasada yer bulmuş olsa da, bu cihazların çok büyük bir çoğunluğu ana rakip olarak görülen iPhone ile yapılan kullanıcı memnuniyet karşılaştırmalarda geride kaldılar. Ayrıca çeşitli firmalar (Motorola gibi) tarafından 2009 içerisinde çıkartılacağı belirtilen cihazların büyük bir çoğunluğu piyasaya sürülemediler. Bu konuda Android platformu için umut vaat eden nokta ise şimdiden 2010 için en az 30 adet yeni cihazın piyasaya çıkacağının kesinleşmiş olmasıdır. Ancak cihaz pazarındaki bu artış beraberinde getireceği değişik ekran büyüklük/çözünürlük değerleri ve donanım parçalarının farklılığını uygulama geliştiriciler için zorluklar çıkartabileceği gözden kaçırılmaması gereken bir noktadır, ancak kişisel olarak bu konuda zaman geçtikçe bir denge kurulacağını düşünüyorum.

Android hakkındaki diğer başka büyük bir sıkıntı ise uygulama pazarı alanında olmuştur. Google’ın Apple App Store’na rakip olarak ortaya çıkardığı Android Market şu ana kadar beklenildiği kadar iyi bir alternatif olmayı başaramamıştır. Genel uygulama sayısı olarak bakıldığı zaman App Store’da 100.000 civarında olan uygulama sayısına karşılık Android Market’te yaklaşık 10.000 uygulamanın bulunması ve daha da önemlisi bu uygulamaların büyük bir çoğunluğunun kullanıcılar tarafından “v1.0” olarak nitelenen yeterli kalitede olmayan uygulamalar olması ortalama müşteriler için App Store’un daha çekici olması ile sonuçlanmaktadır. Ayrıca Android platformu için iTunes benzeri bir uygulamanın olmaması kullanıcı memnuniyetini düşüren bir etken olmaktadır. Android Market konusundaki başka bir önemli sıkıntı ise uygulama geliştiriciler için yeterli bir gelir kaynağı olarak görülmemesi oldu. Kasım ayı içerisinde dünyanın en büyük mobil oyun şirketlerinden Gameloft, Android platformu üzerinde kimsenin yeterli seviyede gelir kazanamadığını öne sürerek platform üzerindeki yatırımları önemli ölçüde azaltma kararı aldığını, sadece kendilerinin değil benzer şirketlerinde aynı fikirleri paylaştığını belirtmişti. Gerçi takip eden günlerde Motorola Droid’in satış başarısı ve gelişmiş yeni cihazların yakın zamanda ortaya çıkacağı beklentisi ile bu kararlarını geri alıp özellikle 2. nesil Android cihazlar üzerinde yatırımlarına devam edeceklerini açıklasalar da, firmaların iPhone OS üzerinde uygulamaya geliştirmeye daha fazla önem vermeye belli bir süre daha devam edeceklerini rahatlıkla söyleyebiliriz.

Kendi kişisel fikrim bu sene içerisinde yaşanan soru işaretlerine rağmen 2010 yılının Android platformunun gerçekten patlama yapacağı bir yıl olacağı yönünde. Özellikle Android 2.0 ile platformun belirli bir olgunluk derecesine ulaşması, her gün üreticiler tarafından duyurulan yeni nesil cihazlar ve Google’ın platforma kazandırdığı yeni yetenekler ve servislerle (Android 2.0 ile birlikte sunulmaya başlanan sesli navigasyon, yeni duyurulan Goggles servisleri gibi) birlikte firmalar çekinceleri bulunsa da bu pazardan uzak kalamayıp Android üzerinde çalışmaya daha da önem vererek devam edeceklerdir ki buda cihaz üreticilerini yeni modeller konusunda tetikleyici bir sonuca, kısacası bir döngüye yol açacaktır. Ayrıca Google başarılı ADC (Android Developer Challange) stratejisi ile firmalar dışında büyük bir geliştirici kitlesi oluşturmayı başarmış durumdadır. Bu durumda Gartner’ın Android platformu için belirlediği 2012 yılında %18lik akıllı telefon pazar payı tahmini gerçekleştirilebilecek bir hedef olarak görülmelidir. Aslında 2010 yılında Android’in cep telefonlarından çıkıp diğer cihazlar üzerinde de (özellikle netbooklarda) kendini göstermesi bekleniyordu ancak Chrome OS’un ortaya çıkması ile birlikte Android platformunun 2010 yılında cep telefonu merkezli kalacağını söyleyebiliriz.

Mobil operatörlerin bu durumda karşısındaki pozisyonlarını incelersek; bu gelişim potansiyeli karşısında mobil operatörler, iPhone üzerindeki servislerini hızlı bir şekilde Android platformuna da taşımalı, bundan sonra sunacağı servisler içinse iki ortamı da destekleyen bir yapı sergilemelidir. Ayrıca mobil dünya üzerindeki etki alanını giderek attırmakta olan Google’un sadece platform geliştiricisi olarak yetinmeyip servis sağlayıcı olarak etkinliğini arttırması beklenmektedir ki bu durumda operatörler tarafından sağlanan servisler için yeni ve güçlü rakiplerin ortaya çıkması demek olacaktır. Ama bence bunlardan çok daha önemlisi, uzun süredir Google tarafından kabul edilemeyen data/voip tabanlı bir cihaz geliştirdiği iddiasının -tam olarak iddialardaki gibi olmasada- geçen haftasonu Nexus One adı ile ortaya çıkması oldu. Şu anda cihaz hakkında çok fazla bilgi paylaşılmamış olsada bu tarz bir gelişmeyi Google’ın Amerika’daki 700 Mhz ihalesine eklenmesini sağladığı maddelerle birlikte düşünürsek (bu maddeleri kısaca “açık servisler, açık cihazlar” olarak özetleyebiliriz) bu mobil operatörleri sadece data hattı sağlama rolüne doğru itecek bir sürecin habercisi olabilir. Mobil operatörler tüm bu olası senaryolar karşısında etkin stratejiler oluşturmaya şimdiden başlamalıdır, yarın gerçekten çok geç olabilir.

Reblog this post [with Zemanta]

,

2 Comments