Android Studio Database Bağlantı Sorunu
-
Pgadmin ile oluşturduğum bir veritabanı var ve ben bu veri tabanını android studioya bağlamak istiyorum. Fakat ne denersem deneyeyim hep bir bağlantı sorunu çıkıyor. Bu sorun yazdığım kodlarla mı ilgili, postgresql ile mi?
DatabaseHelper sınıfı:package com.murat.servis; import android.os.StrictMode; import android.util.Log; import android.widget.Toast; import java.sql.Connection; import java.sql.DriverManager; public class DatabaseHelper { Connection conn; String host; String user; String password; String port; String name; public Connection connection() { host = "127.0.0.1"; user = "postgres"; password = "123456"; name = "Servis"; port = "5432"; StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); try { Class.forName("org.postgresql.Driver"); String connectionURL = "jdbc:postgresql://" + host + ":" + port + "/" + name; conn = DriverManager.getConnection(connectionURL, user, password); } catch (Exception e) { Log.e("Error", e.getMessage()); } return conn; } }
Acticity:
package com.murat.servis; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.Toast; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class DriverRegister extends AppCompatActivity { Connection connect; EditText driver_name; EditText driver_surname; EditText driver_mail; EditText driver_password; EditText driver_phone; EditText birthday; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.driver_register); driver_name = findViewById(R.id.driver_name); driver_surname = findViewById(R.id.driver_surname); driver_mail = findViewById(R.id.register_email2); driver_phone = findViewById(R.id.driver_number); birthday = findViewById(R.id.driver_birthday); driver_password = findViewById(R.id.register_password2); } public void registered2(View view) { String d_name = driver_name.getText().toString().trim(); String d_surname = driver_surname.getText().toString().trim(); String d_mail = driver_mail.getText().toString().trim(); String d_phone = driver_phone.getText().toString().trim(); String d_birthday = birthday.getText().toString().trim(); String d_password = driver_password.getText().toString().trim(); try { DatabaseHelper connectionHelper = new DatabaseHelper(); connect = connectionHelper.connection(); String query = "INSERT INTO driver(driver_name,driver_surname,driver_mail,driver_phone,driver_birthday,driver_password) " + "VALUES('" + d_name + "','" + d_surname + "','" + d_mail + "','" + d_phone + "','" + d_birthday + "','" + d_password + "')"; Statement st = connect.createStatement(); st.executeUpdate(query); connect.close(); } catch(Exception e) { Log.e("Error", e.getMessage()); } Intent intent = new Intent(DriverRegister.this, DriverLogin.class); startActivity(intent); } }
build.gradle:plugins {
id("com.android.application")
}
android {
namespace = "com.murat.servis"
compileSdk = 34
defaultConfig {
applicationId = "com.murat.servis"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation(files("C:\\Users\\Administrator\\AndroidStudioProjects\\Servis2\\app\\libs\\postgresql-42.7.2.jar"))
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
} -
cok fazla detay vermissin nasil bir hata mesela?
StrictMode neden kullanmissin hocam? Bunun yerine sinifini AsyncTask'tan türettirip background'da bu db connection islemi yaptirabilirsin.
Hatayi söylemedigin icin; veritabani baglantinin dogrulugunu kontrol etmen lazim. Dbeaver programini kurup, db'ne baglanmaya calis, sorunsuz baglanti kurabiliyor musun? Bu kisim önemli, cünkü herhangi bir client'dan kodda verdigin bu bilgilerle baglanamiyorsan, orada bir sorun var demektir.
Ip yerine localhost yazmayi deneyebilirsin, bazen bunla ilgili sorunlar da olabiliyor. Tamamen local'da oldugun icin gerek yok ama yine de androidmanifest'e internet izinini ekle
<uses-permission android:name="android.permission.INTERNET" />
-
Şöyle anladım, doğru mu?
PostgreSQL veritabanın var. Bir de Android Studio ile bir uygulama yazdın PostgreSQL veritabanına bağlanmak için. Db'ye dışarıdan erişim var mı? Ayrıca Android kısmında host olarak 127.0.0.1 olarak hedef belirtmişsin, bu ip erişimi networkde geçersiz olur. Lokal bir ip. Yani Android cihazın içindeki bir ip adresi gibi düşünebilirsin. Oysa db Android cihazın dışında bir yerde.
-
ontedi bunu yazdı
Şöyle anladım, doğru mu?
PostgreSQL veritabanın var. Bir de Android Studio ile bir uygulama yazdın PostgreSQL veritabanına bağlanmak için. Db'ye dışarıdan erişim var mı? Ayrıca Android kısmında host olarak 127.0.0.1 olarak hedef belirtmişsin, bu ip erişimi networkde geçersiz olur. Lokal bir ip. Yani Android cihazın içindeki bir ip adresi gibi düşünebilirsin. Oysa db Android cihazın dışında bir yerde.
disardan erisim mümkün olabiliyor hocam dogru ayarlamissan. önemli olan ayni agda olman.
Aslinda söyle düzelteyim, bu sekilde direk denemedim ama local bir API ile mobile app baglanti kurabiliyor. Teorik olarak DB'nin de baglanti kurmasi problem olmaz
-
Biraz daha baktim da postgresql.conf dosyasinda cesitli ayarlamalar yapmak gerekiyormus.
ordaki
- localhost ya da 127.0.0.1 gibi ip adresini 0.0.0.0 'a cekmek lazim
- firewall'da 5432 portuna izin ver (local'de oldugu icin sorun olmamasi lazim aslinda ama yine de denemek lazim)
- connection string'ini bilgisayarin local IP'sine göre düzenle: mesela local ip 192.168.1.15 olsun
jdbc:postgresql://192.168.1.15:5432/Servis
seklinde yap
suraya da bak https://stackoverflow.com/questions/3278379/how-to-configure-postgresql-to-accept-all-incoming-connections
bir de pgadmin'in bir client degil webserver olmasi gerek.
Bana kalirsa bu sekilde DB'ye erismek mantiksiz ve cok fazla sorun cikarma ihtimali olan bir yol. JS biliyorsan, basitce nodejs ile bir tane api yazip, db'ye onla erisim sagla. android uygulaman da bu api'ye erisim saglasin. En basit ve temiz cözümü bu olur
-
unbalanced bunu yazdı
cok fazla detay vermissin nasil bir hata mesela?
StrictMode neden kullanmissin hocam? Bunun yerine sinifini AsyncTask'tan türettirip background'da bu db connection islemi yaptirabilirsin.
Hatayi söylemedigin icin; veritabani baglantinin dogrulugunu kontrol etmen lazim. Dbeaver programini kurup, db'ne baglanmaya calis, sorunsuz baglanti kurabiliyor musun? Bu kisim önemli, cünkü herhangi bir client'dan kodda verdigin bu bilgilerle baglanamiyorsan, orada bir sorun var demektir.
Ip yerine localhost yazmayi deneyebilirsin, bazen bunla ilgili sorunlar da olabiliyor. Tamamen local'da oldugun icin gerek yok ama yine de androidmanifest'e internet izinini ekle
hocam şu hataları alıyorum:
Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
Attempt to invoke interface method 'java.sql.Statement java.sql.Connection.createStatement()' on a null object reference
Internet iznini de ekledim
Siz yazdıkdatan sonra dbeaver de bağlanmayı denedim, bağlandı bir sorun çıkmadı. -
unbalanced bunu yazdı
Biraz daha baktim da postgresql.conf dosyasinda cesitli ayarlamalar yapmak gerekiyormus.
ordaki
- localhost ya da 127.0.0.1 gibi ip adresini 0.0.0.0 'a cekmek lazim
- firewall'da 5432 portuna izin ver (local'de oldugu icin sorun olmamasi lazim aslinda ama yine de denemek lazim)
- connection string'ini bilgisayarin local IP'sine göre düzenle: mesela local ip 192.168.1.15 olsun
jdbc:postgresql://192.168.1.15:5432/Servis
seklinde yap
suraya da bak https://stackoverflow.com/questions/3278379/how-to-configure-postgresql-to-accept-all-incoming-connections
bir de pgadmin'in bir client degil webserver olmasi gerek.
Bana kalirsa bu sekilde DB'ye erismek mantiksiz ve cok fazla sorun cikarma ihtimali olan bir yol. JS biliyorsan, basitce nodejs ile bir tane api yazip, db'ye onla erisim sagla. android uygulaman da bu api'ye erisim saglasin. En basit ve temiz cözümü bu olur
Hocam önerdiklerinizi denedim ama sanırsam farklı bir sıkıntı var.
-
ontedi bunu yazdı
Şöyle anladım, doğru mu?
PostgreSQL veritabanın var. Bir de Android Studio ile bir uygulama yazdın PostgreSQL veritabanına bağlanmak için. Db'ye dışarıdan erişim var mı? Ayrıca Android kısmında host olarak 127.0.0.1 olarak hedef belirtmişsin, bu ip erişimi networkde geçersiz olur. Lokal bir ip. Yani Android cihazın içindeki bir ip adresi gibi düşünebilirsin. Oysa db Android cihazın dışında bir yerde.
localhost'uda denedim, sorunun host isminden kaynaklandığını düşünmüyorum
-
Android tarafında ip adresini şu şekilde yap http://10.0.2.2:5058/ bold yaptığım yeri postgrenin portunu yaz. Aynı makinede (pcde) hem postgre hem de android çalıştırdığını varsayıyorum.
-
emulator üzerinden kullaniyorsan 10.0.2.2 ipsini deneyebilirsin.
Bir de direk telefon yerine, ayni agda bagli olan bir makineden bu veritabanina erismeyi dener misin? Orada erisebilirsen, diger yerlerden de erisebilirsin.
ikinci hatan (konuyla cok alakali degil)
burdaki connect nesnesi null ise (connection metod null gönderiyor baglanti yapamadigi icin)
Statement st = connect.createStatement();
o yüzden söyle bir sey yapif(connect != null { Statement st = connect.createStatement(); st.executeUpdate(query); connect.close(); }
senin sikintin, bir sekilde host'u bulamamasi ya da baglantiya izin verilmemesi. Bunu da cözmek icin ayarlarini dogru yapman gerek. Dedigim gibi ayni agda farkli bir yerden bu veritabanina ulasabilirsen, sorunun cözülecektir.Yine dedigim gibi, bu yol güzel bir yol degildir -
unbalanced bunu yazdı
emulator üzerinden kullaniyorsan 10.0.2.2 ipsini deneyebilirsin.
Bir de direk telefon yerine, ayni agda bagli olan bir makineden bu veritabanina erismeyi dener misin? Orada erisebilirsen, diger yerlerden de erisebilirsin.
ikinci hatan (konuyla cok alakali degil)
burdaki connect nesnesi null ise (connection metod null gönderiyor baglanti yapamadigi icin)
Statement st = connect.createStatement();
o yüzden söyle bir sey yapif(connect != null { Statement st = connect.createStatement(); st.executeUpdate(query); connect.close(); }
senin sikintin, bir sekilde host'u bulamamasi ya da baglantiya izin verilmemesi. Bunu da cözmek icin ayarlarini dogru yapman gerek. Dedigim gibi ayni agda farkli bir yerden bu veritabanina ulasabilirsen, sorunun cözülecektir.Yine dedigim gibi, bu yol güzel bir yol degildirHocam doğru söylüyorsunuz. Sizin dediğiniz gibi node.js'te bir apı oluşturdum bu şekilde devam edeceğim. Her şey için çok teşekkür ederim.