版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android的数据库怎么使用
今天在下给大家分享一下Android的数据库怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、Android数据库使用Android中使用android.database.sqlite.SQLiteDatabase来表示一个数据库对象,它提供了两种模式来帮助开发者进行增删改查等基本数据库操作。利用SQL语句描述操作利用SQL语句调用SQLiteDatabase.execSql或SQLiteDatabase.rawQuery来执行操作。//利用sql查询数据
Cursor
data
=
db.rawQuery("select
id,name
from
table");
//利用sql插入数据
db.execSql("insert
into
contacts
(id,name)
values
(2,'cpacm')");稍微学过sql语句的人应该都看的懂上面的代码(其实看语句的意思也能知道个大概~)在这里我来解释一下Cursor(游标)的作用吧,游标不能顾名思义(up主当时学习数据库时一度将游标当做与C语言里面的指针变量一样,虽然有点对,但意思还是理解错了),Cursor它是系统为用户开设的一个数据缓冲区,是的,它是一块数据区域,存放SQL语句的执行结果。但是它也提供了能从包括多条数据记录的结果集中每次提取一条记录的机制,这一点也跟指针很像。游标总是与一条SQL选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理
时,必须声明一个指向该结果集的游标。用C语言作比较的话,如果写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。总之记住,游标是一块有着特有记号的一块数据区域,能够让用户逐条从中读取出数据。结构化的方式描述数据库的操作这样即使我们不熟悉SQL语句,也能使用最熟悉的面向对象的方式进行数据库操作。//结构化的方式查询数据
Cursor
data
=
db.query("contacts",new
String[]{"id","name"},null,null,null,null,null);
//结构化方式插入数据
ContentValue
values
=
new
ContentValues();
values.put("id",2);
values.put("name","cpacm");
db.insert("table",null,values);//结构化的方式查询数据
Cursor
data
=
db.query("contacts",new
String[]{"id","name"},null,null,null,null,null);
//结构化方式插入数据
ContentValue
values
=
new
ContentValues();
values.put("id",2);
values.put("name","cpacm");
db.insert("table",null,values);/**
*
参数说明
*
table:数据表名,columns:需要显示的列名,如果为null则相当与*
*
selection:相当于sql语句的where条件;selectionArgs数组放的是where条件要替换的?号
*
groupBy:SQL语句的Group,
orderBy:
排序,默认asc
**/
public
Cursor
query
(String
table,
String[]
columns,
String
selection,
String[]
selectionArgs,
String
groupBy,
String
having,
String
orderBy){
}比如说我要查询的SQL语句为SELECT
CustomerName,
SUM(OrderPrice)
FROM
Orders
WHERE
Country=?
GROUP
BY
CustomerName
HAVING
SUM(OrderPrice)>500
ORDER
BY
CustomerName那么我写的代码如下//数据表名
String
table
=
"Orders"
;
//要显示的列名
String[]
columns
=
new
String[]
{
"CustomerName"
,
"SUM(OrderPrice)"
};
//选择条件
String
selection
=
"Country=?"
;
//里面的变量对应条件中的问号,多个的时候请一一入座。
String[]
selectionArgs
=
new
String[]{
"China"
};
//分组名
String
groupBy
=
"CustomerName"
;
//分组的条件
String
having
=
"SUM(OrderPrice)>500"
;
//按字段排序
String
orderBy
=
"CustomerName"
;
Cursor
c
=
db.query(table,
columns,
selection,
selectionArgs,
groupBy,
having,
orderBy);这样就能实现数据库的查询了。其它的语句参数都是差不多的,这里就不一一介绍了。public
long
insert
(String
table,
String
nullColumnHack,
ContentValues
values)public
int
delete(String
table,
String
whereClause,
String[]
whereArgs)public
int
update(String
table,
ContentValues
values,
String
whereClause,
String[]
whereArgs)课外小知识:关于GroupBy和Having的使用group
by
顾名思义就是按照xxx进行分组,它必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标识字段。聚合函数有:sum()、count()、avg()等,使用group
by目的就是要将数据分组进行汇总操作。比如上面sql语句的CustomerName,如果它有四个行{“张三”,“李四”,“张三”,“李四”},那么此时就会分成两组,分别为张三组和李四组,然后统计出他们使用的orderprice总和。HAVING作用就是为每一个组指定条件,像where指定条件一样,也就是说,可以根据你指定的条件来选择行。如果你要使用HAVING子句的话,它必须处在GROUP
BY子句之后。还是上面的SQL语句,如果张三的SUM(OrderPrice)没有超过500,那么张三组就不会显示。SQL语句的预编译在实践中,有的SQL语句需要被反复使用,为了避免反复解析SQL语句产生的开销,可以对需要复用的SQL语句进行预编译,来提高数据库操作的执行效率。//编译复杂的SQL语句SQLiteStatement
compiledSql
=
pileStatement(aSQL);
//执行SQLcompiledSql.execute();//编译复杂的SQL语句
SQLiteStatement
compiledSql
=
pileStatement(aSQL);
//执行SQL
compiledSql.execute();课外小知识:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。
简单举个例子就是你要同时修改数据库中两个不同表的时候,如果它们不是一个事务的话,当***个表修改完,可是第二表改修出现了异常而没能修改的情况下,就只有第二个表回到未修改之前的状态,而***个表已经被修改完毕。
而当你把它们设定为一个事务的时候,当***个表修改完,可是第二表改修出现了异常而没能修改的情况下,***个表和第二个表都要回到未修改的状态!这就是所谓的事务回滚。SQLiteOpenHelper在SQLiteOpenHelper中,封装了一个SqliteDatabase对象,使用着可以通过使用此类来进行数据库的操作。package
com.example.notebook;
import
android.content.Context;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteOpenHelper;
import
android.database.sqlite.SQLiteDatabase.CursorFactory;
public
class
DBHelper
extends
SQLiteOpenHelper{
private
static
final
int
VERSION=1;
/**
*
在SQLiteOpenHelper的子类当中,必须有该构造函数
*
@param
context
上下文对象
*
@param
name
数据库名称
*
@param
factory
*
@param
version
当前数据库的版本,值必须是整数并且是递增的状态
*/
public
DBHelper(Context
context,String
name,CursorFactory
factory,int
version){
super(context,name,factory,version);
}
public
DBHelper(Context
context,
String
name,
int
version){
this(context,name,null,version);
}
public
DBHelper(Context
context,
String
name){
this(context,name,VERSION);
}
@Override
public
void
onCreate(SQLiteDatabase
db)
{
//
数据库***构造时,会调用该函数,可以在这里构造表、索引,等等
System.out.println("create
a
database");
//execSQL用于执行SQL语句
db.execSQL("create
table
notebook(_id
integer
primary
key
autoincrement,pic
varchar(50),title
varchar(20),content
text,time
varchar)");
}
@Override
public
void
onUpgrade(SQLiteDatabase
db,
int
oldVersion,
int
newVersion)
{
//
如果给定的当前数据库版本高于已有数据库版本,调用该函数
System.out.println("upgrade
a
database");
}
}SQLiteOpenHelper的应用新建一个数据库管理类DBManagerpackage
com.example.notebook;
import
android.content.ContentValues;
import
android.content.Context;
import
android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteException;
import
android.util.Log;
public
class
DBManager
{
private
Context
mContext
=
null;
private
SQLiteDatabase
mSQLiteDatabase
=
null;//用于操作数据库的对象
private
DBHelper
dh
=
null;//用于创建数据库的对象
private
String
dbName
=
"note.db";//数据库的名称
private
int
dbVersion
=
1;//数据库的版本
public
DBManager(Context
context){
mContext
=
context;
}
public
void
open(){
try{
dh
=
new
DBHelper(mContext,
dbName,
null,
dbVersion);//建立数据库
if(dh
==
null){
Log.v("msg",
"is
null");
return
;
}
mSQLiteDatabase
=
dh.getWritableDatabase();//以可写方式打开数据库
//dh.onOpen(mSQLiteDatabase);
}catch(SQLiteException
se){
se.printStackTrace();
}
}
public
void
close(){
mSQLiteDatabase.close();//关闭数据库
dh.close();
}
public
Cursor
selectAll(){
Cursor
cursor
=
null;
try{
//sql语句操作
String
sql
=
"select
*
from
notebook";
cursor
=
mSQLiteDatabase.rawQuery(sql,
null);
}catch(Exception
ex){
ex.printStackTrace();
cursor
=
null;
}
return
cursor;
}
public
Cursor
selectById(int
id){
//String
result[]
=
{};
Cursor
cursor
=
null;
try{
//sql语句操作
String
sql
=
"select
*
from
notebook
where
_id='"
+
id
+"'";
cursor
=
mSQLiteDatabase.rawQuery(sql,
null);
}catch(Exception
ex){
ex.printStackTrace();
cursor
=
null;
}
return
cursor;
}
public
long
insert(String
title,
String
content,String
pic){
long
datetime
=
System.currentTimeMillis();
long
l
=
-1;
try{
//结构化方式操作
ContentValues
cv
=
new
ContentValues();
cv.put("title",
title);
cv.put("content",
content);
cv.put("time",
datetime);
cv.put("pic",
pic);
l
=
mSQLiteDatabase.insert("notebook",
null,
cv);
//
Log.v("datetime",
datetime+""+l);
}catch(Exception
ex){
ex.printStackTrace();
l
=
-1;
}
return
l;
}
public
int
delete(int
id){
int
affect
=
0;
try{
//结构化方式操作
affect
=
mSQLiteDatabase.delete("notebook",
"_id=?",
new
String[]{String.valueOf(id)});
}catch(Exception
ex){
ex.printStackTrace();
affect
=
-1;
}
return
affect;
}
public
int
update(int
id,
String
title,
String
content,String
pic){
int
affect
=
0;
try{
//结构化方式操作
ContentValues
cv
=
new
ContentValues();
cv.put("title",
title);
cv.put("content",
content);
cv.put("pic",
pic);
String
w[]
=
{String.valueOf(id)};
affect
=
mSQLiteDatabase.update("notebook",
cv,
"_id=?",
w);
}catch(Exception
ex){
ex.printStackTrace();
affect
=
-1;
}
return
affect;
}
}获取数据示例private
DBManager
dm
=
null;//
数据库管理对象
rivate
Cursor
cursor
=
null;
dm
=
new
DBManager(this);//数据库操作对象
dm.open();//打开数据库操作对象
cursor
=
dm.selectAll();//获取所有数据
cursor.moveToFirst();//将游标移动到***条数据,使用前必须调用
int
count
=
cursor.getCount();//个数
ArrayList<String>
contents
=
new
ArrayList<String>();//图片的所有集合
ArrayList<String>
imgs
=
new
ArrayList<String>();//图片的所有集合
ArrayList<String>
items
=
new
ArrayList<String>();//标题的所有集合
ArrayList<String>
times
=
new
ArrayList<String>();//时间的所有集合
for(int
i=
0;
i
<
count;
i++){
contents.add(cursor.getString(cursor.getColumnIndex("content")));
imgs.add(cursor.getString(cursor.getColumnIndex("pic")));
items.add(cursor.getString(cursor.getColumnIndex("title")));
times.add(cursor.getString(cursor.getColumnIndex("time")));
//cursor.getInt(cursor.getColumnIndex("_id"))
cursor.moveToNext();//将游标指向下一个
}
dm.close();//关闭数据操作对象数据库的并发问题并发问题是使用数据库过程中最容易碰到的问题,如果在开发中碰到了android.database.SQLException异常,并提示"databaseislocked"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四塔吊设备购置与销售专项合同范本3篇
- 二零二四年家电销售顾问聘用与售后服务合同3篇
- 二零二五版出租车承包合同绿色出行推广合作2篇
- 二零二五版豪华度假酒店承包经营合同规范范本3篇
- 二零二五版公益劳动服务基地共建与社区公共服务拓展合同3篇
- 年度营养型输液竞争策略分析报告
- 年度智能儿童成长仪市场分析及竞争策略分析报告
- 2024年钢材交易:居间代理全套合同
- 二零二五版水利工程承包居间代理服务合同2篇
- 2025年变压器智能化升级采购及技术支持合同3篇
- 安徽省合肥市包河区2023-2024学年九年级上学期期末化学试题
- 《酸碱罐区设计规范》编制说明
- PMC主管年终总结报告
- 售楼部保安管理培训
- 仓储培训课件模板
- 2025届高考地理一轮复习第七讲水循环与洋流自主练含解析
- GB/T 44914-2024和田玉分级
- 2024年度企业入驻跨境电商孵化基地合作协议3篇
- 《形势与政策》课程标准
- 2023年海南省公务员录用考试《行测》真题卷及答案解析
- 桥梁监测监控实施方案
评论
0/150
提交评论