当前位置:文档之家› android客户端的数据传给web服务端进行操作

android客户端的数据传给web服务端进行操作

android客户端的数据传给web服务端进行操作
android客户端的数据传给web服务端进行操作

由于刚接触android开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较啰嗦:

步骤如下:

一、介绍:

此文主要是介利用android网络通信功能把android客户端的数据传给web服务端进行操作

此项目列举三个个传值方式:1、GET方式,2、POST方式,3、HttpClient 方式

二、新建一个android工程——NewsManage

工程目录:

三、AndroidManifest.xml配置清单

由于要访问网络,故需要添加网络访问权限,红色标注添加部分

android:versionCode="1"

android:versionName="1.0" >

android:icon="@drawable/ic_launcher"

android:label="@string/app_name" >

android:name=".NewsManageActivity"

android:label="@string/app_name" >

android:name="https://www.doczj.com/doc/9719021216.html,UNCHER" />

四、main.xml配置:

xmlns:android="https://www.doczj.com/doc/9719021216.html,/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/title" />

android:id="@+id/title"

android:layout_width="match_parent"

android:layout_height="wrap_content" >

android:id="@+id/textView1"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/timelength" />

android:id="@+id/timelength"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:numeric="integer"/>

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/button" android:onClick="save"/>

五、string.xml配置:

Hello World, NewsManageActivity! 资讯管理

视频标题

播放时长

保存

保存成功

保存失败

六、NewsManageActivity.java Activity源码:

package com.example.newsmanage;

import com.example.service.NewsService;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class NewsManageActivity extends Activity {

/** Called when the activity is first created. */

EditText titleText;

EditText lengthText;

Button button;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.doczj.com/doc/9719021216.html,yout.main);

titleText = (EditText) this.findViewById(R.id.title);

lengthText = (EditText) this.findViewById(R.id.timelength); button = (Button) this.findViewById(R.id.button);

}

public void save(View v) throws Exception{

String title = titleText.getText().toString();

String timelength = lengthText.getText().toString();

boolean result = NewsService.save(title,timelength);

if(result){

Toast.makeText(getApplicationContext(),R.string.success, Toast.LENGTH_LONG).show();

} else {

Toast.makeText(getApplicationContext(),R.string.fail,

Toast.LENGTH_LONG).show();

}

}

}

七、NewsService .java 业务类源码:

注:业务类提供三种发送请求的方式:get/post/httpClient

package com.example.service;

import java.io.OutputStream;

import https://www.doczj.com/doc/9719021216.html,.HttpURLConnection;

import https://www.doczj.com/doc/9719021216.html,.URL;

import https://www.doczj.com/doc/9719021216.html,.URLEncoder;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.http.HttpResponse;

import https://www.doczj.com/doc/9719021216.html,ValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

public class NewsService {

/**

* 保存数据,传递参数给web服务器端

* @param title 标题

* @param timelength 时长

* @return

*/

public static boolean save(String title, String timelength) throws Exception {

//119.119.228.105为本机IP地址,不能用localhost代替

String path = "http://119.119.228.105:8080/web/ManageServlet";

Map params = new HashMap();

params.put("title", title);

params.put("timelength", timelength);

//get请求方式

//return sendGETRequest(path,params,"UTF-8");

//post请求方式

//return sendPOSTRequest(path,params,"UTF-8");

//httpClient请求方式,如果单纯传递参数的话建议使用GET或者POST请求方式

return sendHttpClientPOSTRequest(path,params,"UTF-8");//httpclient 已经集成在android中

}

/**

* 通过HttpClient发送post请求

* @param path

* @param params

* @param encoding

* @return

* @throws Exception

*/

private static boolean sendHttpClientPOSTRequest(String path,

Map params, String encoding) throws Exception {

List pairs = new ArrayList();//存放请求参数

for(Map.Entry entry:params.entrySet()){

pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); }

//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,encoding);

HttpPost httpPost = new HttpPost(path);

httpPost.setEntity(entity);

DefaultHttpClient client = new DefaultHttpClient();

HttpResponse response = client.execute(httpPost);

if(response.getStatusLine().getStatusCode() == 200){

return true;

}

return false;

}

/**

* 发送post请求

* @param path 请求路径

* @param params 请求参数

* @param encoding 编码

* @return 请求是否成功

*/

