当前位置:文档之家› c10分钟理解Android数据库的创建与使用(附详解和示例代码)

c10分钟理解Android数据库的创建与使用(附详解和示例代码)

c10分钟理解Android数据库的创建与使用(附详解和示例代码)
c10分钟理解Android数据库的创建与使用(附详解和示例代码)

c10分钟理解Android数据库的创建与使用(附详解和示例代码)

1.Android数据库简介.

Android系统的framework层集成了Sqlite3数据库,我们知道Sqlite3是一种轻量级的高效存储的数据库。

Sqlite数据库具有以下优点:

(1)零配置,无需安装和配置;

(2)储存在单一磁盘文件中的一个完整的数据库;

(3)数据库文件可以在不同字节顺序的机器间自由共享;

(4)支持数据大小至2TB;

(5)足够小,全部源代码大致3万行C代码,250KB;

(6)比目前流行的大多数数据库的操作要快;

(7)开源。

2.Sqlite 基本操作语句和重要概念

(1)创建数据库

创建数据库实际上并非通过SQL语句来创建,创建数据库可以通过sqlite3 新数据库名来创建,比如创建一个名为school.db的数据库,在命令行下输入“sqlite3 school.db;”即可。

(2)创建表

创建表的SQL语法为:

create table 表名(字段1 数据约束类型,…,字段n 数据约束类型);

注意:每一条SQL语句都以分号结尾

Sqlite数据库支持的数据库类型大致分为5种,分别是:

NUll 数据值为空

INTEGER 整型

REAL 浮点型数据

TEXT 字符类型,使用数据库编码(UTF-8等)存放

BLOB 只是一个数据块,完全按照输入存放

注意:SQLite3数据库中任何列,除了整形主键列,可以用于存储任何一个存储列的值,SQLite 没有单独的布尔存储类型,你可以使用INTEGER的0和1表示true和false,另外,SQLite 也没有代表时间和日期的数据类型,可以转化为TEXT或者INTEGER来存储

常用的数据库约束包括以下几种:

PRIMARY KEY 主键它是非空且唯一的

NOT NULL 非空

UNIQUE 唯一

FOREIGN KEY 外键

CHECK 条件检查

DEFAULT 字段的默认值

下面举例说明创建一个班级表,表中有3个字段,分别是自增的主键id、专业、年份。创建表的SQL语句如下图所示

注意:插入的这些数据在表中一定要有对应的字段,不然就会报错!

insert语句支持批量插入数据,比如我要把students表中的数据都导入表stu中,SQL语句为

insert into stu select * from students;

(4)查询语句

Select语句的通用格式如下:

这段语句简单解释一下,columns是要查询的字段,tables表示从哪张表里面查询,where 是查询过滤的条件,group by是指按照某个字段分组查询,order by是排序,limit是限制数量语句,下面我会一一解释每个语句需要注意的地方。

1.字段与表的别名

多表查询时查询条件相对复杂,表之间可能会产生相同的字段,这个时候字段前面可以加上

表名以区分,别名就是我们可以将classes的表名设置为cls,将classes表中的major字段显示为cmj字段以简化SQL语句。

2.where条件过滤

where语句中常用的逻辑操作符有and、or、not,分别代表与、或、非。

注意where中有一个较为重要的关系操作符叫做like。它是模糊匹配。例如要找到students 表中以t开头的所有学生,那么对应的SQL为:

select * from students where name like “t%”;

3.Group by 分组

聚合中有一个重要的功能就是分组。分组就是将得到的结果集按照一定的规则划分为多个组。

由于该功能不常使用,想要了解的朋友自行查阅资料。

4.排序

select结果集的排序使用的是order by字句,排序有升序和降序两种,分别对应asc和desc,order by后面紧跟一个或者多个字段,多个字段间用逗号隔开。

5.数量限定

数量限定需要使用limit语句,数量限定的标准格式如下:

limit 返回的数量offset 偏移量

例如我们希望从students中索引为3的记录开始索引并且只返回一条语句,SQL如下:

select * from students limit 1 offset 2;

6.distinct去重

distinct用于去除select语句中重复的行,它紧跟在select之后。

(5)update 语句

update 语句用于更新表中的数据,它的格式为:

update table set update_list where predicate;

