5.0 SQLite数据库存储
SQLite (http://www.sqlite.org/),是一款轻型的关系型数据库服务器, 移动设备
的数据库存储都使用SQLite, 它的特点:
-
安装文件小: 最小只有几百K, Android系统已经安装
-
支持多操作系统: Android, WP, IOS, Windows, Linux等
-
支持多语言: 比如 Java 、 PHP、 C#等. Jdbc--mysql
-
处理速度快: 处理速度比Mysql, Oracle, SqlServer都要快(数据量不是特别大)
-
Sqlite中的一个数据库就是一个.db文件(本质上.db的后缀都可以不指定)
应用运行需要保存一系列有一定结构的数据, 比如说公司员工信息
-
文件类型: .db
-
数据保存的路径: /data/data/projectPackage/databases/xxx.db • 默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提 供其它应用操作
-
应用卸载时会删除此数据
5.0.1 Sqlite数据库客户端
image5.0.2 数据类型
Sqlite支持的数据类型与Mysql相似, 常用的数据类型
• INT/INTEGER : 整数
• FLOAT/DOUBLE : 小数
• CHAR/VARCHAR/TEXT : 字符串文本
• BLOB : 二进制文件
• DATE/ DATETIME : 日期/日期时间
数据类型
SQL:
\>DDL:数据定义语言: CREATE TABLE / ALTER TABLE/ DROP
\>DML:数据操纵语言: INSERT INTO / DELETE FROM / UPDATE … SET
\>DCL:数据控制语言: COMMIT / ROLLBACK / SET SAVE POINT
5.1 Sqlite建表
Sqlite操作数据库的sql语句基本与mysql一样, 但需要注意下面2个点:
-
最大的不同在于创建表时可以不用指定字段类型, Sqlite可以适时的自动
转换, 但除varchar类型外最好指定类型 -
Sqlite中的主键名称建议使用_id,便于SimpleCursorAdapter调用
5.2 Sqlite的CRUD语句
image5.2.1 Sqlite数据库命令行
-
adb shell 进入系统根目录
-
cd data/data/…/databases : 进入包含数据库文件的文件夹下
-
sqlite3 contacts2.db : 使用sqlite3命令连接指定的数据库文件, 进入连接模式
-
.help : 查看命令列表
-
.tables : 查看所有表的列表
-
执行insert/delete/update/select语句
-
.exit : 退出数据库连接模式
-
Ctrl + C : 直接退出sell模式
5.3 SQLite数据库存储 相关API
5.3.1 SQLiteOpenHelper常用方法
方法声明 | 功能描述 |
---|---|
public SQLiteOpenHelper(Context,context,String name,CusorFactory factory,int version) | 构造方法,一般需要传递一个创建的数据库名称即name参数,版本号version最小为1 |
public void onCreate(SQLiteDatabase db) | 创建数据库时调用的方法 |
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) | 数据库版本更新时调用 |
public SQLiteDatabase getReadableDatabase() | 创建或打开一个只读的数据库 |
public SQLiteDatabase getWriteableDatabase() | 创建或打开一个读写的数据库 |
5.3.2 SQLiteDatabase类
SQLiteDatabase类是一个数据库访问类,该类封装了一系列数据库操作的API,可以对数据库进行增删改查操作。
SQLiteDatabase类常用方法
方法声明 | 功能描述 |
---|---|
public long insert(String table,String nullColumnHack,ContentValues values) | 该方法用于添加一条记录,其参数table代表表名,nullColmnHack代表列名,values代表参数集合 |
public Cursor query(String table,String[]columns,String selection,String[]selectionArgs,String groupBy,String having,String orderBy) | 该方法用于查询数据,其参数columns代表列明数据,selection代表查询条件,selectionArgs代表查询参数值,groupBy代表分组,having代表聚合函数,orderBy代表排序 |
public Cursor rawQuery(String sql,String[]selectionArgs) | 执行带占位符的SQL查询 |
public int update(String table,ContentValues values,String whereClause,String[]whereArgs) | 修改特定数据 |
public int delete(String table,String whereClasue,String[]whereArgs) | 删除表中特定记录 |
public void execSQl(String sql,Object[]bindArgs) | 执行一条带占位符的SQL语句 |
public void close() | 关闭数据库 |
5.3.3 Cursor接口
Cursor是一个游标接口,在数据库操作中作为返回值,相当于结果集ResultSet。
Cursor常用方法
方法声明 | 功能描述 |
---|---|
boolean moveToNext() | 移动光标到下一行 |
int getInt(int columnIndex) | 获取指定列的整型值 |
int getColumnIndex(String columnName) | 返回指定列索引值,如果列不存在则返回-1 |
String getString(int columnIndex) | 获取指定列的字符串 |
boolean moveToFirst() | 移动光标到第一行 |
boolean moveToLast() | 移动光标到最后一行 |
boolean moveToPrevious() | 移动光标到上一行 |
boolean moveToPosition(int position) | 移动光标到指定位置 |
int getCount() | 返回Cursor中的行数 |
int getPosition() | 返回当前Cursor的位置 |
String getColumnName(int columnIndex) | 根据列的索引值获取列的名称 |
String[]getColumnNames() | 获取Cursor所有列的名称的数组 |
5.4 数据库的常用操作
AndroidSDK提供的一系列操作SQLite数据库的API,针对上述API操作SQLite数据库进行详细讲解
5.4.1 创建SQLite数据库
Android推荐使用SQLiteOpenHelper的子类创建SQLite数据库,因此需要创建一个类继承自SQLiteOpenHelper,重写onCreate()方法,并在该方法中执行创建数据库的命令。具体代码如下所示:
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper
{
//数据库的构造方法,用来定义数据库的名称,数据库查询的结果集,数据的版本
public PersonSQLiteOpenHelper(Context context)
{
super(context,"person.db",null,5);
}
//数据库第一次被创建时调用该方法
public void onCreate(SQLiteDatabase db)
{
//初始化数据库的表结构,执行一条建表的SQL语句
db.execSQL("create table person(in integer primary key autoincrement, "+" name varchar(20)," + " number varchar(20))");
}
//当数据库版本号增加时调用
public void onUpgrade(SQLiteDatabase db ,int oldVersion,int newVersion)
{
db.execSQL("alter table person add account varchar(20)");
}
}
上述代码中,创建表的SQL语句被定义在onCreate()方法中,当数据库第一次被创建时会自动调用该方法,并执行方法中的SQL语句。当数据库版本号增加时会调用onUpgrade()方法,如果版本号补增加,该方法不会被调用。创建的数据库被放在/data/data/<your package name>/database目录下.
5.4.2 增加一条数据
在操作数据库之前首先要得到一个可读写的SQLiteDatabase对象,具体代码如下:
public long add(String name,String number)
{
//拿到一个可读写的SQLiteDatabase对象
SQLiteDatabase db=helper .getWritableDatabase();
//将参数名和列添加到ContentValues对象里面
ContentValues values=new ContentValues();
values.put("name",name);
values.put("number",number);
//插入一条数据到person数据表里
long id=db.insert("person",null,values);
//关闭数据库
db.close();
return id;
}
ContentValues类,该类用于放置参数,它的底层是利用Map集合实现的。key表示插入数据的列名,value表示要插入的数据。
除了上述方法之外,还有一个方法可以实现该功能,具体代码如下:
db.execSQL("insert into person (name,number) values(?,?)",new Object[]{name,number});
与insert()方法不同的是,execSQL()方法的第一个参数表示将要执行的SQL语句,并用占位符表示参数,第二个参数表示占位符对应的参数。修改数据和删除数据都可以用该方法完成,只需要修改相应的SQL语句即可。
5.4.3 修改一条数据
public int update(String name,String newnumber)
{
//获取一个可读写的SQLiteDatabase对象
SQLiteDatabase db=helper.getWritableDatabase();
//创建一个ContentValues对象
ContentValues values=new ContentValues();
//将参数以key,value的形式添加进去
values.put("number",newnumber);
//执行修改的方法
int number=db.update("person",values,"name=?",new String[]{name});
//关闭数据库
db.close();
return number;
}
使用完SQLiteDatabase对象若未关闭,则数据库连接会一直存在,会不断消耗内存,并且会报出数据库未关闭异常,当系统内存不足时将获取不到SQLiteDatabase对象。
5.4.4 删除一条数据
public int delete(String name)
{
//获取一个可读写的SQLiteDatabase对象
SQLiteDatabase db=helper.getWritableDatabase();
//删除数据
int number=db.delete("person","name=?",new String[]{name});
//关闭数据库
db.close();
return number;
}
删除数据时不需要使用ContentValues来添加参数,而是使用一个字符串和一个字符数组来添加参数名和参数值
5.4.5 查询一条数据
query()方法查询
public boolen find(String name)
{
//获取一个可读写的SQLiteDatabase对象
SQLiteDatabase db=helper.getWritableDatabase();
//查询数据库的操作 参数1:表名,参数2:查询的列名,参数3:查询条件,参数4:查询参数值,参数5:分组条件,参数6:having条件,参数7:排序方式
Cursor cursor=db.query("person",null,"name=?",new Sting[]{name},null,null,null);
//是否有下一条值
boolean result=cursor.moveToNext();
//关闭游标
cursor.close();
//关闭数据库
db.close();
return result;
}
rawQuery查询
Cursor cursor=db.rawQuery("select * from person where name=?",new String[]{name});
execSQL()方法没有返回值,rawQuery查询数据库会返回一个结果解Cursor,使用完Cursor对象要及时关闭
5.5 SQLite数据库数据库事务
转账可以分为两部分来完成:转入和转出,只有这两部分都完成才认为转账成功。在数据库中,这个过程使用两条语句来完成,如果其中任何一条语句出现异常没有执行,则会导致两个账户的金额不同步。
所谓事务就是针对数据库的一组操作,它可以由一条或者多条SQL语句组成,同一个事务操作具备同步的特点,如果其中有一条语句无法执行,那么所有的语句都不执行,也就是说,事务中的语句要么都只执行,要么都不执行。SQLite的事务模拟操作具体代码示例如下:
PersonSQLiteOpenHelper helper=new PersonSQLiteOpenHelper(getContext());
//获取一个可读写的SQLiteDatabase对象
SQLiteDatabase db=helper.getWritableDatabase();
//开始数据库的事务
db.beginTransaction();
try
{
//执行转出操作
db.execSQL("udpate person set account=account-1000 where name=?",new Object[]{"HASH"});
//执行转入操作
db.execSQL("update person set account=account+1000 where name=?",new Object[]{"xuemin"});
//标记数据库事务执行成功
db.setTRansactionSuccessful();
}
catch(Execption e)
{
Log.i("事务处理失败",e.toString());
}
finally
{
db.endTransaction();//关闭事务
db.close();//关闭数据库
}
事务操作完成后一定要使用endTransaction()方法关闭事务,当执行到endTransaction()方法时首先会检查是否有事务执行成功的标志,有则提交数据,无则回滚数据。最后关闭事务和数据库,如果不关闭事务,事务只有到超时才会自动结束,会降低数据库并发效率。因此,通常情况下该方法放在finally中执行。
5.5.1 事务的ACID(acid)属性
-
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都
发生,要么都不发生。 -
一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 -
隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事
务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行
的各个事务之间不能互相干扰。 -
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永
久性的,接下来的其他操作和数据库故障不应该对其有任何影响
网友评论