Android数据基础知识 以及方法说明,史上最全

来源:互联网 发布:淘宝联盟权限有什么 编辑:程序博客网 时间:2024/05/16 06:14

巩固基础的,多学习一下,数据库简单但是需要你去细心

SQLite是android内置的一个很小的关系型数据库。 

SQLite的官网是http://www.sqlite.org/,可以去下载一些文档或相关信息

1.

SQLiteOpenHelper(抽象类)是一个辅助类来管理数据库的创建和版本。 
可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。 
所有继承了这个类的类都必须实现下面这样的一个构造方法: 
public DatabaseHelper(Context context, String name, CursorFactory factory, int version) 
第一个参数:Context类型,上下文对象。 
第二个参数:String类型,数据库的名称 
第三个参数:CursorFactory类型 ,这个一般为null
第四个参数:int类型,数据库版本 



常用api图



2.

SQLiteDatabase


SQLiteDatabase提供了如下静态方法打开一个文件对应的数据库:

1、static SQLiteDatabase openDatabase(String  path,SQLiteDatabase.CursorFactory  factory,int  flags):打开path文件代表的SQLite数据库。

2、static SQLiteDatabase  openOrCreateDatabase(File  file,SQLiteDatabaseCursorFactory  factory):打开或创建(如果不存在)file文件所代表的SQLite数据库。

3、static SQLiteDatabase  openOrCreateDatabase(String  path,SQLiteDatabaseCursorFactory  factory):打开或创建(如果不存在)path文件所代表的SQLite数据库。

在程序中获取SQLiteDatabase对象之后,接下来就可调用SQLiteDatabase的如下方法来操作数据库:

1、execSQL(String  sql,Object[ ]  bindArgs):执行带占位符的SQL语句。

2、execSQL(String sql):执行SQL语句。

3、insert(String table,String nullColumnHack,ContentValues  values):向执行表中插入数据。

4、update(String table ,ContentValues  values,String  whereClause,String[ ]  whereArgs):更新特定表中的特定数据

5、delete(String table,String whereClause,String[ ] whereArgs):删除指定表中的特定数据。

6、Cursor  query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy):对执行数据表执行查询。

7、Cursor  query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):对执行数据表执行查询。limit参数控制最多查询几条记录(用于控制分页的参数)。

8、Cursor  query(boolean distinct,String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):对指定表执行查询语句。其中第一个参数控制是否取出重复值。

9、rawQuery(String sql,String[ ] selectionArgs):执行带占位符的SQL查询。

10、beginTransaction():开始事物。

11、endTransaction():结束事物。

上面查询方法都是返回一个Cursor对象,Cursor提供了如下方法来移动查询结果的记录指针:

1、move(int  offset):将记录指针向上或向下移动指定的行数,offset为整数时向下移,为负数时向上移。

2、boolean  moveToFirst():将记录指针移动到第一行,如果移动成功则返回true。

3、boolean  moveToLast():将记录指针移动到最后一行,如果移动成功则返回true。

5、boolean  moveToNext():将记录指针移动到下一行,如果移动成功则返回true。

6、boolean  moveToPosition(int  position):将记录指针移动到指定的行,如果移动成功则返回true。

7、boolean  moveToPrevious():将记录指针移动到上一行,如果移动成功则返回true。

一旦将记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取改行指定列的数据。

3.创建数据库和类

使用SQLiteDatabase的静态方法可以打开或创建数据库,示例代码如下:

SQLiteDatabase.openOrCreateDatabase(“/mnt/db/book.db”,null);

//如果/mnt/db/目录下的db/book.db文件(该文件就是一个数据库)存在,那么程序就是打开数据库,如果该文件不存在,则代码将会在该目录下创建db/book.db文件(即对应于数据库)。第二个参数SQLIteDatabase.CursorFactory是一个用于返回Cursor的工厂,如果参数设为null,意味着使用默认的工厂。

上面的代码返回一个SQLiteDatabase对象,该对象的execSQL可执行任意的SQL语句,因此可通过如下代码创建数据表:

String sql=“create table bookinfo(_id  integer  primary  key,bookname  varchar(25),bookauthor  varchar(25))”;

db.execSQL(sql);


4、使用特定方法操作SQLite数据库

(1)使用insert方法插入记录

SQLiteDatabase的insert方法签名为long  insert(String table,String nullColumnHack,ContentValues  values),参数说明如下:

