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的内容

     

    运行效果,刚打开程序:

    点击按钮后:

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

     

  • 相关阅读:
    后缀字符串 计蒜客模拟赛
    HDU 1087 最长不下降子序列 LIS DP
    POJ 3126
    Authorize by ClaimIdentity by Owin
    Authencation WebApi Learning
    Agency-AccrualDetails Table Summary
    EF usage with ABP
    Scss environment setup
    Tips about CSS usage
    Send Mail C#
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3080515.html
Copyright © 2011-2022 走看看