Android ile MongoDB Kullanımı (Web Servis ile MongoLab’a Bağlanarak..)
Öncelikle Merhabalar..
Uzun süredir yazma niyetinde olduğum; önceki makalelerde yarım bıraktığım ve yoğunluktan dolayı bir türlü tamamlayamadığım MongoDB makalelerine bu kez Android platformunda ki kullanımı anlatarak devam ediyorum. 🙂
Bu makalede kendi hazırlamış olduğum MongoLabHelper sınıfı ile MongoLab.com‘da barındırmakta olduğum sunucuma RESTful API (Web Servis) ile bağlanarak; sunucudaki veri tabanının kullanımı hakkında bilgiler vereceğim.
İlk olarak MongoLabHelper.java dosyasını aşağıdaki linkten indirip projemize ekliyoruz.
https://github.com/umon/MongolabHelper
MongoLabHelper.java dosyasını incelediğimizde ;
1 2 3 4 5 |
private String apiKey = "ZDAi1zTB7g95vbfp31F2Gsp36UMa7Xq5"; private String database = "veritabani"; private String collection = "umutonur.com"; |
kodlarını göreceksiniz.
burada database değişkenine veri tabanınızın adını, collection değişkenine de koleksiyonunuzun adını yazmalısınız.
apiKey‘inizin ne olduğunu öğrenmek için ise User sayfasına giriyoruz. Burada ki anahtarı apiKey değişkenine yazıyoruz. Daha sonra Data Api Access‘i Enable yapıp RESTful API ile veri alışverişini etkinleştiriyoruz.
MongoLabHelper.java sınıfının kullanımı oldukça kolaydır. Bu sınıf sayesinde RESTful API hakkında hiç bir bilginiz olmasa bile JSON verilerini kullanarak rahat bir şekilde bilgilerinizi web ortamında saklayabilirsiniz.
apiKey, database ve collection değişkenlerini değiştirdikten sonra kullanacağımız komutlara geçelim.
getCollections() : Bu metod veri tabanı içindeki koleksiyonları görmemize yarar. Hemen bir örnek yapacak olursak;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MongoLabHelper mongoLabHelper = new MongoLabHelper(); String sonuc = mongoLabHelper.getCollections(); Log.e("Koleksiyonlar",sonuc); } } |
kodunu çalıştırdığınızda Logcat’te şu çıktıyı alacaksınız :
1 |
E/Koleksiyonlar: [ "objectlabs-system" , "objectlabs-system.admin.collections" , "system.indexes" , "umutonur.com" ] |
Burada dikkat ederseniz; [ “objectlabs-system” , “objectlabs-system.admin.collections” , “system.indexes” , “umutonur.com” ] çıktısı aslında bir JSON Dizisinin çıktısıdır. Dizinin elemanları; veri tabanında bulunan koleksiyonları gösterir. Bu dizideki ilk 3 eleman MongoLab’ta ki sunucunun sistemine ait koleksiyonlardır. Bu 3 koleksiyonla herhangi bir işimiz olmayacak.
4. eleman ise (“umutonur.com”) bizim daha önceki derslerde oluşturmuş olduğumuz koleksiyondur. Örneklerimizi bu koleksiyon üzerinden yapacağız.
getCollection() : Bu metod; Makalenin başında database değişkeninde belirtiğimiz veri taban içindeki collection değişkeninde belirttiğimiz koleksiyonda olan verileri almamızı sağlar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MongoLabHelper mongoLabHelper = new MongoLabHelper(); String koleksiyon = mongoLabHelper.getCollection(); Log.e("Koleksiyondaki veriler",koleksiyon); } } |
Logcat çıktısı :
1 |
E/Koleksiyondaki veriler: [ ] |
Gördüğünüz gibi koleksiyonumuzda eleman olmadığı için bize boş bir JSON Dizisinin çıktısını verdi.
getCollection(“koleksiyon”) : Bu metod database değişkeninde belirtmiş olduğumuz veri tabanı içinde ki farklı koleksiyonlardan veri almamızı sağlar.
getCollection(“veritabanı”, “koleksiyon”) : Bu metod parametre belirtiğimiz veritabanı ve koleksiyondaki verileri almamızı sağlar.
Ayrıca setCollection(“koleksiyon ismi”) , setDatabase(“veri tabanı ismi”) ve setApiKey(“api anahtarı”) metodlarıyla MongoLabHelper sınıfı içinde belirtmiş olduğumu database , collection ve apiKey değişkenlerinin değerini uygulama içerisinde değiştirebilmemiz de mümkündür.
insert() : Veri tabanına veri ekleyebilmemizi sağlayan metoddur. Tek bir JSON nesnesi ekleyebildiğimiz gibi, birden fazla JSON nesnesinden oluşan bir JSON dizisi de eklememiz mümkündür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { // ekleyeceğimiz JSON nesnesini oluşturuyoruz. JSONObject ilkNesne = new JSONObject(); ilkNesne.put("ilk", "json verisi"); ilkNesne.put("bul", true); // insert() metodu kullanarak JSON nesnesini veri tabanına kaydediyoruz. MongoLabHelper nesneKaydet = new MongoLabHelper(); nesneKaydet.insert(ilkNesne); } catch (JSONException e) { e.printStackTrace(); } } } |
Yukarıda yaptığımız veri ekleme işleminin sonucuna bakacak olursak :
1 2 3 4 |
E/MongoLab Process: Sending Data.. E/MongoLab Status Code: 200 E/MongoLab Status Message: OK E/MongoLab Output Data: {"ilk":"json verisi","bul":true} |
Gördüğünüz gibi yapılan her işlemin sonucu Logcat ekranında görülebilir.
Bu kez aynı şekilde bir JSON dizisi ekleyip sonucuna bakalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { // ekleyeceğimiz JSON dizisinin nesnelerini oluşturuyoruz. JSONObject diziNesne1 = new JSONObject(); diziNesne1.put("json dizisi", "nesne 1"); diziNesne1.put("bul", false); JSONObject diziNesne2 = new JSONObject(); diziNesne2.put("json dizisi", "nesne 2"); diziNesne2.put("bul", true); JSONObject diziNesne3 = new JSONObject(); diziNesne3.put("json dizisi", 3); diziNesne3.put("bul", false); JSONArray ilkDizi = new JSONArray(); ilkDizi.put(diziNesne1); ilkDizi.put(diziNesne2); ilkDizi.put(diziNesne3); // insert() metodu kullanarak JSON dizisini veri tabanına kaydediyoruz. MongoLabHelper veriKaydet = new MongoLabHelper(); veriKaydet.insert(ilkDizi); } catch (JSONException e) { e.printStackTrace(); } } } |
Sonuç :
1 2 3 4 |
E/MongoLab Process: Sending Data.. E/MongoLab Status Code: 200 E/MongoLab Status Message: OK E/MongoLab Output Data: [{"json dizisi":"nesne 1","bul":false},{"json dizisi":"nesne 2","bul":true},{"json dizisi":3,"bul":false}] |
Yaptığımız 2 ekleme işleminden sonra veri tabanımızın son haline bakacak olursak :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MongoLabHelper veriGoster = new MongoLabHelper(); veriGoster.getCollection(); } } |
1 2 3 4 |
E/MongoLab Process: Getting Data.. E/MongoLab Status Code: 200 E/MongoLab Status Message: OK E/MongoLab Response: [ { "_id" : { "$oid" : "56dac9e8e4b07e85eadde1c3"} , "ilk" : "json verisi" , "bul" : true} , { "_id" : { "$oid" : "56dacb76e4b07e85eadde9de"} , "json dizisi" : "nesne 1" , "bul" : false} , { "_id" : { "$oid" : "56dacb76e4b07e85eadde9df"} , "json dizisi" : "nesne 2" , "bul" : true} , { "_id" : { "$oid" : "56dacb76e4b07e85eadde9e0"} , "json dizisi" : 3 , "bul" : false} ] |
Gördüğünüz gibi 1. ve 2. insert() işlemlerinde veri tabanımıza sırasıyla JSON nesnesi ve JSON dizisi ekledik.
Yapılan tüm “GET” isteklerinde sunucudan alınan veriler Logcat ekranında “Response” anahtarının karşılığı olarak gözükmektedir.
Daha önceki makalelerde de bahsettiğim gibi “$oid” anahtarına karşılık gelen değerler, veri tabanında bulunan ilgili JSON nesnesinin Object Id’sini vermektedir. Koleksiyon içindeki her elemanın kendine özgü bir Object Id’si bulunmaktadır. Veri güncelleme ve veri silme işlemlerini yaparken bu Object Id’leri kullanacağız.
find() : Koleksiyon içindeki elemanlarda arama/eşleşme gibi işlemler yapacağımız zaman bu metodu kullanıyoruz.
Yukarıda yaptığımız insert() işlemlerinde dikkat ettiyseniz eklediğimiz her veride biz “bul” anahtarı kullandık.
Şimdi find() metodunu kullanarak bu elemanlar arasında “bul” anahtarının “true” değerine eşit olduğu koleksiyon elemanlarını görüntüleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MongoLabHelper veriBul = new MongoLabHelper(); String sonuc = veriBul.find("{\"bul\":true}"); Log.e("Eşleşen veriler", sonuc); } } |
1 |
E/Eşleşen veriler: [ { "_id" : { "$oid" : "56dac9e8e4b07e85eadde1c3"} , "ilk" : "json verisi" , "bul" : true} , { "_id" : { "$oid" : "56dacb76e4b07e85eadde9df"} , "json dizisi" : "nesne 2" , "bul" : true} ] |
findOne() : Koleksiyon içinde yaptığımız aramalarda sonuç olarak çıkan ilk elemanı bize verir. Kullanımı find() metodu ile aynıdır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MongoLabHelper veriBul = new MongoLabHelper(); String sonuc = veriBul.findOne("{\"bul\":true}"); Log.e("Eşleşen veri", sonuc); } } |
1 |
E/Eşleşen veri: [ { "_id" : { "$oid" : "56dac9e8e4b07e85eadde1c3"} , "ilk" : "json verisi" , "bul" : true} ] |
update() : Koleksiyondaki herhangi bir elemanı güncellemek için kullanılır. 2 şekilde kullanılabilir.
1 – Object Id’ye göre : – update(“object id”, JSON Nesnesi) –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { // Güncellenecek elemanın Object id'si String objectId = "56dac9e8e4b07e85eadde1c3"; // Güncel veri JSONObject yeniJSON = new JSONObject(); yeniJSON.put("bul", false); MongoLabHelper veriGuncelle = new MongoLabHelper(); veriGuncelle.update(objectId, yeniJSON); } catch (JSONException e) { e.printStackTrace(); } } } |
Yukarıda ki kodda Object Id‘si “56dac9e8e4b07e85eadde1c3” olan elemanın “bul” anahtarındaki verinin değeri false olarak güncellenmiştir.
1 2 3 4 |
E/MongoLab Process: Sending Data.. E/MongoLab Status Code: 200 E/MongoLab Status Message: OK E/MongoLab Output Data: { $set: {"bul":false} } |
2 – Eşleşen veriye göre (Query) ; – update(JSON Nesnesi, “eşleşecek veri”) –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { // eşleşecek değer (Query String) String query = "{\"json dizisi\":3}"; // Güncel veri JSONObject yeniJSON = new JSONObject(); yeniJSON.put("json dizisi", "nesne 3"); MongoLabHelper veriGuncelle = new MongoLabHelper(); veriGuncelle.update(yeniJSON, query); } catch (JSONException e) { e.printStackTrace(); } } } |
1 2 3 4 |
E/MongoLab Process: Sending Data.. E/MongoLab Status Code: 200 E/MongoLab Status Message: OK E/MongoLab Output Data: { $set: {"json dizisi":"nesne 3"} } |
Yukarıda kod “json dizisi” anahtarının 3 olduğu elemanı bulup bu anahtarı “nesne 3” şeklinde güncellemektedir.
Bu metodlarından başka olarak upsert() metodu da update() metodunun 2. kullanımıyla aynı biçimde kullanılır. Aralarındaki fark ise eşleşen elemanın kalıbı bizim yolladığımız verinin kalıbına uymazsa yeni bir eleman oluşturulacaktır.. Yani upsert() metodunun update() ve insert() metodlarının birleşimi gibi olduğunu söyleyebiliriz.
updateMany() : Kullanımı update() metodunun 2. kullanımıyla aynıdır. Aralarındaki fark ise updateMany() metodunun eşleşen tüm elemanları güncellemesidir..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { // eşleşecek değer (Query String) String query = "{\"bul\":false}"; // Güncel veri JSONObject yeniJSON = new JSONObject(); yeniJSON.put("bul", true); MongoLabHelper veriGuncelle = new MongoLabHelper(); veriGuncelle.updateMany(yeniJSON, query); } catch (JSONException e) { e.printStackTrace(); } } } |
1 2 3 4 |
E/MongoLab Process: Sending Data.. E/MongoLab Status Code: 200 E/MongoLab Status Message: OK E/MongoLab Output Data: { $set: {"bul":true} } |
delete() : Bu metod belirtilen Object Id’deki elemanı veri tabanından silmemizi sağlar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MongoLabHelper veriSil = new MongoLabHelper(); veriSil.delete("56dacb76e4b07e85eadde9de"); } } |
1 2 3 4 |
E/MongoLab Process: Deleting Data.. E/MongoLab Status Code: 200 E/MongoLab Status Message: OK E/MongoLab Deleted ID: 56dacb76e4b07e85eadde9de |
count() : Yaptığımız herhangi bir eşleşme işleminde eşleşen kaç sonuç olduğunu bize verir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MongoLabHelper veriSayisi = new MongoLabHelper(); int sonuc = veriSayisi.count("{\"bul\":true}"); Log.e("Eşleşen eleman sayısı", String.valueOf(sonuc)); } } |
1 |
E/Eşleşen eleman sayısı: 3 |
Yukarıdaki kodda “bul” anahtarının true değerine eşit olduğu elemanlar bulunup; kaç tane eleman olduğu count() metoduyla gösterilmiştir.
MongoLabHelper ile MongoLab.com üzerinde bulunan MongoDB sunucunuzda yapılabilecek çoğu işlemi gerçekleştirebilirsiniz.
Hatalı gördüğünüz herhangi bir noktayı benimle paylaşabilirsiniz. Ayrıca Github üzerinden projeye katkıda bulunabilirsiniz.
Iyi kodlamalar 🙂
Merhaba Umut,
Öncelikle bu bilgi paylaşımın için çok teşekkürler. Son derece açıklayıcı ve faydalı bir yazı olmuş. Ben projeye MongoLabHelper class ını eklediğimde hatalar alıyorum. Mesela ‘oid’ için create field diyor.String olarak tanımlanmamış. Ben tanımladım. Ama çalıştırınca doInBackground hatası veriyor. Acaba android studio sürümünden mi kaynaklıdır? Ya da hangi sdk da yapmalıyım?
Dostum bu Sanki MongoLab Api si gibi, yani direk mongodb veri tabanına bağlantı driverı değil. Yanlış mı anladım. Teşekkürler
Evet, yazıda anlatılan MongoDb driver’ı değil, MongoLab Wep Api ile iletişim kuran bir yardımcı bir sınıftır. MongoLab ise kullanıcılara MongoDb hizmeti sağlayan bir sitedir.