Uzak Veritabanı İle Çalışma?

Merhabalar,

Sitedeki dersler gerçekten güzel fakat uzak veritabanı bağlantısı ile ilgili Türkçe olarak güzel bir kaynak bulamadık gitti. MySQL, MongoDB vb farketmez uzaktaki veritabanıyla çalışmayla ilgili sizlerden ders bekliyoruz. Profesyonel geliştiriciler hangi veritabanını kullanıyor ve hangi yöntemleri izliyorlar bunları merak ediyoruz. En azından şimdiden giriş niteliğinde bir ders yapıp ilgi görürse detaylı taraflarını da anlatan bir ders yapabilirseniz güzel olur diye düşünmekteyim. 

İyi çalışmalar dilerim.

oshamahue

Cum, 21/02/2014 - 17:18
Mobil uygulamalarda remote db'ye bağlanma mantığı kabul görmez. Bunun bir çok sebebi var bunlara girmeyeceğim. Db'ye bağlanmak yerine server tarafında web serviveleri kullanılır. Doğru şeyler öğretme iddasında olan bir platformda bu konu hakkında eğitim verilmesi doğru olmaz kanaatindeyim. Ama mobil tarafa uygun web service eğitimi güzel olabilir.

coderode

Cum, 21/02/2014 - 23:44
Bunun neresi doğru değil bende onu anlamadım. Herhangi uzak bir veritabanı ile çalışmak istiyorum.

yakar