table:代表想插入数据的表名

nullColumnHack:代表强行插入null值的数据列的列名。

values:代表一行记录的数据。

insert方法插入的一行记录使用ContentValues存放,ContextValues类似于Map,它提供了put(String key,Xxx  value)(其中key为数据列的列名)方法用于存入数据,getAsXxx(String  key)用于取出数据。

示例代码如下:

ContextValues values=new  ContextValues();

values.put(”name“,”1028962069“);

values.put(”age“,22);

long  row=db.insert(”bookinfo“,null,values);

不管第三个参数是否包含数据,执行insert()方法总会添加一条记录,如果第三个参数为空,会添加一条除主键之外其它字段值都为null的记录。

一般来说,第二个参数指定的列名不应该是主键列的列名,也不应该是非空列的列名,否则强行往这些数据列插入null会引发异常。

其对应的SQL语句如下:

insert  into<表名>(key1,key2......)  values(value1,value2.......)

(2)使用update方法更新记录

SQLiteDatabase的update方法签名为update(String table ,ContentValues  values,String  whereClause,String[ ]  whereArgs),参数说明如下:

table:代表想更新数据的表名。

values:代表想更新的数据。

whereClause:满足该whereClause子句的记录将会被更新。

whereArgs:用于为whereClause子句传入参数。

该方法返回受此update语句影响的记录的条数。

例如我们想更新bookinfo表中所有主键大于22的人的人名,代码如下:

ContextValues  values=new  ContextValues();

values.put(”name“,”1028962069“);

int  result=db.update(”bookinfo“,values,”_id>?“,,”new Integer[ ]{22}“);

对应的SQL语句如下:

update <table> set  key1=value1,key2=value2.....  where  <whereClause> 

(3)使用delete方法删除记录

SQLiteDatabase的delete方法签名为:delete(String table,String whereClause,String[ ] whereArgs),参数说明如下:

table:代表想删除数据的表名。

whereClause:满足该whereClause子句的记录将会被删除。

whereArgs:用于为whereClause子句传入参数

该方法返回受此delete语句影响的记录的条数。

例如我们想删除person_inf表中所有人名以孙开头的记录,代码如下:

SQLiteDatabase db=this.getWritableDatabase();
String where="bookid"+"=?";
String[] idvalues={Integer.toString(id)};
db.delete("bookinfo", where,idvalues);

对应的SQL语句如下:

delete <table> where  <whereClause>

(4)使用query方法查询记录

SQLiteDatabase的query方法的签名为Cursor  query(boolean distinct,String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit),参数说明如下:

distinct:指定是否去除重复记录。

table:执行查询数据的表名。

columns:要查询出来的列名,相当于select语句select关键字后面的部分。

selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句中允许使用占位符”?“。

selectionArgs:用于为selection子句中占位符传入参数值,值在数组中的位置与占位符在语句中的位置必须一致,否则会出现异常。

groupBy:用于控制分组。相当于select语句group by关键字后面的部分。

having:用于对分组进行过滤。相当于select语句having关键字后面的部分。

orderBy:用于对记录进行排序。相当于select语句order by关键字后面的部分,如personid desc,age  asc

limit:用于进行分页,相当于select语句limit关键字后面的部分,例如5,10

当应用程序需要进行”条件不确定“的查询(即查询条件需要动态改变的查询)时,使用这个query方法可以避免手动拼接SQL语句。

代码如下:


5、事务

SQLiteDatabase中包含如下两个方法来控制事务:

beginTransaction():开始事务。

endTransaction():结束事务。

除此之外,SQLiteDatabase还提供了如下方法判断当前上下文是否处于事务环境中。

inTransaction():如果当前上下文处于事务中,返回true,否则返回false;

当程序执行endTransaction()方法时将会结束事务--到底是提交事务,还是回滚事务?取决于SQLiteDatabase是否调用了setTransactionSuccessful()方法来设置事务标志,如果程序事务执行中调用该方法设置了事务成功则提交事务,否则程序将回滚事务。示例代码:

db.beginTransaction();//开始事务

try{

//执行DML语句

......

db.setTransactionSuccessful();//调用该方法设置事务成功。否则endTransaction()方法将回滚事务

}

finally{

db.endTransaction();//由事务的标志决定是提交事务还是回滚事务

}




原创粉丝点击