Можем ли мы подключить удаленную базу данных MySQL в Android с помощью JDBC?
Я разрабатываю клиент-серверное приложение, для которого требуется удаленное подключение к базе данных.
Я знаю, что в Интернете есть учебные пособия, и все больше людей используют PHP для взаимодействия с MySQL. Но я не так хорош в PHP, и мой предыдущий опыт связан с Core Java, Swing и JDBC.
Кто-нибудь может подсказать мне, возможно ли подключить удаленную базу данных MySQL с помощью JAVA JDBC API в приложении Android?
Переведено автоматически
Ответ 1
В принципе: вы можете подключиться к своему серверу MySQL (или к тому, что вы используете), но вы не должны делать это напрямую из своего приложения для Android.
Причины:
Приложения Android могут быть декомпилированы, и у клиента будут учетные данные для доступа к вашей базе данных. При использовании правильных инструментов взлома, таких как Backtrack, этот вредоносный клиент может получить доступ, подключить и использовать данные в вашей базе данных.
Если ваше приложение предназначено для клиентов по всему миру, то клиенты должны открывать и поддерживать соединение с вашей базой данных для каждой операции или набора операций. Открытие физического подключения к базе данных занимает много времени, даже если ваш ПК-клиент находится в локальной сети рядом с сервером database Engine. Теперь представьте, что вы открываете соединение из страны на другом конце света, например, Китая или Японии, или из страны Южной Америки, такой как Бразилия или Перу (где я живу).
По этим двум причинам, которые я могу придумать, даже пытаться подключиться к MySQL или любому другому движку базы данных напрямую со своего телефонного устройства - плохая идея.
Как решить эту проблему? Используйте сервис-ориентированную архитектуру, где у вас будет как минимум два приложения:
Приложение поставщика услуг. Это приложение будет создавать и публиковать веб-сервисы (предпочтительно RESTful) и может устанавливать политики для использования веб-сервисов, таких как аутентификация пользователя и авторизация. Это приложение также будет подключаться к базе данных и выполнять с ней операции CRUD.
Приложение-потребитель сервиса. Это будет ваше Android (или любое другое мобильное) приложение.
Судя по вашему вопросу, вы сосредоточены на пункте 1. Как я уже говорил в своих комментариях, вы можете создать веб-приложение на Java, создать там RESTful-сервис, который сводится к POJO (обычному старому объекту java), у которого есть метод для каждой службы. В этом методе, поскольку, в конце концов, это обычная Java, вы можете добавить другие функциональные возможности, такие как использование JDBC.
Вот пример запуска с использованием Jersey, Jackson (библиотека JSON) и JDBC:
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM product");
while (rs.next()) {
Product product = new Product();
product.setId(rs.getInt("id"));
product.setName(rs.getString("name"));
productList.add(product);
}
//ALWAYS close the resources
rs.close();
stmt.close();
conn.close();
return productList;
}
}
Вы можете проверить дальнейшие конфигурации веб-приложения Java в руководстве, таком как mkyong или Vogella, или любом другом, подобном вам (слишком много информации, чтобы помещать ее в этот ответ).
Обратите внимание, что тогда это приложение может эволюционировать в многоуровневое приложение, и код JDBC будет отправлен в класс DAO, и тогда ProductRestService
класс получит доступ к базе данных через этот класс DAO. Вот еще один пример запуска:
public class ProductDao {
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
//the rest of the code explained above...
return productList;
}
}
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
ProductDao productDao = new ProductDao();
return productDao.getProducts();
}
}
И вы можете применить другие изменения к этому проекту, который развивается.
Можете ли вы сказать мне, что здесь делает PHP? (если я разрабатываю с помощью PHP)
Вместо того, чтобы писать приложение поставщика услуг на Java (как показано выше), вы можете сделать это на PHP. Или на Python, Ruby, C #, Scala или любом другом языке программирования, который предоставляет вам эту технологию. Опять же, я не уверен, что за учебник вы читаете, но это должно быть где-то объяснено, и объясните, что для целей этого руководства вы будете создавать сервисы с использованием PHP. Если вам удобнее писать эти сервисы на Java, а не на PHP или любом другом языке, проблем нет. Вашему приложению для Android на самом деле все равно, какая технология используется для создания веб-сервисов, оно будет заботиться только о потреблении сервисов и о том, что данные из них могут быть использованы.
Ответ 2
Это возможно, но не рекомендуется. Я делал это раньше, поскольку был с вами в одной лодке, поэтому я поделюсь некоторым кодом.
Я специально использовал этот jdbc jar: https://www.dropbox.com/s/wr06rtjqv0q1vgs/mysql-connector-java-3.0.17-ga-bin.jar?dl=0
теперь перейдем к коду:
package com.example.test.databaseapp;
import java.sql.DriverManager;
import java.sql.SQLException;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
public class MainActivity extends Activity {
static final String url = "jdbc:mysql://x.x.x.x:xxxx/DBNAME";
static final String user = "client";
static final String pass = "password";
public static List<objClass> objList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Download(MainActivity.this, internalUrl).execute(); //async task for getting data from db
}
}
Теперь перейдем к моей асинхронной задаче:
public class Download extends AsyncTask<Void, Void, String> {
ProgressDialog mProgressDialog;
Context context;
private String url;
public Download(Context context, String url) {
this.context = context;
this.url = url;
}
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(context, "",
"Please wait, getting database...");
}
protected String doInBackground(Void... params) {
try {
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection con = DriverManager.getConnection(url, user, pass);
java.sql.Statement st = con.createStatement();
java.sql.ResultSet rs = st.executeQuery("select * from table");
list = new ArrayList<objClass>();
while (rs.next()) {
String field= rs.getString("field");
MainActivity.playerList.add(new objectClass(field));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return "Complete";
}
protected void onPostExecute(String result) {
if (result.equals("Complete")) {
mProgressDialog.dismiss();
}
}
}
Обязательно укажите разрешения доступа к Интернету в манифесте.
Не стесняйтесь задавать дополнительные вопросы о моем коде, если они у вас возникнут.
Ответ 3
Вы не можете получить доступ к базе данных MySQL с Android изначально. РЕДАКТИРОВАТЬ: На самом деле вы можете использовать JDBC, но это не рекомендуется (или может не сработать?)... смотрите Android JDBC не работает: ClassNotFoundException в драйвере
Посмотреть
http://www.helloandroid.com/tutorials/connecting-mysql-database
Android не может подключиться напрямую к серверу базы данных. Поэтому нам нужно создать простой веб-сервис, который будет передавать запросы в базу данных и возвращать ответ.
http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html
Для большинства [хороших] пользователей это может быть нормально. Но представьте, что к вам приходит хакер, который завладевает вашей программой. Я декомпилировал свои собственные приложения, и то, что я увидел, пугает. Что, если они получат ваше имя пользователя / пароль к вашей базе данных и внесут хаос? Плохо.