Можем ли мы подключить удаленную базу данных MySQL на Android с помощью JDBC?

Я разрабатываю клиент-серверное приложение, которое требует удаленного подключения к базе данных.

Я знаю, что учебные пособия в Интернете и другие люди используют PHP для взаимодействия с MySQL. Но я не так хорош в PHP, и мой предыдущий опыт связан с Core Java, Swing и JDBC.

Может ли кто-нибудь вести меня, если можно подключить удаленную базу данных MySQL с помощью JAVA JDBC API в приложении Android?

В основном: вы можете подключиться к своему серверу MySQL (или независимо от того, что используете), но не следует делать это прямо из приложения Android.

Причины:

  1. Приложения Android могут быть декомпилированы, и клиент получит учетные данные для доступа к вашей базе данных. При использовании подходящих инструментов взлома, таких как Backtrack , этот вредоносный клиент может получить доступ, подключиться и использовать данные в вашей базе данных.

  2. Если ваше приложение предназначено для клиентов по всему миру, клиенты должны открывать и поддерживать соединение с вашей базой данных на операцию или набор операций. Открытие физического подключения к базе данных занимает много времени, даже когда ваш клиент ПК находится в локальной сети рядом с сервером ядра базы данных. Теперь представьте, что вы открываете связь из страны на другой стороне мира, например, в Китае или Японии или из страны в Южной Америке, например в Бразилии или Перу (где я живу).

По этим двум причинам я могу придумать, это плохая идея, даже пытающаяся подключиться к MySQL или любому другому движку базы данных прямо с вашего телефонного устройства.

Как решить эту проблему? Используйте сервис-ориентированную архитектуру, где у вас будет как минимум два приложения:

  1. Приложение поставщика услуг. Это приложение будет создавать и публиковать веб-службы (предпочтительно RESTful) и может устанавливать политики для использования веб-служб, таких как аутентификация и авторизация пользователей. Это приложение также подключится к базе данных и выполнит с ней операции CRUD.

  2. Сервисное потребительское приложение. Это будет ваше Android (или любое другое мобильное приложение).

Из вашего вопроса вы сосредоточились на пункте 1. Как я уже сказал в своих комментариях, вы можете создать веб-приложение на Java, создать там RESTful-службу, которая сводится к POJO (простой старый Java-объект), который имеет метод для службы. В этом методе, поскольку в действительности это простая Java, вы можете добавить другие функции, такие как использование JDBC.

Вот пример запуска с использованием Jersey, Jackson (JSON library) и JDBC:

@Path("/product") public class ProductRestService { @GET @Path("/list") @Produces(MediaType.APPLICATION_JSON) public List getProducts() { List 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 будет проходить в classе DAO, а затем class ProductRestService будет обращаться к базе данных через этот class DAO. Вот еще один пример:

 public class ProductDao { public List getProducts() { List 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 getProducts() { ProductDao productDao = new ProductDao(); return productDao.getProducts(); } } 

И вы можете применять другие изменения к этому проекту, а также развиваться.

Можете ли вы сказать мне, что здесь делает PHP? (если я разрабатываю PHP)

Вместо написания приложения поставщика услуг в Java (как показано выше) вы можете сделать это на PHP. Или в Python, Ruby, C #, Scala или любом другом языке программирования, который предоставляет вам эту технологию. Опять же, я не уверен, какой учебник вы читаете, но это должно быть объяснено где-то и объясните, что в целях этого учебника вы создадите службы с помощью PHP. Если вам удобнее писать эти службы на Java, а не на PHP или на любом другом языке, проблем нет. В вашем приложении для Android все равно, какая технология используется для создания веб-сервисов, он будет заботиться только о потреблении услуг и о том, что данные из них могут быть использованы.

Это можно сделать, но не рекомендуется. Я сделал это раньше, когда я был в одной лодке, так что я поделюсь некоторым кодом.

Я использовал этот 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://xxxx:xxxx/DBNAME"; static final String user = "client"; static final String pass = "password"; public static List 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 { 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(); 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(); } } } 

Не забудьте включить разрешения Интернета в манифест. Не стесняйтесь задавать больше вопросов о моем коде, если они есть.

Вы не можете получить доступ к базе данных MySQL изначально. EDIT: На самом деле вы можете использовать JDBC, но не рекомендуется (или может не работать?) … см. Android JDBC не работает: ClassNotFoundException на драйвере

Видеть

http://www.helloandroid.com/tutorials/connecting-mysql-database

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial.html

Android не может напрямую подключаться к серверу базы данных. Поэтому нам нужно создать простую веб-службу, которая будет передавать запросы в базу данных и вернет ответ.

http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html

Для большинства [хороших] пользователей это может быть хорошо. Но представьте, что вы получаете хакера, который захватывает вашу программу. Я декомпилировал свои собственные приложения и его страшно, что я видел. Что делать, если они получают ваше имя пользователя / пароль в вашей базе данных и наносят ущерб? Плохо.

  • JsonMappingException: из токена START_ARRAY
  • Java: как получить входные данные из System.console ()
  • Как я могу реализовать пользовательскую панель действий с пользовательскими кнопками в Android?
  • Загрузите файл с Android и покажите прогресс в ProgressDialog
  • Как возобновить Android-активность программно из фона
  • java.lang.ClassNotFoundException: Не нашел class на пути: dexpathlist
  • Как изменить десятичный разделитель DecimalFormat от запятой до точки / точки?
  • как переопределить кнопку панели действий в андроиде?
  • IDEA: javac: исходный релиз 1.7 требует целевого релиза 1.7
  • Загрузка многостраничного файла на Google Appengine с использованием jersey-1.7
  • Ошибка: выполнение выполнено для задачи: app: dexDebug. com.android.ide.common.process.ProcessException
  • Interesting Posts

    Можем ли мы использовать стиль кнопки GTK + 2.0 в Java Swing?

    Ошибка в : объект типа «закрытие» не является подмножеством

    Что такое необязательное значение в Swift?

    Компьютерные часы не работают должным образом

    Iphone – Как шифровать NSData с открытым ключом и расшифровывать с помощью закрытого ключа?

    Рассчитать размер текста в соответствии с шириной области текста

    Как ускорить Flash на медленном нетбуке?

    Как найти утечку памяти в коде / проекте на C ++?

    Почему List реализует IReadOnlyList в .NET 4.5?

    Как получить все зарегистрированные маршруты в Express?

    Лицензирование Windows: Действительность передачи между обгоревшими или работающими материнскими платами

    Как включить новый просмотр инспектора 3D-страниц в Firefox 11

    Я получаю «Определение отчета для отчета« xxxx.rdlc »не указано» в моем отчете RDLC

    Ошибка Android Studio Gradle: несколько файлов dex определяют

    Град закончил с ненулевым значением выхода 1 (ic_launcher.png: ошибка: дублированный файл)

    Давайте будем гением компьютера.