c10分钟理解Android数据库的创建与使用附详解和示例代码.docx
- 文档编号:9267036
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:87.45KB
c10分钟理解Android数据库的创建与使用附详解和示例代码.docx
《c10分钟理解Android数据库的创建与使用附详解和示例代码.docx》由会员分享,可在线阅读,更多相关《c10分钟理解Android数据库的创建与使用附详解和示例代码.docx(19页珍藏版)》请在冰豆网上搜索。
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;
}
/**
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c10 分钟 理解 Android 数据库 创建 使用 详解 示例 代码