private static boolean sendPOSTRequest(String path,

Map params, String encoding) throws Exception{

StringBuilder data = new StringBuilder(path);

for(Map.Entry entry:params.entrySet()){

data.append(entry.getKey()).append("=");

//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8

data.append(URLEncoder.encode(entry.getValue(),encoding));

data.append("&");

}

data.deleteCharAt(data.length() - 1);

byte[] entity = data.toString().getBytes();//得到实体数据

HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("POST");

conn.setDoOutput(true);//设置为允许对外输出数据

conn.setRequestProperty("Content-Type",

"application/x-www-form-urlencoded");

conn.setRequestProperty("Content-Length",

String.valueOf(entity.length));

OutputStream outStream = conn.getOutputStream();

outStream.write(entity);//写到缓存

if(conn.getResponseCode()==200){//只有取得服务器返回的http协议的任

何一个属性时才能把请求发送出去

return true;

}

return false;

}

/**

* 发送GET请求

* @param path 请求路径

* @param params 请求参数

* @return 请求是否成功

* @throws Exception

*/

private static boolean sendGETRequest(String path,

Map params,String encoding) throws Exception {

StringBuilder url = new StringBuilder(path);

url.append("?");

for(Map.Entry entry:params.entrySet()){

url.append(entry.getKey()).append("=");

//get方式请求参数时对参数进行utf-8编码,URLEncoder

//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8

url.append(URLEncoder.encode(entry.getValue(), encoding));

url.append("&");

}

url.deleteCharAt(url.length()-1);

HttpURLConnection conn = (HttpURLConnection) new URL(url.toString()).openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

if(conn.getResponseCode() == 200){

return true;

}

return false;

}

}

八、由于要把数据传递给web服务端,而web端传递过来的数据有两种格式,故需要新建一个web服务,使之能接收android客户端传递的参数;

1、新建一个servlet可以接收传递的参数,源码如下:

package com.example.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* Servlet implementation class ManageServlet

*/

public class ManageServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

/**

* @see HttpServlet#HttpServlet()

*/

public ManageServlet() {

super();

}

/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String title = request.getParameter("title");

//把客户端传递过来的参数进行重新编码使之能支持中文

//title = new String(title.getBytes("ISO8859-1"),"UTF-8");//使用过滤器后就不需要每次都要进行此操作

String timelength = request.getParameter("timelength");

System.out.println("视频名称:"+title);

System.out.println("播放时长:"+timelength);

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String title = request.getParameter("title");

//把客户端传递过来的参数进行重新编码使之能支持中文

//title = new String(title.getBytes("ISO8859-1"),"UTF-8");//使用过滤

器后就不需要每次都要进行此操作

String timelength = request.getParameter("timelength");

System.out.println("视频名称:"+title);

System.out.println("播放时长:"+timelength);

}

}

2、由于传递过来的参数默认编码为ISO8895-1,故打印后台的参数回事乱码故需要传递的过来的参数进行编码,但是如果每次都要对传递过来的参数都要进行编码转换,是比较麻烦的,故需要建立一个拦截器,对传递过来的参数进行统一在一起进行编码转换,当请求/*时拦截器先进行编码处理:

拦截器代码如下:

EncodingFilter .java 源码如下:

package com.example.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

/**

* Servlet Filter implementation class EncodingFilter

*/

public class EncodingFilter implements Filter {

/**

* Default constructor.

*/

public EncodingFilter() {

}

/**

* @see Filter#destroy()

*/

public void destroy() {

}

/**

* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;

if("GET".equals(req.getMethod())){

EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(req);

chain.doFilter(wrapper, response);

} else {//post

req.setCharacterEncoding("UTF-8");

chain.doFilter(request, response);

}

}

/**

* @see Filter#init(FilterConfig)

*/

public void init(FilterConfig fConfig) throws ServletException { }

}

EncodingHttpServletRequest .java源码如下:

package com.example.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

