Android доступ к удаленной базе данных SQL

могу ли я получить доступ к удаленной базе данных SQL (на веб-сервере) непосредственно из программы android? т. е. просто открыть соединение со всеми необходимыми параметрами, а затем выполнить SQL-запрос?

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

Если да , то какие библиотеки мне нужны в Java?

спасибо.

3 ответов


этот вопрос всплывал несколько раз. Возможно, вы сможете напрямую подключить android-устройство к SQL server, если развернете драйверы MSSQL JDBC на android-устройстве, а затем предоставите SQL server непосредственно в интернет. Если драйверы MSSQL будут работать правильно на Android, это совершенно другая проблема.

вот как вы могли бы это сделать. Но вот почему это плохая идея.

  1. вы подвергаете свой SQL server прямо в интернет. Если вы не зашифруете данные между вашим сервером MSSQL и устройством android, для определенного хакера будет относительно легко обнюхать поток данных TDS между устройством и MSSQL и перепроектировать его и украсть ваши данные. Шифрование, вероятно, сделает гораздо труднее почти невозможно для злоумышленника, чтобы украсть ваши данные. Однако злоумышленник все равно может запустить DOS/DDOS-атаку на вашу базу данных напрямую. Не хороший идея!

  2. Если вы планируете подключить другие мобильные устройства (iPhone, Symbian, BlackBerry и т. д.), Вам также необходимо будет создать SQL-соединение с этих устройств. iPhone не поддерживает Java изначально (из моей памяти), например, поэтому вам нужно будет найти способ подключения iPhone к SQL server. BlackBerry может быть проще, но Symbian вам не повезет. Таким образом, вам нужно будет почти создать пользовательское решение для каждого подключение устройства к базе данных. плохая идея нагрузки обслуживания

создайте веб-сервис или пользовательский сервер TCP / IP, который может управлять вашей базой данных. Подключитесь к этому webservice/service с вашего устройства. Веб-службы-это путь. Более 90% устройств в эти дни изначально способны выполнять вызов веб-службы.


Я думаю, вам нужно использовать webservice для связи с базой данных SQL. вы можете определить общие методы, такие как runSomeScalarQuery или runOneTabularQuery and ... в этом веб-сервисе и отправлять ответы базы данных по самоопределяющемуся протоколу, как самоопределяющийся объект.


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

  • загрузите драйвер отсюда:http://dev.mysql.com/downloads/connector/j/3.0.html (есть некоторые новые, но этот работает отлично)
  • если ваш проект не имеет папки" libs", создайте его сейчас.
  • распакуйте загруженный файл и скопируйте файл mysql-connector-java-3.0.17-ga-bin.jar в папку libs
  • добавить в путь сборки :
    • щелкните правой кнопкой мыши на project > Build Path >Configure Build Path
    • библиотеки вкладок > добавить JAR
    • перейдите в папку libs и выберите файл jar
  • как только это будет готово, мы можем продолжить Программирование. Как мы знаем, Android заставить нас сделать доступ к сети в отдельном потоке, поэтому мы должны выбрать способ создания резьбы, например, мы можем использовать AsynkTask и добавить наш код doInBackground метод.

    private static final String url = "jdbc:mysql://{URL_SERVER}/{BASE_DATOS}";
    private static final String user = "usuario";
    private static final String password = "contraseña";
    int count=0;
    try {
         // The newInstance() call is a work around for some broken Java implementations
         //this creates some static objects that we need. 
         Class.forName("com.mysql.jdbc.Driver").newInstance();
         Connection con = DriverManager.getConnection(url, user, password);
         Statement st = con.createStatement();
         ResultSet rs = st.executeQuery("QUERY");
         while (rs.next()) {
               //in every iteration we have a  result
               //if query is a Select, for instance 
               //"select one_column, another_column from ..." 
               //remember that rs has functions such as
               //rs.getString(0)  
               //rs.getDouble(1) 
               //etc, that get the index of the columns in the select 
               //and cast it to the specific type
    
               //here we do whatever we need with the results, 
               //and probably keep track of the progress with something like
          // publishProgress(++count);
    
               // end early if asynctask was cancel() 
               if (isCancelled())
            break;
    
       }
    }
    
    catch (Exception e) {
     e.printStackTrace();
    }