`

【Android】Content Provider基础之SQL

阅读更多

    这篇文章是Content Provider系列的第二篇,最近由于事务繁忙(给自己找个理由)没能更新博客,罪过啊。不说废话,进入正题。
    由于Content Provider的实现大都是通过数据库的方式实现的,因此在搞清楚CP之前,首先要弄明白数据库语言SQL。Android平台上使用的数据库管理系统是SQLite,该系统不用我介绍了吧,知名,非常的知名,很多嵌入式系统都在用。有兴趣的朋友可以上他们的官网看看,有很多有用的信息:[url]http://www.sqlite.org/docs.html [/url]
SQLite使用的SQL语言与标准的SQL语言大体是相同的,所以我想先回顾下SQL语言的用法。
首先我们假设我们有如下表格,表格名称“Employees”:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing



SQL基本格式如下:

SELECT 列名称 FROM 表名称  


最基本SQL语句,就是从表中选取要返回的列数据,不加任何过滤条件。当然如果我们的“列名称”是"*",那么将返回整个表格数据。在Android上,SQL相关的method通常有一个参数就是String[] columns,而这个参数对应的就是SQL语句中的“列名称”。我们可以看一个Android中的method - query:

public Cursor   query  (String table, String[] columns, String selection, String[] selectionArgs,   
String groupBy, String having, String orderBy, String limit)  



假设我们想获取人员的全名,那么SQL语句如下:

SELECT FirstName, LastName FROM Employees  


当然一般地我们会有条件的过滤我们想要的结果,例如我只想返回city为Beijing的人员信息,那么我就需要用WHERE来过滤:
Sql代码 

SELECT * FROM Employees WHERE City='Beijing'  


这里where后面跟的字符串就是Android的method中对应得参数String selection。Android的method中通常还有个参数与此相关就是 String[] selectionArgs。偶最开始一直没有弄明白这个参数是干啥用的,后来才逐渐明白了这个参数实际上是跟selection参数密不可分的。当selection参数中包含问号"?"时,那么selectionArgs才会用到。举个例子假设selection参数赋值如下:

String selection = ”City=?";  


这时我们必须在selectionArgs中赋值

String[] selectionArgs = {"Beijing"};  


也就是说selectionArgs中的字符串就是对应selection中的问号所代表的变量。实际上就是让selection中的过滤条件City可以动态的赋值,而不是写死在程序当中。
那么很显然参数String groupBy就是对应SQL语句中GROUP BY后面的字符串,GROUP BY是与合计函数(Aggregate Functions)如SUM()一起使用的。详细的用法大家可以从网上查查。
参数String having对应SQL语句HAVING后面的字符串,也是要与合计函数一起使用的。
参数String orderBy对应SQL语句ORDER BY后面的字符串。
参数limit指明返回的rows的数量。
我们下面举个例子,假设有如下数据表,表名"Orders":
Id CustomerName OrderPrice Country OrderDate
1 Arc 100 China 2010-1-2
2 Bor 200 USA 2010-3-20
3 Cut 500 Japan 2010-2-20
4 Bor 300 USA 2010-3-2
5 Arc 600 China 2010-3-25
6 Doom 200 China 2010-3-26


假设我们想查询客户总的订单数在500元以上的,且County在中国的客户的名称和订单总数,且按照CustomerName来排序,默认ASC排序,那么SQL语句应当是:
 

SELECT CustomerName, SUM(OrderPrice) FROM Orders WHERE Country=?   
GROUP BY CustomerName   
HAVING SUM(OrderPrice)>500  
ORDER BY CustomerName  


那么对应Android的query函数的参数如下:

String table = "Orders";  
String[] columns = new String[] {"CustomerName", "SUM(OrderPrice)"};  
String selection = "Country=?";  
String[] selectionArgs = new String[]{"China"};  
String groupBy = "CustomerName";  
String having = "SUM(OrderPrice)>500";  
String orderBy = "CustomerName";  
Cursor c = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, null); 

 
查询的结果应该是:

CustomerName SUM(OrderPrice)
Arc 700



OK,通过上述例子,大家应该很清楚怎么在Android中使用SQL了,之后我会更详细的介绍Android中相关的类和Method。






 

分享到:
评论

相关推荐

    ContentProvider

    <provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:multiprocess="true" android:exported="true" android:permission="com.example.tigongzhe.permission" ...

    Android代码-ContentProviderHelper

    Content Provider Helper ... is a frontend to discover/view/query data of android content providers. Original repository : Copyright (c) 2014-2016 Jens Driller under MIT license Improvements in this ...

    老罗android开发视频教程全集百度网盘下载

    Android基础阶段:平台架构特性(JAVA/C) Market/应用程序组件 环境搭建与部署/打包与发布 AVD/DDMS/AAPT 调试与测试 相关资源访问/资源制作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及...

    contentprovider

    在Content Provider中使用的查询字符串有别于标准的SQL查询 很多诸如select add delete modify等操作我们都使用一种特殊的URI来进行 这种URI由3个部分组成 “content: ” 代表数据的路径 和一个可选的标识数据的ID ...

    详解Android中一些SQLite的增删改查操作

    在Android,数据都是么私有的,要实现数据共享,正确方式是使用Content Provider。 SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为...

    Android开发资料合集-World版!

    2.4、CONTENT PROVIDER 35 3、ANDROID UI LAYOUT 35 3.1、概述 35 3.2、线性布局(LINEAR LAYOUT) 36 3.3、相对布局(RELATIVE LAYOUT) 39 3.4、TABLELAYOUT 40 3.5、ABSOLUTELAYOUT 47 4、ANDROID UI 控件 48 4.1...

    contentProvider,sqlit例子

    android数据库存储的综合例子,可以通过这个Dome很好的学习一下android数据库的存储方式

    Android 开发技巧

    2.4、CONTENT PROVIDER 35 3、ANDROID UI LAYOUT 35 3.1、概述 35 3.2、线性布局(LINEAR LAYOUT) 36 3.3、相对布局(RELATIVE LAYOUT) 39 3.4、TABLELAYOUT 40 3.5、ABSOLUTELAYOUT 47 4、ANDROID UI 控件 48 4.1...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

Global site tag (gtag.js) - Google Analytics