【移动应用开发技术】Android的数据库怎么使用_第1页
【移动应用开发技术】Android的数据库怎么使用_第2页
【移动应用开发技术】Android的数据库怎么使用_第3页
【移动应用开发技术】Android的数据库怎么使用_第4页
【移动应用开发技术】Android的数据库怎么使用_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论