Soru & Cevap

Uzak Veritabanı İle Çalışma?

21.02.2014 - 01:50

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.

1,436 Görüntülenme

8 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user Teoman
Teoman
14.10.2017 - 04:07

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?

picture-66405-1449241617.jpg
murat34can52
09.02.2016 - 09:28

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.
?>

 

picture-66405-1449241617.jpg
murat34can52
03.02.2016 - 06:45

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/

picture-10362-1393062745.jpg
BYTUNCAY
22.02.2014 - 10:39

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

Mustafa
22.02.2014 - 03:25
Sevgili Bytuncay bilgilendirici cevabınız için teşekkür ederim.
Profile picture for user coderode
coderode
21.02.2014 - 11:45

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.

Yasin
18.04.2014 - 04: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.
Oğuz
22.02.2014 - 02:44
Direk javadan veritabanına bağlanmak pek güvenli değil tercih edilmez mutlaka aracı kullanmalısınız.
Profile picture for user kcdroid
kcdroid
21.02.2014 - 05:25

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

aylin
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.
Profile picture for user coderode
coderode
21.02.2014 - 03:00

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

Profile picture for user coskungun
coskungun
21.02.2014 - 02:51

Merhaba Mustafa

Hangi dilde yazıyorsun PHP mi ?