您的位置:首页 > 移动开发 > Android开发

Android——数据存储之SQLite数据库

2015-02-10 11:57 288 查看
一、SQLite简介

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

——支持高达2TB大小的数据库

——每个数据库以单个文件的形式存在

——每个文件以B-Tree的数据结构形式存储在磁盘

二、特点主要包括:

1. 轻量级 一个动态库即单文件

2. 独立型 没有依赖、无需安装

3. 隔离性 全部在一个文件夹中

4. 跨平台 支持众多操作系统

5. 多语言接口 支持众多编程语言

6. 安全性 事务处理的安全性

——通过数据库上的独占性和共享锁来实现独立事务处理

——多个进程可以同一时间从同一数据库读取数据,但只有一个可以写入数据。

三、SQLite的数据类型

1. 支持NULL(空值)、INTEGER(整型值)、REAL(浮点值)、TEXT(字符串值)、BLOB(二进制对象)

2. 动态数据类型(弱引用)

当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。

注意:主键为INTEGER时,再转换类型就会报错。

四、使用须知

-由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地。如Android、IOS

-没有可用于SQLite的网络服务器、只能通过网络共享,可能存在文件锁定或者性能问题。

-只提供数据库级的锁定

-没有用户账户概念,而是根据文件系统确定所有数据库的权限。

五、在Android中如何使用SQLite(主要两个类)

-SQLiteDatabase

(1)提供了一些管理SQLite数据库的类

(2)提供创建,删除,执行SQL命令,并执行其他常见的数据库管理任务的方法。

(3)每个程序的数据库名字是唯一的,默认情况下是各自互相不干扰。

db.execSQL(sql)  //执行任何SQL语句
db.insert(table,nullColumnHack,values)
db.delete(table,whereClause,whereArgs)
db.update(table,values,whereClause,whereArgs)
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy)
db.rawQuery(sql,selectionArgs) //sql语句查询


-SQLiteOpenHelper

1.创建一个数据库并且打开(Activity间接继承Content,Content提供方法openOrCreateDatabase())

SQLiteDatabase db= openOrCreateDatabase("name数据库名字.db", mode权限——可读可写私有库, factory可为null);
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement, name text not null,age integer not null, sex text not null)");//建议主键的名字一定写上下划线  完成表的创建
db.execSQL("insert into usertb(name,sex,age) values('张三','女',18)");
Cursor cursor = db.rawQuery("select * from usertb",null);//查询结果存在Cursor对象中
if(cursor!=null){
c.moveToFirst();//其实默认就在第一行
while(cursor.moveToNext()){
cursor.getInt(cursor.getColumnIndex("_id")); //取第一行的第一个字段
cursor.getString(cursor.getColumnIndex("name")); //取第一行的第二个字段
cursor.getInt(cursor.getColumnIndex("age")); //取第一行的第三个字段
cursor.getString(cursor.getColumnIndex("sex")); //取第一行的第四个字段
}
cursor.close(); //关闭游标、释放内存
}
db.close();//释放数据库所占内存


Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cusor最终会被释放掉。 然而如果Cursor的数据量特别大,特别是里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。并且Android明显是倾向于编程者手动的将Cursor
close掉,因为在源代码中我们发现,如果等到垃圾回收器来回收时,也就是如果不手动关闭,系统会报错,会给用户以错误提示。

Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等,常用方法:

getCount()//总记录条数
isFirst() //判断是否第一条记录
isLast()  //判断是否最后一条记录
moveToFirst()  //移动到第一条记录
moveToLast() //移动到最后一条记录
move(int offset) //移动到指定记录
moveToNext()  //移动到下一条记录
moveToPrevious() //移动到上一条记录
getColumnIndexOrThrow(String columnName) //据列名称获得列索引
getInt(int columnIndex)//获得指定列索引的int类型值
getString(int columnIndex)//获得指定列索引的String类型值


六、Android内置函数访问SQLite数据库

1. ContentValues: 这个类用来存储一组可以被ContentResolver处理的值

(1)ContentValues values = new ContentValues();//类似hashMap key value

(2)values.put("name","张三");

(3)执行对应的Sql操作

SQLiteDatabase db= openOrCreateDatabase("name数据库名字.db", mode权限——可读可写私有库, factory可为null);
db.execSQL("create table if not exists stutb(_id integer primary key autoincrement, name text not null,age integer not null, sex text not null)");//建议主键的名字一定写上下划线  完成表的创建
ContentValues values = new ContentValues();
values.put("name","张三");
values.put("sex","男");
values.put("age",19);
long rowID = db.insert("stutb",null,values); //插入行的ID
values.clear();  //清空后重新put值,插入新值,就不需要重new ContentValues
values.put("name","张已");
values.put("sex","男");
values.put("age",20);
db.insert("stutb",null,values);
//更新
values.clear();
values.put("sex","女");
db.update("stub",values,"_id>?",new String[]{"3"}); //将所有ID大于3的性别改为女
//删除
db.delete("stutb","name like ?",new String[]{"%风%"});//删除所有名字中带有风的人
//查询
Cursor c = db.query("stutb",null,"_id>?",new String[]{"0"},null,null,"name");
if(c!=null){
String[] columns = c.getColumnNames();//获取所有的字段名字
while(c.moveToNext()){
for(String columnName:columns){
Log.i("info",c.getString(c.getColumnIndex(columnName)));
}
}
c.close();
}
db.close();


七、SQLiteOpenHelper——可以控制数据库的初始化操作

1. SQLiteOpenHelper是SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新

2. 一般要建立一个类继承它(名为DBOpenHelper),并重写构造函数及onCreate()和onUpgrade()方法

3. 方法说明

(1)onCreate(SQLiteDatabase db) 首次创建数据库时调用 如果以有这个库,则不会自动回调该方法,一般可把建库建表的操作放于此

db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null, age integer not null"));

db.execSQL("insert into stutb(name,sex,age) values ('张上','女',14)");

(2)onUpgrade(SQLiteDatabase db, int oldVersion, int new Version) 当数据库的版本发生变化时自动调用

(3)getReadableDatabase() 创建或打开一个只读数据库

(4)getWritableDatabase() 创建或打开一个读写数据库

4. 示例

DBOpenHelper helper = new DBOpenHelper(MainActivity.this,"stu.db");
//helper.getReadableDatabase();//获取一个只读数据库,只能查询
SQLiteDatabase db = helper.getWritableDatabase();
Cursor c=db.rawQuery("select * from stutb",null);
if(c!=null){
//与上面ContenValues中一样
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: