笔记30 | 数据存储之SQLite的介绍及使用
Posted 项勇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记30 | 数据存储之SQLite的介绍及使用相关的知识,希望对你有一定的参考价值。
前言
零零散散钻研了2天的SQLite的,终于有个基本的认识,说来没脸,正式工作20个月了,还真没用过的SQLite存储数据,因为我负责的公司项目都不需要联网,没有什么复杂的数据需存储,一般用SharedPreferences处理就行了!
前人栽树
http://www.jianshu.com/p/5c33be6ce89d http://blog.csdn.net/codeeer/article/details/30237597/
目录
SQLite的介绍
SQLiteDatabase的介绍
一步一步实现
附
1.SQLite的介绍
SQLite是一款轻型的数据库,它的设计目标是嵌入式的,占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows / Linux / Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl,php,Java,C ++,.Net等,还有ODBC接口,同样比起mysql,PostgreSQL这两款开源世界着名的数据库管理系统来讲,它的处理速度比他们都快。
特点:
轻量级:它是进程内的数据库引擎,因此不存在数据库的客户端和服务器
单一文件:数据库中所有的信息(比如表,视图等)都包含在一个文件内这个文件可以自由复制到其它目录或其它机器上
不需要安装
跨平台/可移植
开源
SQLite数据类型
一般数据采用的固定的数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
NULL:这个值为空值
VARCHAR(n):长度
CHAR(n):长度固定为n的字串,n不能超过254.
INTEGER:值被标识为整数,依据值的大小可以依次被字段,n不能超过存储为1,2,3,4,5,6,7,8。
REAL:所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号。
TEXT:值为文本字符串,使用数据库编码存储(TUTF-8,UTF-16BE或UTF-16-LE)。
BLOB:值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改变格式。
DATA:包含了年份,月份,日期。
TIME:包含了小时,分钟,秒。
2.SQLiteDatabase的介绍
常用方法:
方法 | 释义 |
---|---|
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
insert(String table,String nullColumnHack,ContentValues values) | 插入一条记录 |
delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询一条记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
execSQL(String sql) | 执行一条SQL语句 |
close() | 关闭数据库 |
3.一步一步实现
3.1.创建一个继承在SQLiteOpenHelper的类
String sql = "create table if not exists " + TABLE_NAME + " (Version integer , Id integer primary key, CustomName text, OrderPrice integer, Country text)";
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// 调用时间:数据库第一次创建时onCreate()方法会被调用
// onCreate方法有一个 SQLiteDatabase对象作为参数,根据需要对这个对象填充表和初始化数据
// 这个方法中主要完成创建数据库后对数据库的操作
// create table Orders(Id integer primary key, CustomName text, OrderPrice integer, Country text);
sqLiteDatabase.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
// 调用时间:如果DB_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade
// onUpgrade方法的三个参数,一个 SQLiteDatabase对象,一个旧的版本号和一个新的版本号
// 这样就可以把一个数据库从旧的模型转变到新的模型
// 这个方法中主要完成更改数据库版本的操作
sqLiteDatabase.execSQL(sql);
onCreate(sqLiteDatabase);
}
3.2. 创建一个OrderDao用于处理所有的数据操作,在OrderDao中实例化OrderDBHelper
public class OrderDao {
public OrderDao(Context context) {
this.context = context;
ordersDBHelper = new OrderDBHelper(context, null, null, 0);
}
}
3.3.增/删/改/查
对于“增删改”这种对表内容变换的操作,我们需要先调用getWritableDatabase(),在执行的时候可以调用通用的execSQL(String sql)方法或对应的操作API:insert(),delete(),更新()。
而对“查”,需要调用getReadableDatabase(),这时就不能使用execSQL方法了,得使用查询()或rawQuery()方法
3.3.1增
a.首先填充一些数据
/**
* 初始化数据
*/
db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 1, 'Arc', 100, 'China')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 2, 'Bor', 200, 'USA')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 3, 'Cut', 500, 'Japan')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 4, 'Bor', 300, 'USA')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 5, 'Arc', 600, 'China')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 6, 'Doom', 200, 'China')");
db.setTransactionSuccessful();
b.增加一条数据:
/**
* 新增一条数据
*/
db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();
// insert into Orders(Id, CustomName, OrderPrice, Country) values (7, "Jne", 700, "China");
ContentValues contentValues = new ContentValues();
contentValues.put("Id", 7);
contentValues.put("CustomName", "Jne");
contentValues.put("OrderPrice", 700);
contentValues.put("Country", "China");
db.insertOrThrow(OrderDBHelper.TABLE_NAME, null, contentValues);
db.setTransactionSuccessful();
return true;
3.3.2 删
db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();
// delete from Orders where Id = 7
db.delete(OrderDBHelper.TABLE_NAME, "Id = ?", new String[]{String.valueOf(7)});
db.setTransactionSuccessful();
源码:
public int delete(String table, //表名
String whereClause,//删除条目判断
String[] whereArgs //删除位置
) {
acquireReference();
try {
SQLiteStatement statement = new SQLiteStatement(this, "DELETE FROM " + table +
(!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);
try {
return statement.executeUpdateDelete();
} finally {
statement.close();
}
} finally {
releaseReference();
}
}
3.3.3 改
db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();
// update Orders set OrderPrice = 800 where Id = 6
ContentValues cv = new ContentValues();
cv.put("OrderPrice", 800); //需要改的内容
db.update(OrderDBHelper.TABLE_NAME,
cv,
"Id = ?",
new String[]{String.valueOf(6)});//需要改的位置
db.setTransactionSuccessful();
3.3.4查
a.单数据查询:
db = ordersDBHelper.getReadableDatabase();
// select * from Orders where CustomName = 'Bor'
cursor = db.query(OrderDBHelper.TABLE_NAME,//table:表名称
ORDER_COLUMNS,//columns:列名称数组
"CustomName = ?", //selection:条件字句,相当于where
new String[] {name}, //selectionArgs:条件字句,参数数组
null, //orderBy:排序列
null, //having:分组条件
null);//orderBy:排序列
if (cursor.getCount() > 0) { //将cursor数据放到Order队列中
List<Order> orderList = new ArrayList<Order>(cursor.getCount());
while (cursor.moveToNext()) {
Order order = parseOrder(cursor);
orderList.add(order);
}
return orderList;
}
b.总数查询:
db = ordersDBHelper.getReadableDatabase();
// select count(Id) from Orders where Country = 'China'
cursor = db.query(OrderDBHelper.TABLE_NAME,
new String[]{"COUNT(Id)"},
"Country = ?",
new String[] {"China"},
null, null, null);
if (cursor.moveToFirst()) {
count = cursor.getInt(0);
}
c.比较查询:
db = ordersDBHelper.getReadableDatabase();
// select Id, CustomName, Max(OrderPrice) as OrderPrice, Country from Orders
cursor = db.query(OrderDBHelper.TABLE_NAME,
new String[]{"Version",
"Id",
"CustomName",
"Max(OrderPrice) as OrderPrice", "Country"},
null, null, null, null, null);
if (cursor.getCount() > 0){
if (cursor.moveToFirst()) {
return parseOrder(cursor);
}
}
附
结束
以上是关于笔记30 | 数据存储之SQLite的介绍及使用的主要内容,如果未能解决你的问题,请参考以下文章
Android :数据存储方案学习笔记之 SQLite数据库存储