public class EncodingHttpServletRequest extends HttpServletRequestWrapper {

private HttpServletRequest request;

public EncodingHttpServletRequest(HttpServletRequest request) {

super(request);

this.request = request;

}

@Override

public String getParameter(String name) {

String value = request.getParameter(name);

if(value!=null){

try {

value = new String(value.getBytes("ISO8859-1"),"UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

return value;

}

}

注意:在运行android项目前必须先运行web服务

九、先运行web服务器,然后运行android项目,发送参数后,web后台就可以打印出相应的信息

十、注意事项以及相关知识点:

1、由于涉及访问网络,故需要添加网络访问权限

android:name="android.permission.INTERNET"/>

2、访问web服务时地址必须写网络的IP地址,否则会在本地服务上查找

3、熟悉怎么向web服务端发送请求以及方式(http协议)

GET方式:HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

conn.getResponseCode() == 200 来判断是否请求成功

POST方式:byte[] entity = data.toString().getBytes();//得到实体数据

HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("POST");

conn.setDoOutput(true);//设置为允许对外输出数据

conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

conn.setRequestProperty("Content-Length",

String.valueOf(entity.length));

OutputStream outStream = conn.getOutputStream();

outStream.write(entity);//写到缓存

if(conn.getResponseCode()==200){//只有取得服务器返回的http协议的任何一个属性时才能把请求发送出去

return true;

}

HttpClient方式:List pairs = new ArrayList();//存放请求参数

for(Map.Entry entry:params.entrySet()){

pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

}

//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,encoding);

HttpPost httpPost = new HttpPost(path);

httpPost.setEntity(entity);

DefaultHttpClient client = new DefaultHttpClient();

HttpResponse response = client.execute(httpPost);

if(response.getStatusLine().getStatusCode() == 200){

return true;

}

4、乱码产生的原因:

(1)、通过get方式提交请求参数时,没有对中文进行URL编码

(2)、 Tomcat服务器默认采用ISO8895-1编码得到的参数

如果乱码表示为--> -->,则说明是由于客户端传递参数没有编码的原因

如果乱码表示为???????,则说明是由于服务器端的默认编码不一致或者不支持中文的原因

5、熟悉拦截器的使用以及原理

安卓手机数据库连接代码

package com.fenghuo.firstproject; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.CursorAdapter; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class DataBaseActivity extends Activity { public static SQLiteDatabase db = null; private ListView listView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/9719021216.html,yout.activity_data_base); SQLiteOpenHelper helper = new SQLiteOpenHelper(this,"mydb",null,1) { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table users"); onCreate(db); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE 'users' ( '_id' INTEGER NOT NULL, 'username' TEXT NOT NULL, 'password' TEXT NOT NULL, 'email' TEXT NOT NULL, PRIMARY KEY ('_id') ) "); db.execSQL("insert into users values(1,'admin','admin','admin@https://www.doczj.com/doc/9719021216.html,')"); db.execSQL("insert into users values(2,'admin1','admin','admin1@https://www.doczj.com/doc/9719021216.html,')"); db.execSQL("insert into users values(3,'admin2','admin','admin2@https://www.doczj.com/doc/9719021216.html,')"); db.execSQL("insert into users values(4,'admin3','admin','admin3@https://www.doczj.com/doc/9719021216.html,')"); } };

Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解 17_创建数据库与完成数据添删改查--------------------------------------1.SQLite介绍:最大特点是,无数据类型; 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER n n 、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型 n n 只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不 n n 过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数n n 据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的 n n 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。n n n 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段 n n 保存除整数以外的数据时,将会产生错误。 另外, SQLite 在解析CREATE TABLE 语句时, n n 会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段 n n 的类型信息: CREATE TABLE person (personid integer primary key autoincrement, name varchar n n (20)) SQLite可以解析大部分标准SQL语句,如:查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order byn n n 排序子句如:select * from person n n n n select * from person order by id desc n n n n select name from person group by name having count(*)>1 ---------------------------------------------------------------------------2.a.分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录n n select * from Account limit 5 offset 3 或者 select * from Account limit 3,5 n b.select * from Account limit 3,5,指的是跳过前面的3条记录,然后获取5条记录n c.select * from Account limit 3,5是select * from Account limit 5 offset 3语句 n n 的简写版 -------------------------------------------------------------------------------n 3.常用操作: a.插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person nn n n (name, age) values(‘传智’,3) b.更新语句:update 表名 set 字段名=值where 条件子句。如:update person set name=n n n n'credream ‘where id=10 c.删除语句:delete from 表名 where 条件子句。如:delete from person nwhere id=10 -------------------------------------------------------------------------------2.虽然无数据类型,但是建议加上,这样可以增加可读性,支持标准sql,oracle中的不行 ---------------------------------------------------3.获取添加记录后的自增长的ID值:select last_insert_rowid(); -----------------------------------------------------------4.在android中开发数据库应用: n a.创建数据库:以前在javaee时候,需要手工数据,但是android应用,需要运行在用户的 n n 手机上,所以,android应用,要有自动创建数据库功能,当第一次使用软件的时候 n n 就创建数据库----------------------------------------5.关于数据库自动创建的详细介绍: 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很 n n 多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出 n n 应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据 n n 表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机 n n 上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方 n n 式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我 n n 们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版 n n 本进行管理来实现前面提出的需求。n -----------------------------------------6.SQLite数据库添加,删除,改查操作 n A.创建数据库:SQLiteOpenHelper .getWritableDatabase ()或getReadableDatabase() n n 可以创建数据库7.创建完成以后可以使用SQLITE Expert软件打开生成的数据库n 可以看到除了生成的自己的需要的表之外,还生成了一张:android_metadata表: n 如果在sqlite中使用数据库一定会有一张android_metadata表,用来登记用户的 n 使用语言:zh_cn -----------------------------------------------------n b.数据库自动创建的过程及方法详细介绍: n n我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在 n n 很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建 n n 出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数n n 据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手 n n 机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工 n n 方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为n n 我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库n n 版本进行管理来实现前面提出的需求。n -------------------------------------------8.详细介绍: 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是 n n onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, intn n n newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结n n 构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获n n 取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生 n n 成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用 n n ,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。 n n onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号, n n 而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数n n 据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为n n 了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如 n n 果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本 n n 升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后 n n 作出相应的表结构及数据更新。 getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的 n n SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库n n 的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就 n n 会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了 n n ,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。 ------------------------------------------------------------------------9.创建数据库的代码: n a.创建项目:DBSQLIte n b./DBSQLIte/src/com/credream/service/DBOpenHelter.java n n package com.credream.service; n n import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; n n public class DBOpenHelter extends SQLiteOpenHelper { //父类没有默认构造器,需要显示调用 public DBOpenHelter(Context context) { super (context, "credream.db", null, 1); //数据库创建完成后,默认会保存在<包>/database/文件夹下 //当修改版本号时候,会触发:onUpgrade方法 //第二个:指定数据库名称, //第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的 n n 游标工厂//版本号,大于0 n } /** n* 这个方法是在数据库第一次被创建的时候调用的 n*/ @Override public void onCreate(SQLiteDatabase db) { //SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例 db.execSQL("CREATE TABLE person (personid integer primary keyn n n autoincrement, name varchar(20))"); //这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写n n 了varchar(20),也可以写入超过20的内容 n n } /** n* 当数据库的版本号变更的时候被调用 n*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table person add phone varchar(12) null"); n n } n n } --------------------------------------------------------2.在清单文件中写入测试环境 n n n n n n n n n n ---------------------------------------------------- 3./DBSQLIte/src/com/credream/test/PersonServiceTest.java package com.credream.test; n n import com.credream.service.DBOpenHelter; n n import android.test.AndroidTestCase; n n public class PersonServiceTest extends AndroidTestCase { //创建数据库,在<包>/database/ public void testCreateDB(){ DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); n } n n } -------------------------------------------------------4.选择方法开始测试,然后,在data/data/<包>/database/下 n 查看并用sqlite打开生成的数据库检查是否正确---------------------------------------------然后将版本号,改成2,然后再次执行,看到,表已经被更新,增加了一列phone -----------------------------------------------5.了解sqlite工作的原理: n DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); n 打开getWritableDatabase();代码:

Android创建和使用数据库详细指南

Android创建和使用数据库详细指南(1) 摘要:每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite 来存储配置数据的,iPhone也是使用SQLite来存储数据的。 在Android中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data//databases文件夹中,在这篇文章中,你将会学习到如何在Android中创建和使用数据库。 1SQLite数据库 使用Eclipse创建一个Android项目,取名为Database,如图1所示: 图1 数据库-使用Eclipse创建你的Android新项目

2创建DBAdapter辅助类 接下来创建一个数据库,取名为bookstitles,字段如图2所示。 图2 数据库字段在DBAdapter.java文件中,定义清单1中的常量。 清单1 定义DBAdapter.java文件中的常量 package net.learn2develop.Database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;

Android移动应用开发实验指导书

《Android移动应用开发》 实验指导书 课程代码: 总课时数: 适用专业: 院(系)名称:

实验一深入理解Activity 目标 (1)掌握Activity的开发、配置和使用。 (2)掌握Intent的几种常用的属性。 (3)Android系统内置Intent的使用。 (4)了解Activity的生命周期 实验软、硬件环境 硬件:PC电脑一台; 配置:winxp或win7系统,内存大于4G,硬盘250G及以上 JDK1.7 、Eclipse、ADT、Android SDK 实验主要技术基础 (1)活动是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互。 (2)Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。 任务 1、请在AndroidManifest.xml文件中配置SecondActivity: 配置Intent的Action属性为com.sise.intent.action.JHY_ACTION; 配置Category属性为com.sise.intent.category.JHY_CATEGORY。 通过隐式Intent的使用从FirstActivity启动SecondActivity,编写代码,运行程序,预期效果如下所示。

图1 程序运行初始化界面图2 点击图1中的按钮后的运行结果 2、请使用显式Intent启动SecondActivity,并使用Intent从FirstActiv传递数据到SecondActivity。编写代码,运行程序,预期效果如下所示。 图1 程序运行初始化界面图2 点击图1中的按钮后的运行结果 3、使用Intent传递数据从SecondActivity返回数据到FirstActivity中去。编写代码,运行程序,预期效果如下所示。 图1 程序运行初始化界面图2 点击图1按钮运行结果 图3 点击图2按钮运行结果 实验方法与步骤 (1)创建活动 Activity是Android系统提供的一个活动基类所有的活动都必须直接或间接继承此类才能拥有活动的特性。 (2)布局文件 创建布局文件 加载布局文件 (3)在清单文件中注册活动 (4)以上方法完成多个活动的创建 (5)使用Intent完成多个活动之间的交互和数据传递

Android实验报告—数据库接口

数据库接口实验 实验目的: 本实验的目的是使学生深入了解Android数据存储和访问的方法,利用SQLite进行数据存储及访问。通过实验,掌握DatePicker和TimePicker的使用方法。 实验要求: 设计程序实现一个日期信息记录数据库软件,如下图所示 设计界面,如图所示,利用SQLite实现数据库的建立、数据表中的信息的删改、查等操作。使用DatePicker和TimePicker来动态选择日期和时间,将设置的日期和时间信息写入到数据库中。 程序源码(可付纸)(包括XML和Java文件): mcy.java package cn.mcy; import java.util.Calendar; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View;

import android.view.View.OnClickListener; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; public class mcy extends Activity { /** Called when the activity is first created. */ private EditText edtEntry,edtIDEntry; private Button btnAdd,btnShowAll,btnClearShow,btnDeleteAll,btnIDDelete,btnIDSeach,btnIDRefr esh; private TextView tvSShow; private int mYear,mMonth,mDay,mHour,mMinute; private TimePicker tp; private DatePicker dp; private static final String DB_FILE="students.db",DB_TABLE="students"; private SQLiteDatabase mStuDbRW; @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mStuDbRW.close(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/9719021216.html,yout.main); mcy11 friDbHp=new mcy11(getApplicationContext(),DB_FILE,null,1); friDbHp.sCreateTableCommand="CREATE TABLE "+DB_TABLE+"("+"_id INTEGER PRIMARY KEY,"+"id TEXT NOT NULL,"+"date TEXT,"+"time TEXT);"; mStuDbRW=friDbHp.getWritableDatabase(); //生成一个数据库mStuDbRW tvSShow=(TextView) findViewById(https://www.doczj.com/doc/9719021216.html,SShow); edtEntry=(EditText) findViewById(R.id.edtEntry); edtIDEntry=(EditText) findViewById(R.id.edtIDEntry); btnAdd=(Button) findViewById(R.id.btnAdd); btnShowAll=(Button) findViewById(R.id.btnShowAll); btnClearShow=(Button) findViewById(R.id.btnClearShow); btnDeleteAll=(Button) findViewById(R.id.btnDeleteAll); btnIDDelete=(Button) findViewById(R.id.btnIDDelete); btnIDSeach=(Button) findViewById(R.id.btnIDSeach); btnIDRefresh=(Button) findViewById(R.id.btnIDRefresh); tp=(TimePicker) findViewById(R.id.TimePicker01);

Android客户端与服务器数据交互流程

Android客户端与服务器数据交互流程 一个门户网站的制作的流程:首先,由网页设计师只做网页设计,即画出来网站在浏览器中显示的样子,然后由前端人员编写 Html+CSS+JS来实现网站的动态效果,比如说导航栏的下拉显示,然后Ajax的局部信息更新等,然后通过后台程序如JSP,PHP, .NET等语言将数据库中的信息与前台页面相结合,这样,一个站就这样被建好了。而Android客户端,也是有UI设计师,UI前端,程序构成的,同样程序这边的话,最近Html5+CSS3的火热开启,很多公司也需要html5+css3进行Android程序的开发了。呜呜,抢我的饭碗。虽然说哥也是懂html+css的。嘿嘿,这样解释的话,可能大家不清楚,其实木有必要弄清楚网站的建站过程,这里只是给大家普及一下知识,没必要弄清楚。 基础知识:我们需要知道,Http协议是基于TCP协议的,而TCP协议是一种有连接,可靠的传输协议,如果丢失的话,会重传。所以这样的话,就不会有数据的丢失了。而Http协议有三种方法,Get,Post,Head 方法,但是用的多的只有Get和Post方法,Get方法是将请求参数放在请求头中,所以请求的参数在URL中可见,而Post方法是将请求参数放在数据部分,所以在URL中不可见,Post相对来说保密,所以在提交重要信息的时候,用的都是HttpPost方法来实现的. 而在B/S模式中,B代表浏览器,S代表服务器,在浏览器和服务器的通信之中,因为B/S之间不会一直保持连接,所以才会加入Cookie 机制,来辨认所操作的对象。用户浏览网页的操作如下:当用户点击

一个连接或者一个按钮的时候,浏览器通过发送一个请求给服务器,然后由服务器接收该请求,然后解析到用户请求的是哪些内容,然后查找到相关资源,再将数据返回给浏览器,由浏览器解析数据,然后显示给用户看到用户所需要看到的页面。所以,Android和B/S模式差不多,其实也就是发送请求,接收数据,然后解析数据,显示到手机上的过程,没什么太大的区别,谁让咱用的是互联网,用的是TCP/IP 协议呢,是吧。要理解是:所有的操作都是向服务器请求数据的过程。 hp文件,然后浏览器会将php文件解析成为html然后显示在浏览器上显示。

安卓开发课程设计报告

下载可编辑 .专业.整理. 武汉理工大学华夏学院 课程报告课程名称:智能手机软件开发 题目:基于Android的手机 通讯录的设计与实现 专业信息工程系

班级 学号 姓名 成绩 指导教师 2015年3月23日至2015年6月12日 智能手机软件开发大作业 根据所学的Android 手机开发的知识,采用Eclipse、JAVA开发一个基于Android平台的手机通讯录软件,具体要求如下: 1.要发该软件能够在Android4.0 以上的平台上运行。 2.要求软件界面美观,操作方便,符合日常使用规范。 3.能够通过该手机通讯录来添加新的联系人,用来存放联系人的姓名、单位、电话、QQ、地址等信息。 4.能够通过该手机通讯录来编辑联系人信息,来修改联系人的个人信息。 5.能够通过该手机通讯录来调用系统的通信接口,直接给用户发短信,打电

下载可编辑 话。 6.在手机通讯录中,添加合适的菜单,来操作手机通讯录。 7.将开发的过程写成报告,要求内容完整,格式规范,条理清晰。 1 设计目的 随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展移动终端的应用软件和需要的服务将会有很大的发展空间。根据这个特点,设计一个基于Android平台的通讯录系统,能根据手机的特点,存储,管理,修改 .专业.整理.

联系人信息,并且能够根据选定的联系人,对其拨打电话,发送短信等。 手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,通讯录从无到有,从英文到中文,经过了十几年的发展历程,今后的发展趋势就是从通讯录发展为名片夹,也就是在一个人名下,可以存储座机、手机、单位、地址、电子邮件等内容。所以手机通讯录功能越来越齐全,满足了人们的需求。 2 开发环境 由于该android通讯录是一个基于Java语言开发软件,所以选择了Eclipse3.4作为开发平台,作为插件,它能够安装Android SDK,从而可以安装使用Android虚拟机,使得程序得以开发,亦更为方便。 本通讯录系统就是在Eclipse3.4+Android平台环境下编写设计而成的。 3 需求分析 该系统针对的主要用户是Android手机用户。Android手机通信管理系统包括以下主要内容: (1) 用户通过联系人功能可以保存联系人的详细信息,可以对联系人进行编辑、删除、拨打电话、发送短信可以根据索引条件搜索联系人。 (2) 用户通过短信记录功能可以发送短信,删除短信记录。 (3) 用户通过SD卡所储存信息向通讯录批量导入联系人信息。 (4) 用户通过个人中心可以设置自己的详细信息,这样方便其他人了解自己,也可以将具有相同名字的联系人合并。

(完整版)Android大数据的存储和大数据的访问

南昌航空大学实验报告 二0一4 年11 月14 日 课程名称:Android 实验名称:Android数据存储和数据访问 班级:姓名:同组人: 指导教师评定:签名: 一:实验目的 掌握SharedPreferences的使用方法; 掌握各种文件存储的区别与适用情况; 了解SQLite数据库的特点和体系结构; 掌握SQLite数据库的建立和操作方法; 理解ContentProvider的用途和原理; 掌握ContentProvider的创建与使用方法 二:实验工具 Eclipse(MyEclipse)+ ADT + Android2.2 SDK; 三:实验题目 1.应用程序一般允许用户自己定义配置信息,如界面背景颜色、字体大小和字体颜色等,尝试使用SharedPreferences保存用户的自定义配置信息,并在程序启动时自动加载这些自定义的配置信息。 2.尝试把第1题的用户自己定义配置信息,以INI文件的形式保存在内部存储器上。 3.使用代码建库的方式,创建名为test.db的数据库,并建立staff数据表,表内的属性值如下表所示:

4.建立一个ContentProvider,用来共享第3题所建立的数据库; 四:实验代码 InternalFileDemo public class InternalFileDemo extends Activity { private final String FILE_NAME = "fileDemo.txt"; private TextView labelView; private TextView displayView; private CheckBox appendBox ; private EditText entryText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/9719021216.html,yout.main); labelView = (TextView)findViewById(https://www.doczj.com/doc/9719021216.html,bel); displayView = (TextView)findViewById(R.id.display); appendBox = (CheckBox)findViewById(R.id.append); entryText = (EditText)findViewById(R.id.entry); Button writeButton = (Button)findViewById(R.id.write); Button readButton = (Button)findViewById(R.id.read); writeButton.setOnClickListener(writeButtonListener); readButton.setOnClickListener(readButtonListener); entryText.selectAll(); entryText.findFocus(); } OnClickListener writeButtonListener = new OnClickListener() {

JAVAWEB数据库访问技术

JavaWeb数据库访问技术 JDBC是一种用于执行SQL语句的Java API。它由一组用Java编写的类和接口组成。 简单地说,JDBC可做三件事: ·与数据库建立连接 ·发送SQL语句 ·处理结果 一、JDBC的总体结构 在Java Application之下的是JDBC API,它提供了一系列的类代Java Application、JSP、Servlet等使用。 ·java.sql.DriverManager:用来加载不同的JDBC驱动程序并且为创建新的数据库连接提供支持。 ·java.sql.Connection:完成对某一指定数据库的连接功能。 ·java.sql.Statement:在一个已经创建的连接(java.sql.Connection)中作为执行SQL语句的容器;它包含了两个重要的子类。 1)java.sql.PreparedStatement:用于执行预编译的SQL语句。 2)java.sql.CallableStatement:用于执行数据库中已经创建好的存储过程。 ·java.sql.Result:代表特定SQL语句执行后的数据库结果集。

二、JDBC应用开发模式 在传统的客户端/服务器模式中,通常是在服务器商配置数据库,而在客户端安装内容丰富的GUI界面。在些模式中,JDBC驱动程序应该部署在客户端。 而在三层应用模式中,客户端不直接调用数据库,而是调用服务器上的中间件层,最后由中间件层完成数据库查询操作。 三层结构之优点:它将可视化表示(位于客户端)从业务逻辑(位于中间层)和原始数据(位于数据库)中分离出来。因此,我们可以从不同的客户端来访问相同的数据和相同的业务规则。

基于android的手机日程管理系统数据库设计说明书

基于Android的手机日程管理系统的设计与 实现 数据库设计说明书 学生姓名:王炜 学号: 0911******* 指导教师:刘雪梅 课题类型: AXP 专业:软件工程 学部:信息学部 审核组长: 北京城市学院 2013 年 2月 19日

日期版本说明作者2013/2/19 1 未评审的初稿王炜2013/3/6 2 内容删改王炜

目录 1、引言 (1) 1.1编写目的 (1) 1.2背景 (1) 1.3参考资料 (1) 2、外部设计 (2) 2.1标识符和状态 (2) 2.2使用它的程序 (2) 2.3约定 (2) 2.4专门指导 (4) 2.5支持软件 (4) 3、结构设计 (4) 3.1概念结构设计 (4) 3.2逻辑结构设计 (6) 3.3物理结构设计 (6) 4、运用设计 (7) 4.1数据字典设计 (7) 4.1.1数据流和数据文件 (8) 4.1.2数据项 (8) 4.2安全保密设计 (9)

1、引言 1.1编写目的 数据库设计说明书是根据概要设计说明书的要求所编写的,是为详细设计作依据的,为详细设计提供标准,并提供给毕业设计审核组。 1.2背景 待开发的数据库的名称:TODO_DB 使用此数据库的软件系统的名称:SQL 该软件系统开发项目的任务提出者:毕业设计审核组 该软件系统的用户:android手机用户 1.3参考资料 [1]《数据库系统概念(原书第5版)》作者:Database Systems Concepts ,Fifth Edition 出版社:机械工业出版社2009年 [2]《数据库系统原理教程》作者:王珊等清华大学出版社2008年 [3]赵亮;张维;;基于Android技术的界面设计与研究[J];电脑知识与技术;2009年29期. [4]方明;田野;户银龙;;基于Android平台的嵌入式软件项目组织方法[J];电脑知识与技术;2011年34期. [5]陈璟;陈平华;李文亮;;Android内核分析[J];现代计算机(专业版);2009年11期. [6]姚昱旻;刘卫国;;Android的架构与应用开发研究[J];计算机系统应用;2008年11期. [7]方明;田野;户银龙;;基于Android平台的嵌入式软件项目组织方法[J];电脑知识与技术;2011年34期. [8]叶炳发;Android操作系统移植及关键技术研究[D];暨南大学;2010年. [9]岳传真;Android系统移植和应用程序开发[D];复旦大学;2010年. [10]刘敏;移动终端的Android移植与应用程序设计[D];西安电子科技大学;2011年. [11]胡思捷;基于Android平台的触摸屏系统设计及实现[D];南开大学;2011年. [12]施金兰;基于Android平台的网络共享研究与实现[D];华东师范大学;2011年. [13]李凯;Android操作系统分析与移植[D];华南理工大学;2011年. [14]刘瑞顺;基于Android平台的智能手机输入法研究与设计[D];汕头大学;2011年.

Android-Room数据库的使用方法教程

Android-Room数据库的使用方法教程 Room是一个持久性数据库,提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。这篇文章主要介绍了详细介绍Android-Room数据库的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。 为什么会选择Room? 前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的“正不正统”的原因了。 因为Room有下面几个优点: ①SQL查询在编译时就会验证- 在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表)

②较少的模板代码 ③与LiveData 集成 该如何使用它? 1、在app/build.gradle中添加以下依赖 implementation 'android.arch.persistence.room:runtime:1.0.0' annotationProcessor 'android.arch.persistence.room:compiler:1.0.0' 你可以点击这里查看最新依赖版本号 2、创建JavaBean @Entity public class User {

@PrimaryKey(autoGenerate = true)//主键是否自动增长,默认为false private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; }

相关主题
文本预览
相关文档 最新文档