update_list是要修改的字段以及值,其实就是一个字段赋值语句,形式为:字段名= 字段值,每个字段赋值语句通过逗号分隔开。后续我会在具体的示例代码中举例,在这就不过多阐述。

(6)delete语句

delete语句的格式如下:

//当满足where的条件时,删除表table中的数据,table是表名

delete from table where predicate;

(7)修改表

我们知道,随着项目的演化,最初建立的表可能会面临修改的情况。修改表的SQL语句命令为alter。SQLite中的alter命令并没有实现标准SQL中的所有功能,**它只有修改表名和添加字段两个功能**,**删除字段等功能只能通过重新创建表来实现**。

alter的语法格式为:

alter table tableName {rename to newName | add column 新的字段};

上述的语法表示alter table之后要操作先跟表名,然后rename to newName 和add column 新的字段两者2选1。rename to 是重命名,add column是添加新的字段。

(8)drop 命令

drop命令用于删除物理存储介质。例如删除表、视图、索引、触发器等。drop的语法格式为:

drop {table | view |index |trigger} name;

(9)数据库事务的介绍

事务是一个数据库操作的执行单元。它定义了一条或多条SQL语句,这些语句要么被全部执行,要么全部不执行,它保证了SQL语句的原子性。事务有begin、commit、rollback3个命令,begin表示开始一个事务,commit表示整个事务操作成功,rollback表示回滚到begin 之前。格式为:

begin;

//SQL语句

[commit | rollback];

注意:事务提供了一种保证多条SQL语句能够被执行或者不执行,很大程度上保证了数据库操作的安全性。而在Android中使用事务,也会提升SQL的执行效率。

事务的运用简单举个例子,张三给李四转账400元,银行的数据库中张三的存款金额要减400,李四的存款金额要加400,我们要保证张三扣钱的通过李四收到钱,这个时候就需要用到数据库事务,要么两条SQL语句同时成功,要么同时失败。

(10)Android中封装的数据库帮助接口

我们知道Android的SQLite数据库是由C和C++实现,因此Android在FrameWork层封装了一层Java接口,使得开发人员能够更方便的操作数据库。主要的类型为SQLiteOpenHelper、SQLiteDatabase以及Cusor,不管如何封装,本质上都是通过构建SQL 语句并且提交到SQLite中执行。下面详细介绍,Android中创建数据库创建表的所有方法。

3.使用Android的接口创建和操作数据库

一般来说,在Android中创建数据库只需要以下几步:

(1)创建一个Java类继承SQLiteOpenHelper

(2)实现SQLiteOpenHelper的onCreate和onUpdate方法以及构造方法。

(3)通过构造方法创建数据库,需要传入数据库的名称,Context和数据库的版本号。(4)在onCreate中完成创建表和字段的操作,onUpdate中完成升级操作

(5)通过帮助类的openOrCreateDatabase()方法或者getReadableDatabase()或者getWriteableDatabase()获取到数据库完成数据的操作。

下面附上我的写的一个示例代码,其中封装了判断数据库是否存在某个表,是否存在某个字段的方法

数据库的帮助类,完成了创建数据库,创建表

package com.geocompass.gisdatacollection.database;

import android.content.Context;

import android.database.Cursor;

import android.database.DatabaseErrorHandler;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.os.Environment;

import com.geocompass.gisdatacollection.CollectionApplication;

import java.io.File;

/**

* Created by liuxu on 2017/4/7.

* 数据库的操作的帮助类

*/

public class ComplexDatabaseSqlHelper extends SQLiteOpenHelper {

private static final String TAG = "ComplexDatabaseSqlHelper";

//数据库的版本号

private static final int DB_VERSION = 1;

public SQLiteDatabase getDb() {

return db;

}

private SQLiteDatabase db;

//数据库db文件的路径,由调用者传入

private static String mDBPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "giscoll.db";

private static ComplexDatabaseSqlHelper mDBSqlHelper;

public ComplexDatabaseSqlHelper(Context context, String DBpath) {

super(context, DBpath, null, DB_VERSION);

mDBPath = DBpath;

if (db == null) {

db = SQLiteDatabase.openOrCreateDatabase(DBpath, null);

}

onCreate(db);

}

public ComplexDatabaseSqlHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {

super(context, name, factory, version);

}

public ComplexDatabaseSqlHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler);

}