Cum, 18/04/2014 - 14:53
@Mustafa Sorunuzdan anlaşılan cevap: - Veritabanına bağlanmak için bir programlama dili tercih etmelisiniz. PHP, Java, C#, Rubby vb. Daha sonra o dilin veritabanına nasıl bağlandığını bulmanız gayet kolay olacaktır. Yorumlarınızdan anlaşılan cevap: - Facebook ve Twitter gibi siteler veritabanlarına güvenlik nedeniyle direkt erişim vermek istemezler ki doğru olanda budur. Facebook FBML adıyla bir ara dil geliştirmiş ve o dili kullanarak işlem yapmanızı yapmanızı sağlar. Twitter ise OAuth ile ara katmanı oluşturmuştur. Kısacası siz öncelikle ne yapmak istediğinize karar vermelisiniz. Direkt veritabanı erişimi mi yoksa ara katman (webservis vs.) ile mi erişim sağlamak.. Tabi tercihinizi yaparken "ne kadar yoğun bir kullanım olarak", "güvenlik ne kadar önemli" vb. soruları da önce yanıtlamanızda fayda var.

    +3

    Duran ÜN

    22 Şubat 2014

    apk dosyaları decompile edildiğinde bütün kodlar görülebiliyor veritabanı yolu kullanıcı adı şifresi vs. Bencede bunun en güzel yolu asp, php vs. kullanarak sorgularınızı yapıp sonuçlarını json alıp parse ettirmek. Hem güvenlik hem hız açısından mantıklı olan bu. saygılarımla

      coderode

      Cmt, 22/02/2014 - 15:25
      Sevgili Bytuncay bilgilendirici cevabınız için teşekkür ederim.

    0

    Oğuz

    21 Şubat 2014

    Bir çok yol var tabii, MySQL kullanmak isterseniz benim önerim php ile JSON arrayi döndürüp ve buna uygun bi JSON parser ile android uygulamanızda yorulmlayıp veriyi kullanabilirsiniz. MSSQL kullanırsanız ki ben genelde bunu tercih ediyorum .asmx uzantılı bir WebService ile kendi methodlarınızı C# ile kendinize uygun yazıp WSDL'a android uygulamanızda SOAP2 veya farklı kütüphaneler kullanarak bağlanabilir verilernize ulaşabilirsiniz.İnternette pek çok tutorial var şuan zamanım bunu açıklamaya yetti.Unutmadan php kullanarak MySQL'den veri çekmek birazcık daha hızlı olabiliyor. Kolay Gelsin

      aylinalev

      Pzt, 12/01/2015 - 11:24
      Merhaba,ben de uygulamam için WSDL servislerini ve SOAP2 kütüphanesini kullanıyorrum. WSDL e parametre geçirme konusunda bazı sıkıntılarım var. Geçirmem gereken datalardan birisi objelerden oluşan bir array.Birkaç kod denedim ama başarılı olamadım.Bu sorunu nasıl çözebileceğim hakkında bir bilginiz varsa ve yardımcı olabilirseniz çok sevinirim.

    0

    Mustafa

    21 Şubat 2014

    PHP 'de yazıyorum da PHP kullanmadan Java ile herhangi bir uzak veritabanı ile bağlantıya geçmek istiyorum. Aracı başka bir dil kullanmak istemiyorum

    0

    Coşkun

    Bigdata Labs http://www.bigdatalabs.com.tr - 21 Şubat 2014

    Merhaba Mustafa Hangi dilde yazıyorsun PHP mi ?

    0

    teoman

    14 Ekim 2017

    Merhaba arkadaşlar bu konuda birşey sormak istiyorum uzak veritabanı ile çalışırken iki farklı veritabanı kullanabilir miyiz?Böyle birşey deneyen oldu mu acaba?

    0

    Murat Çakmak

    09 Şubat 2016

    Beyler öncelikle size fonk.java ımı paylaşıcam internette türkçe kaynak var ancak bunun bir class olarak paylaşım yapan yok sadece anlatımlar var ben kendi classımı paylaşıyorum sizlerle. Bazıların işine yarıcaktır. Uzak veritabanı için kullanabileceğiniz. Bir tane fonk.java oluşturuyoruz. import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.Uri; import android.os.AsyncTask; import android.support.v4.app.ActivityCompat; import android.widget.EditText; import android.widget.Toast; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; /** * Created by ProgrammerDky on 9.02.2016. */ public class fonk{ private Context cnt; public fonk(Context c) { this.cnt = c; } String getStringPri(EditText edt) // bir edittext in geri değerini yani text bilgisini dönderir. { return edt.getText().toString().trim(); } boolean getStringKntrl(String s) // bir string değerin boş olup olmadığına bakadar dönen değer ise boş ise false değilse true { return !s.equals(""); } boolean strCntl(EditText edt) //bu ise bir edittext in text değeri boşmu değilmi kontrolünü yapar. { return getStringKntrl(getStringPri(edt)); } String strCvrtUrl(String s) // site url sine ayarlar göre örneğin boşluk sorunu gibi düzeltmeler yapar. { try { s = URLEncoder.encode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return s; } public String SqlInject(String s) // bildiğiniz sqlinjectleri engellemek için bir önlem ek olarak buraya ekleyebilirsiniz. { s = s.trim(); s = s.replace("'", "''"); s = s.replace("-", "_"); s = s.replace("\\", "_"); s = s.replace("/", "_"); s = s.replace("=", "_"); s = s.replace("$","_"); s = s.replace(">","_"); s = s.replace("<","_"); return s; } public boolean internetErisimi() { // internet erişimi varmı yokmu kontrolü ConnectivityManager conMgr = (ConnectivityManager)cnt.getSystemService(Context.CONNECTIVITY_SERVICE); if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable() && conMgr.getActiveNetworkInfo().isConnected()) return true; else return false; } public void yeniActivityAc(Class c, boolean kapat) // yeni bir activity açmak için bir basit bir fonksiyon eğer açıldıktan sonra bulunduğunuz activity kapanmasını istiyorsanız true değerini vermeniz yeterli. { Intent i = new Intent(cnt, c); cnt.startActivity(i); if(kapat) ((Activity) cnt).finish(); } String asycTaskCnt = ""; //bunun sayesinde postlarımızı ayırabiliceğiz. JSONObject json; JSONObject execPost(String datas[]) { try { String url = ""; if (asycTaskCnt == "lgn") // örnek ayırma url = "http://www.siteadi.com/mobil/login.php?kadi=" + strCvrtUrl(SqlInject(datas[0])) + "&sfr=" + strCvrtUrl(SqlInject(datas[1])) + ""; //else if () // bu şekilde birden fazla sorgu fonksiyonunu oluşturmanıza gerek yok. else return null; HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response = null; try { response = client.execute(get); } catch (IOException e) { e.printStackTrace(); return null; } StatusLine status = response.getStatusLine(); int s = status.getStatusCode(); if (s == 200) { HttpEntity e = response.getEntity(); String data = ""; try { data = EntityUtils.toString(e); } catch (IOException e1) { e1.printStackTrace(); return null; } try { JSONArray posts = new JSONArray(data); JSONObject result = posts.getJSONObject(0); return result; } catch (JSONException e1) { e1.printStackTrace(); return null; } } else return null; } catch (Exception exx) { return null; } } public class gonderiArkaPlan extends AsyncTask<String, String, String> { String snc; String msgx; @Override protected String doInBackground(String... strings) { json = execPost(strings); if(json == null) { return "json null"; } else { try { if (asycTaskCnt == "lgn") { // geri dönen değerleri ayırarak alma snc = json.getString("sonuc"); msgx = json.getString("sonucmesaji"); } //else if() // bu şekilde devam edilebilir. return snc; } catch (JSONException e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(String s) { if (asycTaskCnt == "lgn") { // en son msj olarak ekrana dönen değerler için ayırma. if (s.equals("yes")) { Toast.makeText(cnt, "Başarıyla Giriş Yaptınız.", Toast.LENGTH_SHORT).show(); yeniActivityAc(Admin.class, true); } else { msgBox("Login","Kullanıcı Adı Veya Şifre Yanlış!", "", "","Tamam"); } } //else if() // bu şekilde devam edilebilir. else if(s.equals("json null")) msgBox("JSON EXEC","JSON EXEC Hatası lütfen yapımcıya bildiriniz.","","","Tamam"); } } void msgBox(String title, String msg, String ozel, String pztfStr, String ngtfStr) { // bildiğiniz gibi ekranda msj yollayıp ozel seçeği ilede burada belirterek istediğimizi yapabiliriz. AlertDialog.Builder alertDialog = new AlertDialog.Builder(cnt); alertDialog.setTitle(title); alertDialog.setMessage(msg); if(!pztfStr.equals("")) { alertDialog.setPositiveButton(pztfStr, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); } if(!ngtfStr.equals("")) { alertDialog.setNegativeButton(ngtfStr, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); } alertDialog.show(); } } Kullanımı oldukça basit. sayfanın en başına global şeklinde bu kodu ekleyelim.   fonk fnk = new fonk(this); Daha sonra button yada herhangi bi olayda gerçekleştirmek istediğiniz sorgu için: fnk.asycTaskCnt = "lgn"; String data[] = {fnk.getStringPri(edtKadi), fnk.getStringPri(edtSifre)}; fnk.new gonderiArkaPlan().execute(data); yukarıda gördüğünüz gibi lgn sorgusunu yapmak istiyorum dedim. bu classta tanımlı ek sorgular için classtta belirtiğim else if kısımlarını doldurunuz. Gördüğünüz gibi kullanıcı adı ve şifreyi gönderdim ve olması gereken herşey class içinerisinde tanımlı. Buradaki data göndereceğiniz değerlerin o execpost fonksiyonundaki url kısmına göre doğru şekilde doldurursunuz. -------------------------------------------------------------------------------------- Gelelim php kısmına login.php isimli bir dosya oluşturdum. Unutmadan Kodlama tipinin utf-8 ile bom olmadan kodla seçeğini seçelim Sayfanın herhangi bir html içeriğin yada yazının falan olmamasına dikkat edelim. <?php require_once "database.php"; // database bağlantısını çektiğim bir php dosyası. // mobilden girilen değeleri alıyoruz $kadi = $_GET["kadi"]; $sfr = $_GET["sfr"]; $result = mysql_query("SELECT * FROM adminler"); // sorguyu böyle yapıyorum çünkü az kişi var veritabanımda sql inject önlemek amaçlı biliyorm where ile yapmayı yani :D $drm = false; while($row = mysql_fetch_array($result)) // bu array şeklinde tek tek satırlarımı okuyorum { $drm = true; if($kadi == $row["kadi"] && $sfr == $row["sifre"]) // mobilden aldığımız değerlerle uyuşuyormu bakıyoruz. { $sonuc = array('sonuc' => "yes", 'sonucmesaji' => "Başarıyla Giriş yaptınız."); // eğer uyuşuyorsa sonuc dizimin içine sonuc yes ve sonucmeasj kısmına ne olduğunu yazıyorum. } else $sonuc = array('sonuc' => "no", 'sonucmesaji' => "Kullanıcı Adı Veya Şifre Yanlış"); } if(!$drm) $sonuc = array('sonuc' => "no", 'sonucmesaji' => "Kullanıcı Bulunmamakta."); mysql_free_result($result); // bu array hafızadan silmek için kullanılır performans attırmak için kullanmanızı tavsiye ederim. echo "[".json_encode($sonuc)."]"; // burada json ekrana yazdırıyorum // json encode bir diziyi ekrana yazdıracak. o diziyi bizde çekiyoruz bu sayede ne olduğunu anlıyoruz. ?>  

    0

    Murat Çakmak

    03 Şubat 2016

    Arkadaş decompile edilebilir bilgiler alınabilir diyor. Php ile yapsak bile decompile edilip nereye ne veri yolladığımızı gine görebilirler. Bu sayede flood program bile yazabilirler. Bi şekilde Engellersin sınırlama gibi ama güvenli değil. Apk şifrelenmiyormu şifreniyor olması lazım.  php daha hızlı çalışır diyorsunuz daha çok bu amele işine benziyor direk sunucuya bağlanmak varken niye php kullanalım. Php bir aracı oluyor sadece yorumlamak için kullanıyoruz. Direk sorgu yapabilmek mi daha hızlı olur yoksa internet sitesine bağlanıcak daha sonra sorgu çalışacak daha sonra bilgiyi alıcak v.s Direk bağlantıda ise sorguyu direk çalıştırıp sonucu direk alıcak yani php daha yavaş olması gerekiyor hızlı olamaz çünkü daha çok işlem yapıyor. Araştırmama göre bir bağlantı çeşidi var Mysql bağlanmak için bir connector kullanıyoruz. Buradan indirebilirsiniz. https://dev.mysql.com/downloads/connector/j/ İndirdiğiniz dosyanın içinde mysql-connector-java-5.x.xx-bin.jar adlı bir dosya göreceksiniz versionu kaç ise artık gördüğünüz zamanda. Bunu library(kütüphane) eklememiz gerekiyor. Bunu yapmak için : Eclipse : proje adına sağ click > properties > Java Build Path > Libraries > Add External Jars.. Tıklayın. mysql-connector-java-5.x.xx-bin.jar neredeyse onu seçin apply butonuna basın tamamdır. Android Studio :  Öncelikle src nin altına bir libs klasörü oluşturun daha sonra indirdiğiniz dosyayı oraya atın Sonra File > Project Structure > Modules > app > Dependencies > + ikonuna tıklayın > file dependency Tıklayın mysql-connector-java-5.x.xx-bin.jar libs klasöründen seçin. daha sonra listede adını göreceksiniz oky diyin. Kontrol için build.grandle tıklayıp dependencies kısmında compile files('src/libs/mysql-connector-java-5.1.38-bin.jar') ekli olduğunu görürsünüz. Build için : Build > Clean Project Tekrar Build > Rebuild Project   Connection conn =null; try{ // Loading the MySQL Connector/J driver Class.forName ("com.mysql.jdbc.Driver").newInstance (); conn = DriverManager.getConnection("jdbc:mysql://ip:3307//databaseAdi", "userName(kadi)", "password(Şifre)"); Statement st = conn.createStatement(); Toast.makeText(getApplicationContext(), "Connected Database.", Toast.LENGTH_LONG); }catch(ClassNotFoundException e){ Toast.makeText(getApplicationContext(), "Driver Erx.:"+e, Toast.LENGTH_LONG).show(); } catch (SQLException e) { // TODO Auto-generated catch block Toast.makeText(getApplicationContext(), "SQL Erx.:"+e, Toast.LENGTH_LONG).show(); e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block Toast.makeText(getApplicationContext(), "Instant Erx.:"+e, Toast.LENGTH_LONG).show(); e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block Toast.makeText(getApplicationContext(), "Illegal Erx.:"+e, Toast.LENGTH_LONG).show(); e.printStackTrace(); } bu şekilde bağlantı test edebilirsiniz. Ancak bir problem daha var. Eğer uzak bir sunucuya bağlanıcaksanız benim yapmaya çalıştığım gibi :D Php ile denedim bağlanmayı olmadı uzaktan erişim izninimi ne açmam gerekiyormuş bunu hosting ile konuşarak yapmayı düşünüyorm çünkü bu konuda pek bilgim yok mysql root elimde olmadığı için bir şey yapamıyorum. Localhost olarak tahminen hepsi çalışacaktır ama önemli olan uzak sunucu yapabilmek :) Eğer yapamazsam Buradan görüldüğü gibi JSON & PHP mantıgına bağlı kalacağız gibi. Yapılan bir örnek çalışma : http://www.gokhanakgol.com/2012/02/26/android-mssql-uygulamasi/

    0

    Mustafa

    21 Şubat 2014

    Beni  anlamadınız sanırım. C# yada PHP kullanmak istemiyorum, yani başka yollar varsa onları öğrenmek istiyorum. Yani bir twitter, facebook vs gibi uygulamalar üye kaydı yaparken veri kaydederken neler kullanıyor. İkinci bir dil mi kullanıyorlar yoksa başka bilmediğim bir teknoloji mi kullanıyorlar.

      kcdroid

      Cmt, 22/02/2014 - 02:44
      Direk javadan veritabanına bağlanmak pek güvenli değil tercih edilmez mutlaka aracı kullanmalısınız.

      byyasin

      Cum, 18/04/2014 - 16:12
      Herkes sizi anladı, herkes aynı şeyi söylüyo ama siz ısrarla direk veritabanı bağlanmak istiyorum diyorsunuz. APK ve iPA dosyaları decompile edilip içi görülebiliyor ve bu işlem sonucunda sizin veritabanına direkt olarak bağlantı yaptığınız veritabanı sunucusu kullanıcı adı ve şifresi alelen ortada oluyor. Böyle bir sistemin güvenliği sıfır düzeyinde olduğu için hiç bir sistem bu alt yapıyı kullanmaz o yüzdende mobil arayüzde direkt olarak uzak sql bağlantısı yapılmaz. Facebook nası bağlanıyo diyosunuz ? Facebook direkt olarak veritabanına hiç bi zaman bağlanmaz. Böyle bişey söz konusu olursa o uygulamanın kodlarına erişilir o veritabanına herkes bağlanıp istediğini yapabilme özgürlüğüne kavuşur ki buda kaosa yol açar. PHP Java C# v.s. bir dil ile bir kod betiği yazarak sadece lazım olan şeyleri dışarıya çıktı veren bir program yazacaksınız. Veritabanına kayıt ekleyen kısımlarda ise aynı şekilde sadece lazım olan şeyleri ekleyen bir kod parçacığı yazacaksınız tüm bunlarıda bir kullanıcı adı şifre girişli koruma altına aldığınızda hiç bi yerde veritabanı bilgileriniz olmadığı için veritabanı bilgilerniz PHP Java C#gibi dilin içerisinde olduğundan veritabanınız güvende olacak. Mobil uygulamanızı kullanan kişide kullanıcı adı şifresini programı açıp anlık girecek şekilde ayarlarsanız kullanıcı adı şifre de güvende olacaktır. Amerikayı yeniden keşeftmek istiyosanız zamanınızı boşa harcamaya devam edebilirsiniz.
    Bu soruya cevap vermek için üye olmanız veya giriş yapmanız gerekmektedir.