Android数据存储(三)——SQLite
如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在Android上,则为SQLlite。
SQLite的特点:轻量级、嵌入式的、关系型数据库。可移植性好,易使用,小,高效且可靠,与使用它的应用程序共用一个进程空间。
SQLite的缺点:不支持外键,需要手动利用触发器控制。
我们先简单的进行SQLite的操作学习:
9.3.1 数据库的创建和使用
1. SQLite的创建
openOrCreateDatabase
openOrCreateDatabase("mydatabase.db",
SQLiteDatabase.CREATE_IF_NECESSARY,null);
代码片段9.3.1.1 SQLite数据库创建
注释:创建返回值为SQLiteDatabase,通过这个类,可以进行一系列的数据库操作,包括增删改查。
2. SQLite执行SQL
SQLite可以直接执行SQL语句,不过它必须是执行语句,而非查询语句,因为它不会返回任何结果。
this.sqLiteDatabase.execSQL(SQLStr.CREATE_USER_TABLE);
代码片段9.3.1.2 执行SQL创建表
注释:SQLStr.CREATE_USER_TABLE为数据库的建表语句:
public static final String CREATE_USER_TABLE ="CREATETABLE user (id INTEGER PRIMARY KEY,name TEXT NOT NULL)";
代码片段9.3.1.3 SQL建表语句
3. 外键约束
这个是重点需要注意的,因为SQLite(3.6.19)并不支持外键。所以,在使用外键的时候,必须要注意,需要手动创建触发器,在增加、修改、删除这三种情况下,执行定义的外键触发器才行。
因为在Android2.3左右,使用的sqlite为3.6.19以上版本,也就是它会支持外键约束,所以这里的通过触发器来自定义外键就不再描述。
4. 增加记录
对于想表中增加数据,我们是通过建立一个ContentValues的对象,将需要插入的数据字段名和值进行配对写入。
ContentValues values = new ContentValues();
values.put("id", 1);
values.put("name", "admin");
this.sqLiteDatabase.insert("user",null, values);
代码片段9.3.1.4 增加语句
注释:insert语句有三个参数,分别代表为表名、values某列为空时插入的值、传入的列与值。
5. 更新记录
对于需要表中需要修改的数据,只需要将对应的列和修改后的值,保存到ContentValues就行。
ContentValues contentValues = new ContentValues();
contentValues.put("name", "guest");
this.sqLiteDatabase.update("user", contentValues,"id=?", new String[]{"1"});
代码片段9.3.1.5 更新语句
注释:update有四个参数,分别对应为表明、需要更改的键值对、where字段、where字段对应的值
6. 删除记录
删除的操作也是类似。
this.sqLiteDatabase.delete("user","id=?", new String[]{"1"});
代码片段9.3.1.6 删除语句
7. 查询记录
查询是通过query这个方法来进行,这个方法会返回一个游标Cursor。
while(cursor.moveToNext()){
String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
String name =cursor.getString(cursor.getColumnIndex("name"));
}
代码片段9.3.1.7 查询语句
注释:上述就是一个简单的查询,通过游标的移动判断是否存在下一个,之后通过列名查得列号,再根据列号来获取该次循环所对应的列值。记住,每次查询完毕都需要关闭cursor,即cursor.close()
一般查询的参数如下(由左向右):
参数 |
描述 |
备注 |
[String] |
执行查询的表名称 |
|
[String Array] |
返回的列名称的列表 |
可以使用null,表示全部返回 |
[String] |
WHERE子语句 |
可以使用null,即无条件查询,用“?”表示查询参数 |
[String Array] |
查询参数的值 |
当查询子语句为null时,必须为null |
[String] |
GROUP BY子句 |
null表示无分组 |
[String] |
HAVING子句 |
当GROUP BY为null时,必须为null |
[String] |
ORDER BY子句 |
如果为null,则表示使用默认排序 |
[String] |
LIMIT子句 |
为null,则表示无限制 |
表9.3.1 查询语句参数表
8. 复杂查询
注意:对于复杂的查询,有一下两种方法,一种是通过SQLiteQueryBuilder类构建复杂查询;另一种是通过rawQuery执行原生sql语句查询。相对来说,rawQeruy的查询比SQLiteQueryBuilder简单
SQLiteQueryBuilder:
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables("user, info");
builder.appendWhere("user.info=info.id");
String[] returnColumns = {
"user.id",
"user.name",
"info.sex"
};
String sortOrder = "user.id ASC";
Cursor cursor = builder.query(this.sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);
StringBuffer buffer = new StringBuffer();
while(cursor.moveToNext()){
String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
String name =cursor.getString(cursor.getColumnIndex("name"));
String sex =cursor.getString(cursor.getColumnIndex("sex"));
buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+"\r\n");
}
result.setText(buffer);
cursor.close();
代码片段9.3.1.8 SQLiteQueryBuilder语句
注释:query的参数如下:
参数 |
描述 |
备注 |
[SQLiteDatabase] |
数据库 |
用来查询的数据库实体 |
[String Array] |
返回的列名数组 |
|
[String] |
WHERE 子句 |
查询条件 |
[String Array] |
选择条件对应的值 |
在条件为null是,必须为null |
[String] |
GROUP BY子句 |
null表示无分组 |
[String] |
HAVING子句 |
当GROUP BY为null时,必须为null |
[String] |
SORT ORDER |
排序字段 |
表9.3.2 query的参数表
rawQuery:
public static final String RAW_COMPLEX_QUERY ="SELECTuser.id,user.name,info.sex FROM user,info "
+ "WHEREuser.id=info.id ORDER BY user.id asc";
代码片段9.3.1.9 原生查询语句
Cursor cursor = this.sqLiteDatabase.rawQuery(SQLStr.RAW_COMPLEX_QUERY,null);
StringBuffer buffer = new StringBuffer();
while(cursor.moveToNext()){
String id =
String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
String name =cursor.getString(cursor.getColumnIndex("name"));
String sex =cursor.getString(cursor.getColumnIndex("sex"));
buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+"\r\n");
}
result.setText(buffer);
cursor.close();
代码片段9.3.1.10原生SQL调用语句
注释:rawQuery的参数如下:
参数 |
描述 |
备注 |
[String] |
SQL语句 |
|
[String Array] |
WHERE ARGS |
条件查询对应的值 |
表9.3.3 rawQuery参数
9.3.2 View中绑定数据
上述了解了如何进行数据查询,现在可以通过Adapter适配器来进行数据的捆绑,让其在View中展示,而不是如上只是简单的显示。
SQLiteQueryBuilder builder = newSQLiteQueryBuilder();
builder.setTables("user, info");
builder.appendWhere("user.info=info.id");
String[] returnColumns = {
"user.id as _id",
"user.name",
"info.sex"
};
String sortOrder = "user.id ASC";
Cursor cursor = builder.query(sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);
startManagingCursor (cursor);
ListAdapter adapter = new SimpleCursorAdapter (this, R.layout.activity_listitem, cursor,
new String[]{"_id","name","sex"},
new int[]{R.id.item_id,R.id.item_name,R.id.item_sex});
this.listView.setAdapter(adapter);
代码片段9.3.2.1 view中绑定数据
注释:基本的查询在上面已经描述过,在绑定到Adapter适配器的时候,需要注意必须要有一个_id列,如果没有,可以通过别名将主键映射为_id
案例:
Android数据存储(三)——SQLite的更多相关文章
- Android数据存储:SQLite
Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...
- Android数据存储之SQLite数据库
Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...
- Android开发手记(18) 数据存储三 SQLite存储数据
Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...
- 【转载】Android数据存储之SQLite
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...
- android数据存储之Sqlite(二)
SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...
- Android数据存储之SQLite的操作
Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...
- Android数据存储之SQLite使用
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...
- Android 数据存储之 SQLite数据库存储
----------------------------------------SQLite数据库---------------------------------------------- SQLi ...
- android数据存储之Sqlite(一)
SQLite学习笔记 1. Sqlite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...
随机推荐
- Mysql 数据库安装配置
MySQL的多种安装方法 在当今的互联网企业,Mysql数据服务几乎都是运行在LINUX系统操作系统上,当然你也可以在WINDOWS.UNIX等商业操作系统上运行. 但是一般企业都会采用LNMP.LA ...
- WinForms 实现气泡提示窗口
[实例说明] 气泡提示因为他的美观又好被大多数用户所接收,用户所喜爱的就是程序员要实现的. 本实例实现了任务栏气泡提示,运行本实例,效果图如下所示: 单击提示.气泡提示就会显示,单击“关闭”气泡又会消 ...
- Winform DataGridView添加列头checkbox
using System; using System.Data; using System.Drawing; using System.Windows.Forms; using Yanwen.Logi ...
- 使用CSS修改HTML5 input placeholder颜色( 转载 )
问题:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: input[placeholder], [placeholder], *[placeholder] ...
- dive into python 读笔(2)
chapter 4 自省, summary: # 用可选和命名参数定义和调用函数 # 用 str 强制转换任意值为字符串形式 # 用 getattr 动态得到函数和其它属性的引用 # 扩展列表解析语法 ...
- H2嵌入式数据库的各种连接方式
H2database是一款用java语言编写的开源数据库, 一般用作游戏的数据存储, 当然web项目也是可以用的, web项目也可以将该数据库 首先要安装H2数据库 http://www.h2data ...
- JSP内置对象详解
jsp中内置对象:request.response.session.applecation.out.pagecontesx.config.page.exception.cookie 1.request ...
- C#中结构体与字节流互相转换
1.定义与C++对应的C#结构体 在c#中的结构体不能定义指针,不能定义字符数组,只能在里面定义字符数组的引用. C++的消息结构体如下: //消息格式 4+16+4+4= 28个字节 struct ...
- 1206: [HNOI2005]虚拟内存 - BZOJ
Description 操作系统中一种重要的存储管理技术就是虚拟内存技术.操作系统中允许进程同时运行,也就是并行.每个进程都有其相对独立的数据块(进程运行的过程中将对其进行读写操作).理想的情况下,这 ...
- C#学习笔记(一)
1.cmd运行devenv启动VS. 2.解决方案:公司 项目:部门 类:员工 3.右边的解决方案管理器:会自动隐藏,想让他固定的话,就点击关闭按钮中间的“自动隐藏”:可以拖动到上下左右,当出现阴影的 ...