@Override

public void onCreate(SQLiteDatabase db) {

String CREATE_POINT = "create table tab_point ("

+ "id integer primary key autoincrement,"

+ "lon double, "

+ "lat double, "

+ "type integer) ";

String CREATE_INTERSECTION = "create table tab_intersection ("

+ "inter_id integer primary key autoincrement,"

+ "interLon double, "

+ "interLat double, "

+ "interRouteID text) ";

String CREATE_ROUTE = "create table tab_route ("

+ "route_name text,"

+ "startPointID integer, "

+ "endPointID integer, "

+ "geometryID text, "

+ "Geometry text) ";

;

//如果不存在该表,则创建该表

if (!tableIsExist("tab_point")) {

db.execSQL(CREATE_POINT);

}

if (!tableIsExist("tab_intersection")) {

db.execSQL(CREATE_INTERSECTION);

}

if (!tableIsExist("tab_route")) {

db.execSQL(CREATE_ROUTE);

}

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldV ersion, int newVersion) {

}

/**

* 获取数据库的帮助类

*

* @return

*/

public static ComplexDatabaseSqlHelper getDBSqlHelper() {

if (mDBSqlHelper == https://www.doczj.com/doc/cf5892238.html,ull) {

synchronized (ComplexDatabaseSqlHelper.class) {

if (mDBSqlHelper == null) {

mDBSqlHelper = new ComplexDatabaseSqlHelper(CollectionApplication.getmContext(), mDBPath);

}

}

}

return mDBSqlHelper;

}

/**

* 根据sql查询数据库的方法

*

* @param sql

* @return

*/

public Cursor query(String sql) {

return db.rawQuery(sql, null);

}

/**

* 执行Sql语句

*

* @param sql

*/

public void execSQL(String sql) {

db.execSQL(sql);

}

/**

* 判断表格是否存在

*

* @param tableName

* @return

*/

public boolean tableIsExist(String tableName) {

boolean result = false;

if (tableName == null) {

return false;

}

Cursor cursor = null;

try {

//db = SQLiteDatabase.openDatabase(this.mDBPath,null,SQLiteDatabase.OPEN_READONL Y);

String sql = "select count(*) as c from Sqlite_master where type ='table' and name ='" + tableName.trim() + "' ";

cursor = db.rawQuery(sql, null);

if (cursor.moveToNext()) {

int count = cursor.getInt(0);

if (count > 0) {

result = true;

}

}

cursor.close();

} catch (Exception e) {

// TODO: handle exception

result = false;

}

return result;

}

/**

* 判断表中是否包含某个字段

*

* @param tableName

* @param columnName

* @return

*/

public boolean columnIsExistsInTable(String tableName, String columnName) { boolean result = false;

Cursor cursor = null;

try {

// db = SQLiteDatabase.openDatabase(this.mDBPath, null, SQLiteDatabase.OPEN_READONL Y);

cursor = db.rawQuery("select * from sqlite_master where name = ? and sql like ?"

, new String[]{tableName, "%" + columnName + "%"});

result = null != https://www.doczj.com/doc/cf5892238.html,or && cursor.moveToFirst();

} catch (Exception ignored) {

} finally {

if (null != cursor && !cursor.isClosed()) {

cursor.close();

}

}

return result;

}

private void open() {

if (db != null && !db.isOpen())

db = SQLiteDatabase.openOrCreateDatabase(mDBPath, null);

}

}

数据库的操作类,完成了对数据库表中数据的插入和查询

package com.geocompass.gisdatacollection.database.manage;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import com.geocompass.gisdatacollection.model.Intersection;

import com.geocompass.gisdatacollection.model.Point;

import com.geocompass.gisdatacollection.model.Route;

import java.util.ArrayList;

import java.util.List;

/**

* Created by liuxu on 2017/4/10.

* 封装了对数据库表的增删改查方法

*/

