Añadir la opcion de conexion local a la app

This commit is contained in:
2026-08-06 11:25:35 +02:00
parent c8eeecc141
commit e0b554deb6
3 changed files with 40 additions and 25 deletions
+2 -1
View File
@@ -16,7 +16,8 @@
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.Despensapp"> android:theme="@style/Theme.Despensapp"
android:usesCleartextTraffic="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
@@ -7,11 +7,13 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.gson.GsonConverterFactory
import java.sql.Connection
import java.sql.DriverManager import java.sql.DriverManager
import java.sql.SQLException import java.sql.SQLException
class PantryRepository { class PantryRepository {
private val dbUrl = "jdbc:mariadb://mariadb.peta9.com:3306/despensa_db" private val publicDbUrl = "jdbc:mariadb://mariadb.peta9.com:3306/despensa_db"
private val localDbUrl = "jdbc:mariadb://192.168.1.254:3306/despensa_db"
private val dbUser = "despensa_dba" private val dbUser = "despensa_dba"
private val dbPassword = "Pedro@110387" private val dbPassword = "Pedro@110387"
@@ -21,6 +23,16 @@ class PantryRepository {
.build() .build()
.create(OpenFoodFactsApi::class.java) .create(OpenFoodFactsApi::class.java)
private fun getConnection(): Connection {
Class.forName("org.mariadb.jdbc.Driver")
return try {
DriverManager.setLoginTimeout(3)
DriverManager.getConnection(publicDbUrl, dbUser, dbPassword)
} catch (e: SQLException) {
DriverManager.getConnection(localDbUrl, dbUser, dbPassword)
}
}
suspend fun getProductFromOFF(barcode: String): Result<OFFProduct?> { suspend fun getProductFromOFF(barcode: String): Result<OFFProduct?> {
return try { return try {
val response = offApi.getProductByBarcode(barcode) val response = offApi.getProductByBarcode(barcode)
@@ -37,8 +49,7 @@ class PantryRepository {
suspend fun getAllProductsFromDb(): Result<List<Product>> { suspend fun getAllProductsFromDb(): Result<List<Product>> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
Class.forName("org.mariadb.jdbc.Driver") val connection = getConnection()
val connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
val sql = "SELECT * FROM productos" val sql = "SELECT * FROM productos"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
val resultSet = statement.executeQuery() val resultSet = statement.executeQuery()
@@ -70,8 +81,7 @@ class PantryRepository {
suspend fun updateProductQuantity(productId: Int, newQuantity: Int): Result<Boolean> { suspend fun updateProductQuantity(productId: Int, newQuantity: Int): Result<Boolean> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
Class.forName("org.mariadb.jdbc.Driver") val connection = getConnection()
val connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
val sql = "UPDATE productos SET cantidad = ? WHERE id = ?" val sql = "UPDATE productos SET cantidad = ? WHERE id = ?"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
statement.setInt(1, newQuantity) statement.setInt(1, newQuantity)
@@ -92,20 +102,19 @@ class PantryRepository {
cantidad: Int, cantidad: Int,
minCantidad: Int, minCantidad: Int,
unidad: String, unidad: String,
categoria: String, category: String,
fechaCaducidad: String? fechaCaducidad: String?
): Result<Boolean> { ): Result<Boolean> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
Class.forName("org.mariadb.jdbc.Driver") val connection = getConnection()
val connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
val sql = "UPDATE productos SET nombre = ?, cantidad = ?, cantidad_minima = ?, unidad = ?, categoria = ?, fecha_caducidad = ? WHERE id = ?" val sql = "UPDATE productos SET nombre = ?, cantidad = ?, cantidad_minima = ?, unidad = ?, categoria = ?, fecha_caducidad = ? WHERE id = ?"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
statement.setString(1, nombre) statement.setString(1, nombre)
statement.setInt(2, cantidad) statement.setInt(2, cantidad)
statement.setInt(3, minCantidad) statement.setInt(3, minCantidad)
statement.setString(4, unidad) statement.setString(4, unidad)
statement.setString(5, categoria) statement.setString(5, category)
statement.setString(6, fechaCaducidad) statement.setString(6, fechaCaducidad)
statement.setInt(7, productId) statement.setInt(7, productId)
@@ -130,8 +139,7 @@ class PantryRepository {
): Result<Boolean> { ): Result<Boolean> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
Class.forName("org.mariadb.jdbc.Driver") val connection = getConnection()
val connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
val sql = "INSERT INTO productos (barcode, nombre, cantidad, cantidad_minima, unidad, categoria, imagen_url, fecha_caducidad) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" val sql = "INSERT INTO productos (barcode, nombre, cantidad, cantidad_minima, unidad, categoria, imagen_url, fecha_caducidad) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
statement.setString(1, barcode) statement.setString(1, barcode)
@@ -155,8 +163,7 @@ class PantryRepository {
suspend fun deleteProduct(productId: Int): Result<Boolean> { suspend fun deleteProduct(productId: Int): Result<Boolean> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
Class.forName("org.mariadb.jdbc.Driver") val connection = getConnection()
val connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
val sql = "DELETE FROM productos WHERE id = ?" val sql = "DELETE FROM productos WHERE id = ?"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
statement.setInt(1, productId) statement.setInt(1, productId)
@@ -173,8 +180,7 @@ class PantryRepository {
suspend fun getProductById(productId: Int): Result<Product?> { suspend fun getProductById(productId: Int): Result<Product?> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
Class.forName("org.mariadb.jdbc.Driver") val connection = getConnection()
val connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
val sql = "SELECT * FROM productos WHERE id = ?" val sql = "SELECT * FROM productos WHERE id = ?"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
statement.setInt(1, productId) statement.setInt(1, productId)
@@ -2,21 +2,32 @@ package com.example.despensapp.data.repository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.sql.Connection
import java.sql.DriverManager import java.sql.DriverManager
import java.sql.SQLException import java.sql.SQLException
class UserRepository { class UserRepository {
private val url = "jdbc:mariadb://mariadb.peta9.com:3306/despensa_db" private val publicUrl = "jdbc:mariadb://mariadb.peta9.com:3306/despensa_db"
private val localUrl = "jdbc:mariadb://192.168.1.254:3306/despensa_db"
private val user = "despensa_dba" private val user = "despensa_dba"
private val password = "Pedro@110387" private val password = "Pedro@110387"
private fun getConnection(): Connection {
Class.forName("org.mariadb.jdbc.Driver")
return try {
// Intentar primero por la URL pública
DriverManager.setLoginTimeout(3) // Timeout corto para fallar rápido si estamos en local
DriverManager.getConnection(publicUrl, user, password)
} catch (e: SQLException) {
// Si falla (ej. NAT Loopback en WiFi local), intentar por la IP local
DriverManager.getConnection(localUrl, user, password)
}
}
suspend fun registerUser(nombre: String, email: String, contrasena: String): Result<Boolean> { suspend fun registerUser(nombre: String, email: String, contrasena: String): Result<Boolean> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
// Forzar carga del driver val connection = getConnection()
Class.forName("org.mariadb.jdbc.Driver")
val connection = DriverManager.getConnection(url, user, password)
val sql = "INSERT INTO usuarios (nombre_completo, email, contrasena) VALUES (?, ?, ?)" val sql = "INSERT INTO usuarios (nombre_completo, email, contrasena) VALUES (?, ?, ?)"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
statement.setString(1, nombre) statement.setString(1, nombre)
@@ -31,8 +42,6 @@ class UserRepository {
} else { } else {
Result.failure(Exception("No se pudo insertar el usuario")) Result.failure(Exception("No se pudo insertar el usuario"))
} }
} catch (e: SQLException) {
Result.failure(e)
} catch (e: Exception) { } catch (e: Exception) {
Result.failure(e) Result.failure(e)
} }
@@ -42,8 +51,7 @@ class UserRepository {
suspend fun loginUser(email: String, contrasena: String): Result<Boolean> { suspend fun loginUser(email: String, contrasena: String): Result<Boolean> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
try { try {
Class.forName("org.mariadb.jdbc.Driver") val connection = getConnection()
val connection = DriverManager.getConnection(url, user, password)
val sql = "SELECT * FROM usuarios WHERE email = ? AND contrasena = ?" val sql = "SELECT * FROM usuarios WHERE email = ? AND contrasena = ?"
val statement = connection.prepareStatement(sql) val statement = connection.prepareStatement(sql)
statement.setString(1, email) statement.setString(1, email)