安卓应用能直接连接在线mysql数据库吗?

56
Android 3.3 API 18

你好,

我正在开发我的第一个Android应用程序。该应用程序将需要连接到在线数据库以存储用户数据。

我正在寻找一个包含MySQL数据库的云存储。然而,我的应用程序可以直接连接到这个MySQL数据库并从中推送和拉取数据吗?还是需要做其他的事情?

非常感谢任何建议,


是的,你可以这样做,你需要编写服务器端代码,可以使用PHP或.NET。 - KOTIOS
我认为这可能对你有所帮助。[查看此帖子] - prakash
在这里,数据正在从后端数据库中填充。连接Android应用程序到使用PHP和MySQL的数据库。 - SRBhagwat
8个回答

86

是的,你可以这样做。

你需要的材料:

  1. Web服务器
  2. 存储在Web服务器中的数据库
  3. 一点Android知识 :)
  4. Web服务(JSON、XML等等),选择你熟悉的

1.首先,在你的清单文件中设置 Internet 权限。

 <uses-permission android:name="android.permission.INTERNET" />

2. 制作一个类从服务器发出HTTPRequest(我使用JSON解析来获取值)

例如:

    public class JSONfunctions {

    public static JSONObject getJSONfromURL(String url) {
        InputStream is = null;
        String result = "";
        JSONObject jArray = null;

        // Download JSON data from URL
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }

        // Convert response to string
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        try {

            jArray = new JSONObject(result);
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }

        return jArray;
    }
}

3. 在你的 MainActivity 中创建一个 JsonFunctions 类的对象,并将从中获取数据的 URL 作为参数传递。

例如:

JSONObject jsonobject;

jsonobject = JSONfunctions.getJSONfromURL("http://YOUR_DATABASE_URL");

4.最后读取jsontags并将值存储在arraylist中,如果需要,稍后在listview中显示它。

如果您遇到任何问题,可以参考这篇博客,他提供了优秀的Android教程:AndroidHive

由于我之前写的答案已经过时,现在Api 23中已删除了HttpClientHttpPostHttpEntity。 您可以使用以下代码在build.gradle(应用程序级别)中继续在项目中使用 org.apache.http

android {
    useLibrary 'org.apache.http.legacy'
    signingConfigs {}
    buildTypes {}
}

或者您可以使用下面的代码 HttpURLConnection 从服务器获取响应


public String getJSON(String url, int timeout) {
HttpURLConnection c = null;
try {
    URL u = new URL(url);
    c = (HttpURLConnection) u.openConnection();
    c.setRequestMethod("GET");
    c.setRequestProperty("Content-length", "0");
    c.setUseCaches(false);
    c.setAllowUserInteraction(false);
    c.setConnectTimeout(timeout);
    c.setReadTimeout(timeout);
    c.connect();
    int status = c.getResponseCode();

    switch (status) {
        case 200:
        case 201:
            BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line+"\n");
            }
            br.close();
            return sb.toString();
    }

} catch (MalformedURLException ex) {
    Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} finally {
   if (c != null) {
      try {
          c.disconnect();
      } catch (Exception ex) {
         Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
      }
   }
}
return null;

或者您可以使用第三方库,如VolleyRetrofit来调用WebService API并获取响应,稍后使用FasterXML-jacksongoogle-gson进行解析。


6
谢谢您提供的解决方案。我想知道您是否能推荐一些免费提供MySQL数据库并可供我的应用程序连接的托管网站,因为我是学术界的人,不需要太多带宽和空间。谢谢。 - ant2009
我也是一个Android的初学者。我们不需要创建本地数据库来使应用程序后续平稳运行吗?我正在开发一个类似的项目。只要连接到互联网,它就可以正常工作,但之后就无法正常工作了。这有意义吗? - timberlake
7
尽管存在解决方案,但“安卓应用程序能否直接连接到在线mysql数据库”的正确答案是“不行”。 - BrainCrash
1
如果您正在使用Web服务器,则确实回答了问题的情况,但这并不是“直接”的。 - SOFe
@BrainCrash 如果你编写一个直接实现MySQL协议的库,只要你可以访问java.net类,这在技术上仍然是可能的。虽然比直接添加JDBC依赖项更复杂,但答案肯定不是“不行”。 - SOFe
这里我有一个教程,数据是从后端数据库中填充的。http://androidbash.com/connecting-android-app-to-a-database-using-php-and-mysql/ - SRBhagwat

12

你想做的事情是个坏主意。这需要在应用程序中嵌入你的用户名和密码。这是一个非常糟糕的主意,因为可能会通过逆向工程你的APK并获取到连接公共mysql服务器的用户名和密码,该服务器可能包含敏感用户数据。

我建议创建一个Web服务来作为mysql服务器的代理。我假设用户需要登录,因此可以使用他们的用户名/密码来认证Web服务。


一个人能做的事情与一个人应该做的事情是不同的。你对此担忧是完全正确的。暴露用户名和密码是一个问题,但没有认证的在线推拉服务也可能同样有害(特别是如果反编译还会暴露数据模式)。 - tony gil

8
您可以使用PHP、JSP、ASP或任何其他服务器端脚本来连接MySQL数据库,并返回JSON数据,您可以解析它在您的Android应用程序中。这是一个链接,告诉你如何做到这一点: 点击这里

5

步骤1:在您的服务器上创建一个网络服务

步骤2:使您的应用程序调用网络服务并接收结果集


4
你绝对可以制作这样的应用程序,你需要通过调用一个php脚本来与数据库建立http连接,该脚本将根据你的项目运行特定的查询,并以xml或json格式生成结果,这些结果可以在你的android应用程序上显示!关于如何将android应用程序连接到mysql数据库的完整教程,请参考此教程

4

当然可以连接到在线的MySql数据库,为此您需要创建一个Web服务。这个Web服务将提供您访问MySql数据库的权限,然后您就可以轻松地推拉数据到MySql数据库中。PHP是创建Web服务的良好选择,因为它易于实现。祝你好运...


3

这其实非常简单。但是你无法直接实现它。你需要选择一种服务器端技术。在这方面,你可以使用任何东西。这就是我们所谓的RESTful API或SOAP API。取决于你选择什么。 我已经做过许多包含两者的项目。我更喜欢REST。 所以会发生什么,你将在你的Web服务器上拥有一些脚本,并知道它们的URL。例如,我们需要进行用户注册。为此,我们有

mydomain.com/v1/userregister.php

现在从Android端,您将向上述URL发送一个HTTP请求。上述URL将处理用户注册,并给您一个响应,告诉您操作是否成功。
有关上述概念的完整详细说明,请访问以下链接。 **Android MySQL教程执行CRUD操作 **

2

看看这个在线后端。

Parse.com

他们提供推送通知,社交整合,数据存储和通过云代码为您的应用程序后端添加丰富的自定义逻辑的能力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接