public class ComplexDBDao {

private SQLiteDatabase db;

public ComplexDBDao(SQLiteDatabase db) {

this.db = db;

}

/**

* 插入一个点到tab_point表

* @param point

* @return

*/

public boolean insert(Point point){

String INSERT_POINT = "INSERT INTO tab_point(lon,lat,type) V ALUES (" + point.lon + "," + https://www.doczj.com/doc/cf5892238.html,t + "," + point.point_type + ")";

try{

db.execSQL(INSERT_POINT);

}catch(SQLException e){

e.printStackTrace();

return false;

}

return true;

}

/**

* 插入一个节点到tab_intersection表中

* @param intersection

* @return

*/

public boolean insert(Intersection intersection){

String INSERT_INTERSECTION = "insert into tab_intersection(interLon,interLat,interRouteID) values ("+intersection.interLon+","+intersection.interLat+",'"+

intersection.inter_route_id+"')";

try{

db.execSQL(INSERT_INTERSECTION);

}catch(SQLException e){

e.printStackTrace();

return false;

}

return true;

}

/**

* 插入一条Route到tab_route表中

* @param route

* @return

*/

public boolean insert(Route route){

String INSERT_ROUTE = "insert into tab_route (route_name,startPointID,endPointID,geometryID,Geometry) values('"+route.route_name+

"',"+route.startPointID+","+route.endPointID+",'"+route.geometryID+"','"+route.Geometry+"')";

try{

db.execSQL(INSERT_ROUTE);

}catch(SQLException e){

e.printStackTrace();

return false;

}

return true;

}

/**

* 查询出数据库中所有的Points

* @return

*/

public List findAllTabPoint(){

String sql_select = "select * from tab_point order by id";

//请补充sql执行语句

Cursor cursor = db.rawQuery(sql_select,null);

int IDIndex = cursor.getColumnIndex("id");

int lonIndex = cursor.getColumnIndex("lon");

int latIndex = cursor.getColumnIndex("lat");

int typeIndex = cursor.getColumnIndex("type");

List list = new ArrayList<>();

while (cursor.moveToNext()) {

Point point = new Point();

point.id = cursor.getInt(IDIndex);

point.lon = cursor.getDouble(lonIndex);

https://www.doczj.com/doc/cf5892238.html,t = cursor.getDouble(latIndex);

point.point_type = cursor.getInt(typeIndex);

list.add(point);

}

return list;

}

/**

* 查询出数据库中所有的Intersection

* @return

*/

public List findAllTabIntersection(){

String sql_select = "select * from tab_intersection order by inter_id";

//请补充sql执行语句

Cursor cursor = db.rawQuery(sql_select,null);

int interIdIndex = cursor.getColumnIndex("inter_id");

int interLonIndex = cursor.getColumnIndex("interLon");

int interLatIndex = cursor.getColumnIndex("interLat");

int interRouteIDIndex = cursor.getColumnIndex("interRouteID");

List list = new ArrayList<>();

while (cursor.moveToNext()) {

Intersection intersection = new Intersection();

intersection.inter_id = cursor.getInt(interIdIndex);

intersection.interLon = cursor.getDouble(interLonIndex);

intersection.interLat = cursor.getDouble(interLatIndex);

intersection.inter_route_id = cursor.getString(interRouteIDIndex);

list.add(intersection);

}

return list;

}

/**

* 查询出数据库中所有的Route

* @return

*/

public List findAllTabRoute(){

String sql_select = "select * from tab_route ";

//请补充sql执行语句

Cursor cursor = db.rawQuery(sql_select,null);

int routeNameIndex = cursor.getColumnIndex("route_name");

int startPointIDIndex = cursor.getColumnIndex("startPointID");

int endPointIDIndex = cursor.getColumnIndex("endPointID");

int geometryIDIndex = cursor.getColumnIndex("geometryID");

int geometryIndex = cursor.getColumnIndex("Geometry");

List list = new ArrayList<>();

while (cursor. https://www.doczj.com/doc/cf5892238.html,moveToNext()) {

Route route = new Route();

route.route_name = cursor.getString(routeNameIndex);

route.startPointID = cursor.getInt(startPointIDIndex);

route.endPointID = cursor.getInt(endPointIDIndex);

route.geometryID = cursor.getString(geometryIDIndex);

route.Geometry = cursor.getString(geometryIndex);

list.add(route);

}

return list;

}

}

