zoukankan      html  css  js  c++  java
  • 使用云(BAE)实现android应用数据的远程存取(MySQL)

    文章来源:http://xevan.net/bae-for-android/

    在做android应用的时候,我们不可避免的要存取数据,而且更多的时候用的就是本地的MySQL服务器,但是通过百度的BAE却能实现数据的远程存取,即在公网内访问。本文就简单的通过一个实例来向大家说明怎样使用BAE来使用云数据库。

    1、什么是BAE?

    百度云环境,即BAE(百度应用引擎),提供多语言、弹性的服务端运行环境,能帮助开发者快速开发并部署应用。云环境内置丰富的分布式计算API,并支持全方位的百度“云”服务,更能为您的应用带来强大动力,从“本地”变“分布式”,简单可依赖。具体可参见上面的官网链接。

    我们这里用到的就是百度的云存储。

    2、部署云环境

    注册百度帐号,点击管理中心,填写相关的个人信息。并激活邮箱。

    点击创建应用,选择web应用,填写应用名称,并选择PC Iframe

    选择云环境,进行手机验证,然后进行托管设置,域名随意选取,并选择环境类型为java,确定,提示创建应用成功。

    回到基本信息处,此时应用已经有了AppID(BAE托管)

    点击云环境---->云数据库---->创建数据库,当然是用免费的了。

    此时云环境部署成功,

    3、向云端数据库写入测试数据。

    点击操作栏下的phpmyadmin(这是用php写成的用于管理mysql数据库的可视化应用程序)(注:safari浏览器无法打开,如果你不能打开的时候尝试换用其它浏览器)

    打开界面如下

    新建一张表,名字随意填写,这里为evanTest,字段数是指有几个变量,这里填写3个吧。并点击执行,填写变量名字和类型和长度,点击保存

    点击数据表后边的插入选项,我们写入一组数据吧,并点击执行

    至此,数据表里就多了一组数据。

    4、搭建本地WEB应用并部署至BAE云端

    点击这里安装插件,或者直接点击这里(一键安装)下载集成的开发环境。

    首先我们在安装好插件或者下载好的eclipse上能看到百度的标志,点击并选择New BAE Project(Java)

    我的项目取名为evan,新建后我们发现跟一般的web服务器基本是一致的,而且还给我们省去了很多搭建各种环境的步骤,很是方便!

    我们直接修改HelloWorldServlet.java的代码(这个类其实就是Servlet),在这里边处理android客户端的请求。

    文件代码如下:

    package test;
    
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.baidu.bae.api.util.BaeEnv;
    
    public class HelloWorldServlet extends HttpServlet {
    
    	/**
    	 *
    	 */
    	private static final long serialVersionUID = 1L;
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		String host = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_ADDR_SQL_IP);
    		String port = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_ADDR_SQL_PORT);
    		String username = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_AK);
    		String password = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_SK);
    		String driverName = "com.mysql.jdbc.Driver";
    		String dbUrl = "jdbc:mysql://";
    		String serverName = host + ":" + port + "/";
    		// 从平台查询应用要使用的数据库名
    		String databaseName = "HDxhGItkNqwdecJzXubX";
    		String connName = dbUrl + serverName + databaseName;
    		String sql = "select * from evanTest";
    		String info;
    		Connection connection = null;
    		Statement stmt = null;
    		ResultSet rs = null;
    		try {
    			Class.forName(driverName);
    			// 具体的数据库操作逻辑
    			connection = DriverManager.getConnection(connName, username,
    					password);
    			stmt = connection.createStatement();
    			rs = stmt.executeQuery(sql);
    			String m_name = "", m_school = "", m_city = "";
    			DataOutputStream output = new DataOutputStream(resp.getOutputStream() );
    			while (rs.next()) {
    				m_name = rs.getString("name");
    				m_school = rs.getString("school");
    				m_city = rs.getString("city");
    				resp.setContentType("text/plain");
    				info = m_name + "_" + m_school + "_" + m_city;
    				output.writeUTF(info);
    			}
    			output.close();
    		} catch (ClassNotFoundException ex) {
    			// 异常处理逻辑
    		} catch (SQLException e) {
    			// 异常处理逻辑
    
    		} finally {
    			try {
    				if (connection != null) {
    					connection.close();
    				}
    			} catch (SQLException e) {
    
    			}
    		}
    	}
    }

     

    将第36行改为自己数据库的名字,数据库的名字在创建数据库的时候已经给了。

    将第38行from后面改为自己表的名字。

    点击百度标志---->Deploy To BAE,点击Project Properties

    填写下面的表,ApplicationID就是之前我们进行手机验证之后的AppID(BAE托管),Access Key(就是API Key)和Secure Key在百度我们的应用页面也很容易找到

    填写完毕后点OK,再点击Deploy,输入自己的帐号密码,部署成功后会显示,随便选择就可以。

    在浏览器输入我们最开始填入的域名,我填的是zyfevan.duapp.com,在浏览器输入1.zyfevan.duapp.com,会显示

    说明成功了,这个页面就是我们刚才的项目里的index.jsp显示的,若输入1.zyfevan.duapp.com/hello同样会得到数据库里边的数据,Servlet的定义是在项目WEB-INF的web.xml里定义的

    至此服务器搭建完毕。

    5、在android客户端获取服务器的数据

    新建一个android项目,首先我们布局一下界面,activity_main.xml的代码如下:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <Button
            android:id="@+id/m_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/m_textView"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="22dp"
            android:text="从数据库获取东西" />
    
        <TextView
            android:id="@+id/m_textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="62dp"
            android:text="这是原始的东西" />
    
    </RelativeLayout>

     

    然后再改写主文件,MainActivity.java的代码如下:

    package com.example.testtaxi;
    
    import java.io.ByteArrayInputStream;
    import java.io.DataInputStream;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.util.StringTokenizer;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.ParseException;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.app.Activity;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    	private Button m_button;
    	private TextView m_textView;
    	private String url = "http://1.zyfevan.duapp.com/hello";
    	private StringTokenizer info;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		m_button = (Button) findViewById(R.id.m_button);
    		m_textView = (TextView) findViewById(R.id.m_textView);
    		m_button.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				new Thread(new Runnable() {
    					public void run() {
    						try {
    							HttpGet httpRequest = new HttpGet(url);
    							HttpResponse httpResponse = new DefaultHttpClient()
    									.execute(httpRequest);
    							// 判断请求是否成功
    							if (httpResponse.getStatusLine().getStatusCode() == 200) {
    								HttpEntity entity = httpResponse.getEntity();
    								if (entity != null) {
    									info = new StringTokenizer(EntityUtils
    											.toString(entity, "utf-8"), "_");
    									if (info.countTokens() % 3 != 0) {
    										Log.v("error", "不够3段");
    									}
    									m_textView.post(new Runnable() {
    										public void run() {
    											m_textView.setText(
    													"name:"
    													+ info.nextToken()
    													+ " school:"
    													+ info.nextToken()
    													+ " city:"
    													+ info.nextToken());
    										}
    									});
    								}
    							}
    						} catch (ParseException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						} catch (IOException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    					}
    				}).start();
    			}
    		});
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }

     

    其中第33行为我们Servlet的链接

    49---60行为通过网络获取数据的代码


     

    需要特别说明的两点是:

    • 从android4.0开始就不允许在主线程里访问网络,所以在第46行我们在线程中访问网络
    • 对View的操作不能再线程中进行,所以第61行我们使用了官网介绍的post方法,用Runnable来修改TextView的内容

     

    运行效果,刚打开程序:

    点击按钮后:

    说明我们能从云端数据库获取数据了。

     

  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3080515.html
Copyright © 2011-2022 走看看