如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在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

案例:

AndroidStudy_Database

Android数据存储(三)——SQLite的更多相关文章

  1. Android数据存储:SQLite

    Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...

  2. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  3. 【转载】Android数据存储之SQLite

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

  4. android数据存储之Sqlite(二)

    SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...

  5. Android数据存储之SQLite的操作

    Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...

  6. Android数据存储之SQLite使用

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

  7. Android 数据存储之 SQLite数据库存储

    ----------------------------------------SQLite数据库---------------------------------------------- SQLi ...

  8. android数据存储之Sqlite(一)

    SQLite学习笔记 1. Sqlite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...

  9. 【Android 应用开发】Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

  10. Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

随机推荐

  1. 【完全开源】微信客户端.NET版

    目录 说明 功能 原理步骤 一些参考 说明 前两天比较闲,研究了一下web版微信.因为之前看过一篇博客讲微信web协议的,后来尝试分析了一下,半途中发现其实没什么意义,但又不想半途而废,所以最后做出了 ...

  2. ubuntu中搭建php7+mongodb方法

    首先照着这篇文章操作 http://blog.csdn.net/Toshiya14/article/details/51417076 结果发现一直报Cannot find OpenSSL's libr ...

  3. 通过刷bios的方式在win8.1平板上启动windows phone模拟器

    最近买了个Windows8.1平板电脑,不是Surface Pro,太贵,而是国产的乐凡F2(64G.4G内存),CPU是赛扬U1037.最开始安装Visual Studio2013以及其他开发工具都 ...

  4. php yield

    php中关于 yield 关键字的介绍[点击查看] <?php function gen_one_to_three() { for ($i = 1; $i <= 3; $i++) { // ...

  5. Python urllib和urllib2模块学习(三)

    build_opener()详解: 1.urllib2.urlopen()函数不支持验证.cookie或者其它HTTP高级功能,要支持这些功能,必须使用build_opener()函数创建自定这句话的 ...

  6. apue学习记录——配置apue.3e,实现P4‘ls例子

    #include"apue.h" #include<dirent.h> int main(int argc,char *argv[]) { DIR *dp; struc ...

  7. Lintcode93-Balanced Binary Tree-Easy

    93. Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, ...

  8. [Python][小知识][NO.3] Python 使用系统默认浏览器打开指定URL的网址

    1.前言 一般用到的地方: GUI交互界面下,单击某个按钮实现打开指定网址. 某帮助菜单项目,需要跳转网页显示时. O.O 某XX程序,需要植入网页弹窗广告时... 2.方法 调用 webbrowse ...

  9. PHP-问题处理Fatal error: Uncaught Error: Call to undefined function simplexml_load_file()

    1.问题 今天重新安装了ubuntu,PHP,MySQL,Apache,到测试CMS项目时发生一个错误: Fatal error: Uncaught Error: Call to undefined ...

  10. Vuejs自定义全局组件--loading

    不管是使用框架,还是不使用任何的框架,我们都不可避免的需要与“加载中……”打交道,刚刚学习了Vuejs自定义组件的写法,就现学现卖,介绍一下吧! 先看一下目录结构,一般情况下,每一个组件都新建一个新的 ...