这些知识都是数据库的基础知识,当然复杂的知识也是在基础知识的基础上拼接起来的,先学好了基础才能谈复杂项目中多个表多个字段数据库的运用!我很喜欢的一句话,不积跬步无以至千里,一直陪伴着我的学习和工作!

安卓手机数据库连接代码

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/cf5892238.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/cf5892238.html,')"); db.execSQL("insert into users values(2,'admin1','admin','admin1@https://www.doczj.com/doc/cf5892238.html,')"); db.execSQL("insert into users values(3,'admin2','admin','admin2@https://www.doczj.com/doc/cf5892238.html,')"); db.execSQL("insert into users values(4,'admin3','admin','admin3@https://www.doczj.com/doc/cf5892238.html,')"); } };

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学习笔记---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移动应用开发》 实验指导书 课程代码: 总课时数: 适用专业: 院(系)名称:

实验一深入理解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/cf5892238.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/cf5892238.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-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; }

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 中数据库查询方法 query

Android 中数据库查询方法query() 中的select Android 中涉及数据库查询的地方一般都会有一个query() 方法,而这些query 中有大都(全部?)会有一个参数selectionArgs,比如下面这个 android.database.sqlite.SQLiteDatabase.query(): view plaincopy to clipboardprint? public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) selection 参数很好理解,就是SQL 语句中WHERE 后面的部分,即过滤条件,比如可以为id=3 AND name='Kevin Yuan' 表示只返回满足id 为 3 且name 为"Kevin Yuan" 的记录。 再实际项目中像上面那样简单的“静态”的selection 并不多见,更多的情况下要在运行时动态生成这个字符串,比如 view plaincopy to clipboardprint? public doQuery(long id, final String name) { mDb.query("some_table", // table name null, // columns "id=" + id + " AND name='" + name + "'", // selection //...... 更多参数省略 ); } public doQuery(long id, final String name) { mDb.query("some_table", // table name null, // columns "id=" + id + " AND name='" + name + "'", // selection //...... 更多参数省略 ); }

安卓开发课程设计报告

下载可编辑 .专业.整理. 武汉理工大学华夏学院 课程报告课程名称:智能手机软件开发 题目:基于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/cf5892238.html,yout.main); labelView = (TextView)findViewById(https://www.doczj.com/doc/cf5892238.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() {

Android面试之SQLite数据库

Android面试之SQLite数据库 鹭岛厦门是个很美丽的海滨城市,给我的感觉很舒适和悠闲,据说政府对到那工作的高新技术人才第一年有10万元的奖励,因为这个原因我很有兴趣的参加了一个厦门公司的面试。他们主要是研发VOIP方面的技术,对手机应用的性能优化和音频算法有较高的要求。 他们招人的薪资半年内涨了30万元,都一直都没有招到合适的人。为什么呢?因为他们要求技术好的同时,英语也要好。什么才叫好呢?就是可以用流利的英语和国外的团队无障碍交流。 这就为难很多程序员了。这里就不再讲英语的励志故事了,我们回到技术面试上。厦门这家公司对技术的要求还是比较高,问了很多对Android机制的理解问题,为什么面试官很在意对机制的理解呢?因为实际的项目中很多性能问题都是由于缺乏对Android运行机制的正确理解的程序员引发的。除了机制问题,现在印象比较深的就是关于SQLite数据库操作的性能优化问题。 面试题:如何对SQLite数据库中进行大量的数据插入? Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作。SQLite是一个轻量的、跨平台的、开源的数据库引擎。SQLite每个数据库都是以单个文件(.db)的形式存在,这些数据都是以B-Tree 的数据结构形式存储在磁盘上。 使用SQLiteDatabase的insert,delete等方法或者execSQL方法默认都开启了事务,如果操作的顺利完成才会更新.db数据库。事务的实现是依赖于名为rollback journal文件,借助这个临时文件来完成原子操作和回滚功能。 大家可以在/data/data//databases/目录下看到一个和数据库同名 的.db-journal文件。 SQLite想要执行操作,需要将程序中的SQL语句编译成对应的SQLiteStatement,比如" select * from table1 ",每执行一次都需要将这个String类型的SQL语句转换成SQLiteStatement。如下insert的操作最终都是将ContentValues转成SQLiteStatementi: public long insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm) { // 省略部份代码

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