巩固基础的,多学习一下,数据库简单但是需要你去细心
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图
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();//由事务的标志决定是提交事务还是回滚事务
}