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

上传人:b****7 文档编号:9267036 上传时间:2023-02-03 格式:DOCX 页数:19 大小:87.45KB
下载 相关 举报
c10分钟理解Android数据库的创建与使用附详解和示例代码.docx_第1页
第1页 / 共19页
c10分钟理解Android数据库的创建与使用附详解和示例代码.docx_第2页
第2页 / 共19页
c10分钟理解Android数据库的创建与使用附详解和示例代码.docx_第3页
第3页 / 共19页
c10分钟理解Android数据库的创建与使用附详解和示例代码.docx_第4页
第4页 / 共19页
c10分钟理解Android数据库的创建与使用附详解和示例代码.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

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

《c10分钟理解Android数据库的创建与使用附详解和示例代码.docx》由会员分享,可在线阅读,更多相关《c10分钟理解Android数据库的创建与使用附详解和示例代码.docx(19页珍藏版)》请在冰豆网上搜索。

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

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的数据库,在命令行下输入“sqlite3school.db;”即可。

(2)创建表

创建表的SQL语法为:

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

注意:

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

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

NUll数据值为空

INTEGER整型

REAL浮点型数据

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

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

注意:

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

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

PRIMARYKEY主键它是非空且唯一的

NOTNULL非空

UNIQUE唯一

FOREIGNKEY外键

CHECK条件检查

DEFAULT字段的默认值

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

创建表的SQL语句如下图所示

注意:

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

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

insertintostuselect*fromstudents;

(4)查询语句

Select语句的通用格式如下:

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

1.字段与表的别名

多表查询时查询条件相对复杂,表之间可能会产生相同的字段,这个时候字段前面可以加上表名以区分,别名就是我们可以将classes的表名设置为cls,将classes表中的major字段显示为cmj字段以简化SQL语句。

2.where条件过滤

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

注意where中有一个较为重要的关系操作符叫做like。

它是模糊匹配。

例如要找到students表中以t开头的所有学生,那么对应的SQL为:

select*fromstudentswherenamelike“t%”;

3.Groupby分组

聚合中有一个重要的功能就是分组。

分组就是将得到的结果集按照一定的规则划分为多个组。

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

4.排序

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

5.数量限定

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

limit返回的数量offset偏移量

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

select*fromstudentslimit1offset2;

6.distinct去重

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

(5)update语句

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

updatetablesetupdate_listwherepredicate;

update_list是要修改的字段以及值,其实就是一个字段赋值语句,形式为:

字段名=字段值,每个字段赋值语句通过逗号分隔开。

后续我会在具体的示例代码中举例,在这就不过多阐述。

(6)delete语句

delete语句的格式如下:

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

deletefromtablewherepredicate;

(7)修改表

我们知道,随着项目的演化,最初建立的表可能会面临修改的情况。

修改表的SQL语句命令为alter。

SQLite中的alter命令并没有实现标准SQL中的所有功能,**它只有修改表名和添加字段两个功能**,**删除字段等功能只能通过重新创建表来实现**。

alter的语法格式为:

altertabletableName{renametonewName|addcolumn新的字段};

上述的语法表示altertable之后要操作先跟表名,然后renametonewName和addcolumn新的字段两者2选1。

renameto是重命名,addcolumn是添加新的字段。

