21 Haziran 2015 Pazar

FMDB kullanırken Vacuum kullanımı

Diyelim ki oyununuzun ipa ile gelen paketinin içinde bir veritabanı var ve bu veritabanını uygulamanın kullanımı sırasında güncelliyorsunuz. Bu durumda veritabanı dosyasını modifiye edilebilir hale gelmesi için documents klasörüne kopyalamanız gerekiyor. Kopyalamayı yaptınız diyelim. Bu kopyalamadan sonra bazı tabloları boşaltıp uygulamanın paketi içinden gelen veritabanı dosyasındaki elemanlarla rastgele bir sırada karıştırırarak yeniden dolduruyorsanız "vacuum" komutuna ihtiyacınız vardır. Tüm veritabanlarında genellikle bir kayıt silindiğinde aslında o kayıt veritabanından fiziksel olarak silinmez sadece silinmiştir diye işaretlenir. Bu mantıksal silinmiş kayıtları fiziksel olarak ta silmek için genellikle veritabanına bakım işlemi gerçekleştirirsiniz. Bu işlem sırasında boş bir veritabanı geçici olarak oluştulup içine orjinal veritabanındaki mantıksal olarak mevcut bilgiler aktırılır. Sonra orjinal veritabanı fiziksel olarak silinir ve yerine yeni oluşturulan veritabanı aynı dosya adıyla kopyalanıp kullanılmaya başlanır. sqlite'ta bu işlem için "vacuum" denilen bir komut var. Bu komutu executeUpdate komutuyla çalıştırırsanız veritabanındaki mantıksal kayıtlar fiziksel olarak silinmektedir. Bu ne işe mi yarar, veritabanı dosyanızın boyutuna bağlı olarak hem dosya boyutunuz küçülür hem de veritabanı üzerindeki işlem hızlarınız artabilir. Sevgiler.

FMDB kullanırken garip hatalar

Siz de FMDB kullanırken ResultSet oluştururken garip garip hatalar alıyorsanız sebebi integer değerler olabilir. FMDatabase tipinden bir obje oluşturduysanız ve bu objenin executeQuery veye executeUpdate'ini kullanıyorsanız genellikle ? ile parametreleri paslarsınız. Fakat bu pasladığınız parametreler malesef mutlaka reference type olmalı. Yani bir value type olan int tipinde bir değişkeni query veya update cümlesine son parametre olarak eklerseniz garip bi hata ile karşılaşıyorsunuz. Çözümü int değerinizi parametre olarak verirken bir reference type olan NSNumber'a çevirmek.

[targetDatabase executeUpdate:@"insert into GameItems (Name, PictureFileName, IsCompleted, ItemIndex) values (?,?,?,?)",
                 name,
                 pictureFileName,
                 isCompleted,
                 itemIndex];


bu üstteki kod kırmızı ile işaretli değişken yüzünden hata vermektedir. Çözüm ise şu şekilde

[targetDatabase executeUpdate:@"insert into GameItems (Name, PictureFileName, IsCompleted, ItemIndex) values (?,?,?,?)",
                 name,
                 pictureFileName,
                 isCompleted,
                 [NSNumber numberWithInt:itemIndex]];


Umarım işinize yarar. Sevgiler.