(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()获取到数据库完成数据的操作。

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

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

packagecom.geocompass.gisdatacollection.database;

importandroid.content.Context;

importandroid.database.Cursor;

importandroid.database.DatabaseErrorHandler;

importandroid.database.sqlite.SQLiteDatabase;

importandroid.database.sqlite.SQLiteOpenHelper;

importandroid.os.Environment;

importcom.geocompass.gisdatacollection.CollectionApplication;

importjava.io.File;

/**

*Createdbyliuxuon2017/4/7.

*数据库的操作的帮助类

*/

publicclassComplexDatabaseSqlHelperextendsSQLiteOpenHelper{

privatestaticfinalStringTAG="ComplexDatabaseSqlHelper";

//数据库的版本号

privatestaticfinalintDB_VERSION=1;

publicSQLiteDatabasegetDb(){

returndb;

}

privateSQLiteDatabasedb;

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

privatestaticStringmDBPath=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"giscoll.db";

privatestaticComplexDatabaseSqlHelpermDBSqlHelper;

publicComplexDatabaseSqlHelper(Contextcontext,StringDBpath){

super(context,DBpath,null,DB_VERSION);

mDBPath=DBpath;

if(db==null){

db=SQLiteDatabase.openOrCreateDatabase(DBpath,null);

}

onCreate(db);

}

publicComplexDatabaseSqlHelper(Contextcontext,Stringname,SQLiteDatabase.CursorFactoryfactory,intversion){

super(context,name,factory,version);

}

publicComplexDatabaseSqlHelper(Contextcontext,Stringname,SQLiteDatabase.CursorFactoryfactory,intversion,DatabaseErrorHandlererrorHandler){

super(context,name,factory,version,errorHandler);

}

@Override

publicvoidonCreate(SQLiteDatabasedb){

StringCREATE_POINT="createtabletab_point("

+"idintegerprimarykeyautoincrement,"

+"londouble,"

+"latdouble,"

+"typeinteger)";

StringCREATE_INTERSECTION="createtabletab_intersection("

+"inter_idintegerprimarykeyautoincrement,"

+"interLondouble,"

+"interLatdouble,"

+"interRouteIDtext)";

StringCREATE_ROUTE="createtabletab_route("

+"route_nametext,"

+"startPointIDinteger,"

+"endPointIDinteger,"

+"geometryIDtext,"

+"Geometrytext)";

;

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

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

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){

}

/**

*获取数据库的帮助类

*

*@return

*/

publicstaticComplexDatabaseSqlHelpergetDBSqlHelper(){

if(mDBSqlHelper==ull){

synchronized(ComplexDatabaseSqlHelper.class){

if(mDBSqlHelper==null){

mDBSqlHelper=newComplexDatabaseSqlHelper(CollectionApplication.getmContext(),mDBPath);

}

}

}

returnmDBSqlHelper;

}

/**

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

*

*@paramsql

*@return

*/

publicCursorquery(Stringsql){

returndb.rawQuery(sql,null);

}

/**

*执行Sql语句

*

*@paramsql

*/

publicvoidexecSQL(Stringsql){

db.execSQL(sql);

}

/**

*判断表格是否存在

*

*@paramtableName

*@return

*/

publicbooleantableIsExist(StringtableName){

booleanresult=false;

if(tableName==null){

returnfalse;

}

Cursorcursor=null;

try{

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

Stringsql="selectcount(*)ascfromSqlite_masterwheretype='table'andname='"+tableName.trim()+"'";

cursor=db.rawQuery(sql,null);

if(cursor.moveToNext()){

intcount=cursor.getInt(0);

if(count>0){

result=true;

}

}

cursor.close();

}catch(Exceptione){

//TODO:

handleexception

result=false;

}

returnresult;

}

/**

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

*

*@paramtableName

*@paramcolumnName

*@return

*/

publicbooleancolumnIsExistsInTable(StringtableName,StringcolumnName){

booleanresult=false;

Cursorcursor=null;

try{

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

cursor=db.rawQuery("select*fromsqlite_masterwherename=?

andsqllike?

"

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

result=null!

=or&&cursor.moveToFirst();

}catch(Exceptionignored){

}finally{

if(null!

=cursor&&!

cursor.isClosed()){

cursor.close();

}

}

returnresult;

}

privatevoidopen(){

if(db!

=null&&!

db.isOpen())

db=SQLiteDatabase.openOrCreateDatabase(mDBPath,null);

}

}

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

packagecom.geocompass.gisdatacollection.database.manage;

importandroid.database.Cursor;

importandroid.database.SQLException;

importandroid.database.sqlite.SQLiteDatabase;

importcom.geocompass.gisdatacollection.model.Intersection;

importcom.geocompass.gisdatacollection.model.Point;

importcom.geocompass.gisdatacollection.model.Route;

importjava.util.ArrayList;

importjava.util.List;

/**

*Createdbyliuxuon2017/4/10.

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

*/

publicclassComplexDBDao{

privateSQLiteDatabasedb;

publicComplexDBDao(SQLiteDatabasedb){

this.db=db;

}

/**

*插入一个点到tab_point表

*@parampoint

*@return

*/

publicbooleaninsert(Pointpoint){

StringINSERT_POINT="INSERTINTOtab_point(lon,lat,type)VALUES("+point.lon+","+point.lat+","+point.point_type+")";

try{

db.execSQL(INSERT_POINT);

}catch(SQLExceptione){

e.printStackTrace();

returnfalse;

}

returntrue;

}

/**

*插入一个节点到tab_intersection表中

*@paramintersection

*@return

*/

publicbooleaninsert(Intersectionintersection){

StringINSERT_INTERSECTION="insertintotab_intersection(interLon,interLat,interRouteID)values("+intersection.interLon+","+intersection.interLat+",'"+

intersection.inter_route_id+"')";

try{

db.execSQL(INSERT_INTERSECTION);

}catch(SQLExceptione){

e.printStackTrace();

returnfalse;

}

returntrue;

}

/**

*插入一条Route到tab_route表中

*@paramroute

*@return

*/

publicbooleaninsert(Routeroute){

StringINSERT_ROUTE="insertintotab_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(SQLExceptione){

e.printStackTrace();

returnfalse;

}

returntrue;

}

/**

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1