Android 数据存储——数据查询query方法参数解析

Android SQLite数据存储的通用设计 SQLite用于存储一些数据量较多,结构比较复杂情况,使用的时候只需要实现SQLiteOpenHelper,在onCreate创建数据表,onUpgrade做升级处理 通过Helper实例对DB进行数据处理,例如,database = dbHelper.getWritableDatabase();  获取DB对象进行插入,更新,删除操作,dbHelper.getReadableDatabase( 阅读详情

参考链接:http://notfatboy.iteye.com/blog/653357

首先假设有如下表格,表格名称为:"Employees"


SQL基本格式如下:

select 列名称 from 表名称

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

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

各个参数的意义说明:
①table:表名称
②columns:列名称数组
③selection:条件字句,相当于where
④selectionArgs:条件字句,参数数组
⑤groupBy:分组列
⑥having:分组条件
⑦orderBy:排序列
⑧limit:分页查询限制

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

select FirstName, LastName from Employees

当然一般地会有条件的过滤,得到自己想要的结果,例如只想返回city为Beijing的人员信息,那么就需要用where来过滤:

select * from Employees where City= 'Beijing'
这里where后面跟的字符串就是Android的method中对应的参数String select。Android的method中通常还有个参数于此相关就是String[] selectionsArgs,当selection参数中包含问号" ?"时,那么selectionArgs才会用到。举个例子,假设selection参数赋值如下:
String selection = "City=?";
这时则必须在selectionArgs参数中赋值为如下:
String[] selectionArgs = {"Beijing"};
也就是说selectionArgs中的字符串就是对应selection中的问号所代表的变量。实际上就是让selection中的过滤添加City可以动态的赋值,而不是写死在程序中。在query()执行时会对selectionArgs中的字符串正确转义并替换到对应的?问号处以构成完整的selection字符串,有点想String.format()。

那么和显然参数String groupBy就是对应SQL语句中的GROUP BY后面的字符串,GROUP BY是与合计函数(Aggregate Functions)如SUM()一起使用的。

参数String having对应SQL语句HAVING后面的字符串,也是要与合计函数一起使用的

参数String orderBy对应SQL语句ORDER BY后面的字符串

参数limit指明返回的rows的数量


下面举个例子,假设有如下数据表,表名"Orders":


假设想查询客户总的订单在300元以上的,且County是city4的客户的名称,且安装CustomeName来排序,默认ASC排序,那么SQL语句应当是:

SELECT CustomerName, SUM (OrderPrice) FROM Orders WHERE Country=?
GROUP BY CustomerName
HAVING SUM (OrderPrice)>300
ORDER BY CustomerName
那么对应Android的query函数的参数如下:

String table =  "Orders" ;  
String[] columns = new  String[] { "CustomerName" ,  "SUM(OrderPrice)" };  
String selection = "Country=?" ;  
String[] selectionArgs = new  String[]{ "city4" };  
String groupBy = "CustomerName" ;  
String having = "SUM(OrderPrice)>300" ;  
String orderBy = "CustomerName" ; 


测试例子:

package com.example.query;

import android.os.Bundle;
import android.util.Log;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class MainActivity extends Activity {
	private SQLiteDatabase db;
	private MyDatabaseUtil databaseUtil;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        db = this.openOrCreateDatabase("Orders.db", Context.MODE_PRIVATE, null);
        databaseUtil = new MyDatabaseUtil(this, "Orders.db", null, 1);
        if (!databaseUtil.tabIsExist("Orders")){
        	db.execSQL("CREATE TABLE Orders (_id integer primary key autoincrement,CustomerName text,OrderPrice INTEGER,Country text,OrderDate data)");
        	ContentValues contentValues = new ContentValues();
        	for(int i=0;i<5;i++){
        		contentValues.put("CustomerName", "name"+ i);
        		contentValues.put("OrderPrice", 100 + 100*i);
        		contentValues.put("Country", "city"+ i);
        		//参数一:表名  参数二:空列的默认值   参数三:ContentValues类型的一个封装了列名称和列值的Map
        		//一行一行地插入
                db.insert("Orders", null, contentValues);
        	}
        }else {
        	Log.i("+++++++++++", "已经创建了,无需再创建");
        }
        
        String table =  "Orders" ;  
        String[] columns = new  String[] { "CustomerName" ,  "SUM(OrderPrice)" };  
        String selection = "Country=?" ;  
        String[] selectionArgs = new  String[]{ "city4" };  
        String groupBy = "CustomerName" ;  
        String having = "SUM(OrderPrice)>300" ;  
        String orderBy = "CustomerName" ;  
        Cursor c = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, null );
        c.moveToFirst();
	    while(!c.isAfterLast()){
	    	int index = c.getColumnIndex("CustomerName");
	        Log.d("SQLite", c.getString(index));
	        c.moveToNext();
	    }
    }
    
    public class MyDatabaseUtil extends SQLiteOpenHelper{

		public MyDatabaseUtil(Context context, String name,
				CursorFactory factory, int version) {
			super(context, name, factory, version);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void onCreate(SQLiteDatabase arg0) {
			// TODO Auto-generated method stub			
		}

		@Override
		public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
			// TODO Auto-generated method stub			
		}
		
		/**
         * 判断某张表是否存在
         * @param tabName 表名
         * @return
         */
        public boolean tabIsExist(String tabName){
                boolean result = false;
                if(tabName == null){
                        return false;
                }
                SQLiteDatabase db = null;
                Cursor cursor = null;
                try {
                        db = this.getReadableDatabase();//此this是继承SQLiteOpenHelper类得到的
                        String sql = "select count(*) as c from sqlite_master where type ='table' and name ='"+tabName.trim()+"' ";
                        cursor = db.rawQuery(sql, null);
                        if(cursor.moveToNext()){
                                int count = cursor.getInt(0);
                                if(count>0){
                                        result = true;
                                }
                        }
                        
                } catch (Exception e) {
                        // TODO: handle exception
                }                
                return result;
        }
    	
    }
    
}

打印信息:











【Mode】多模干涉仪的设计 Multi-mode interferometer(MMI) 与 Splitter 器件一样,MMI 器件也是一种常见的分光器件,可以根据用户的需求将光束分成不同的比例。本文,我们将介绍如何仿真 MMI 器件。这里我们使用的是 1x2 MMI,其本质上是由四个部分组成的,中间的矩形多模式干涉区域以及左右两侧的三个 taper 模式转换区域。之前的教程中我们也提及了,为了获取稳定的模式场分布,通常,我们需要进行模式收敛性扫描。这里以官网给出的案例为例。如何提取 S 参数我们先暂时不做介绍,后续有时间了我们再做介绍。 阅读详情

相关推荐

知识导航神器:Obsidian Breadcrumbs 插件全攻略

Parent: 插件Child: Breadcrumbs 用法这样,它就能识别出你和其他笔记的关系。

m0_73735578的博客 1628

Android数据库中查找一条数据 query方法详解

public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);  参数说明:  table:数据库表的名称  columns:数据库列名称数组 写入后最后返

chaozhung的专栏 3万+

Eigen 直线拟合/曲线拟合/圆拟合/椭圆拟合

使用Eigen库进行直线拟合是数据分析和科学计算中的常见任务,主要通过最小二乘法实现。该代码演示了二维空间中的直线拟合,输出斜率和截距。

深之JohnChen的专栏 1589

Android 数据查询query函数参数解析

<br />转自:http://notfatboy.iteye.com/blog/653357<br />首先我们假设我们有如下表格,表格名称“Employees”:<br /> IdLastNameFirstNameAddressCity1AdamsJohnOxford StreetLondon2BushGeorgeFifth AvenueNew York 3CarterThomasChangan StreetBeijing<br /> <br />SQL基本格式如下:Sql代码  SELECT 列名称 

scorplopan的专栏 8万+

【KITTI数据集中Raw_Data数据标定文件中的参数关系解读】

上一节本人将KITTI Odometry数据集中的参数文件进行了解释。本节主要针对一些做融合slam的人,将Raw_Data数据标定文件中的参数按照自己的理解做如下阐述。其中,所讲之处如有错误,欢迎各位批评指正。

weixin_43389152的博客 1526

Windows Server远程桌面断开后,PyWinAuto/按键精灵脚本失效?试试这个‘会话保持’的终极配置

本文深入解析Windows Server远程桌面断开后导致PyWinAuto/按键精灵脚本失效的问题,提供会话保持的终极配置方案。通过转换到控制台会话(console模式)和调整组策略,确保自动化程序在断开连接后持续稳定运行,适用于Windows Server各版本。

weixin_28738165的博客 227

Android--SQLite数据库操作(两种方式)

目录 一、使用SQLiteOpenHelper操作数据库 1、数据库的创建: 2、升级数据库: 2、创建/拿到数据库对象: 3、增删改查CRUD 添加数据(insert): 修改数据(upgrade): 删除数据(delete): 查询数据(query): 注意: 最后:如果想直接用SQL干的话,看...

qq_45930942的博客 2680

从零开始:使用Mask2Former训练你的专属数据集

本文详细介绍了如何从零开始使用Mask2Former训练自定义数据集。内容涵盖环境搭建、数据准备(将LabelMe格式转换为COCO格式)、数据集注册与模型配置、训练启动与调试,以及最终的模型推理与应用。通过实战步骤和常见问题解决方案,帮助读者掌握使用Mask2Former进行实例分割的核心流程,实现专属模型的训练与部署。

weixin_28678151的博客 444

Android自带SQLite数据库查询语句query的用法

金证职考 2017-02-26 19:39 今天在调试APP的时候,用到了SQLite的query 查询语句,去年编码时间紧没认真琢磨query的用法,当时用到query时为了省事省时直接用下面的: Cursor cursor = db.query(tableName,null,null,null,null,null,null); 好在系统小功能简单数据量小,系统和数据占内存少没有明显的影响

u011277123的博客 3万+

科研党必备!用Requests+BeautifulSoup升级版Nature爬虫(含PDF下载功能)

本文介绍了一套基于Python Requests和BeautifulSoup的Nature期刊智能爬虫系统,专为科研人员设计,可自动抓取论文标题、摘要及开放获取的PDF文档。系统采用模块化设计,包含请求管理、PDF检测和邮件通知等功能,确保高效合规地获取学术资源,提升科研效率。

weixin_29041767的博客 254

拿下华为性格测试!

华为性格测试指南

weixin_41171614的博客 5262

android query参数,安卓ContentResolver的query参数说明

原形:public final [Cursor]() query ([Uri]() uri, [String[]]() projection,[String]() selection,[String[]]() selectionArgs, [String ]()sortOrder)第一个参数:指定内容提供者的Uri地址,比如需要查询联系人信息cr.query(ContactsContract.Co...

weixin_42102634的博客 979

Ultralytics 框架中 model.predict() 返回的 results 对象的详细解析

通过掌握 results 对象的使用方法,您可以快速实现模型部署、数据分析与可视化。

浩瀚之水的专栏 747

android中数据存储的contentprovider的使用方法

元数据接口 package com.example.contentproviderprojecrt; import android.net.Uri; import android.provider.BaseColumns; public interface MLDNbatabaseMetaData { //外部访问,content地址://com.example.contentprovi

李元静 2185

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Flutter mongo_dart_query鸿蒙适配与离线数据查询实践

在跨平台移动开发中,数据库查询是核心基础能力之一。MongoDB风格的查询语法因其灵活性和表达力,成为处理复杂数据检索的主流方案。mongo_dart_query作为Flutter生态中的重要组件,通过模拟MongoDB查询操作符(如$eq、$in等)和聚合管道,为Dart应用提供了类型安全的查询构建能力。随着鸿蒙操作系统的普及,该库的鸿蒙化适配解决了线程模型、存储访问等平台差异性问题,使开发者能在鸿蒙设备上实现高效的离线数据查询。这种能力特别适合需要本地复杂数据处理的场景,如离线优先应用、边缘计算等,其中

weixin_30889885的博客 304

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【数据存储】数据查询与Cursor接口(4)

Cursor接口就非常类似于在JDBC中的Result接口,也是用于进行数据的结果接收的。 ※当android程序需要进行数据检索操作时,需要保存全部查询结果,而保存查询结果就是可以使用android.database.Cursor接口完成,且可以完成对结果集随机读写访问的操作。 下面使用Cursor接口并结合SQLiteDatabase类完成数据查询操作,所有...

dianwei5413的博客 339

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用query()方法进行模糊查询

在main.xml中:       android:id="@+id/mylayout"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:orientation="vertical"     android:gravity="center_hor

Android人生 6378

一起Talk Android吧(第二百三十回:Android中的数据存储之数据库五)

各位看官们大家好,上一回中咱们说的是Android中数据存储之数据库的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,我们在上一章回中介绍了如何在数据库中删除数据,这一回中我们将介绍如何在数据库中查询数据。查询数据需要使用SQLiteDatabase类的query方法,其函数原型如下: public Cursor query (String table, String[] columns, String selection,

talk_8的专栏 187

Android数据存储之SQLite的操作

  Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储。然而SQLite作为一个轻型的关系型数据库,基于其轻量、跨平台、多语言接口及安全性等诸多因数考虑,因而Android较大的数据存储采用了SQLite。SQLite与大多数关系型数据库一样都遵循ACID,语法也非常相似。只要您懂得mysql、sqlserver等关系型数据库的操作,只要查看下SQLite的官方文档便可快速...

weixin_33913377的博客 123

Android的数据存储形式

数据持久化技术数据持久化就是将那些在内存中的瞬时数据保存到存储设备中,保证手机或电脑在关机状态下,这些数据仍然不会丢失。Android 系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、SharedPreference 存储以及数据库存储。 文件存储是Android最基本的数据存储方式,也就是常说的I/O存储,它不对存储的内容进行任何格式化处理,所有的数据都是原封不动的保存到文件中,

sin574的博客 319

Android基础之十四数据存储 之 SQLite数据库详解

Android基础之十四数据存储 之 SQLite数据库详解 SQLite 是一款 轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用。 SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID( 原子性(Atomicity) 、一致性(Consistency) 、 隔离性(Isolation) 、 持久性(Du...

zhupengqq的博客 254

android query 模糊查询

package com.example.utils; import java.util.ArrayList; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android....

weixin_30410999的博客 133

Android之旅十二 Android中的SQLite数据存储及单元测试

android中的另一种存储方式就是使用sqlite,SQLite是一个嵌入式数据库引擎,针对于内存资源有限的设备提供一种高效的数据库引擎,它不像我们的mysql、sqlserver、oracle等数据库,它没有服务器进程,所有的内容包含在同一个单文件中,该文件是跨平台的,可以自由复制,下来带大家来进入我们的学习旅程吧! 我们在进行sqlite操作数据的时候,使用...

weixin_33877092的博客 278

android数据存储之数据库存储技术

android 数据库存储基础

buniaowanfeng 514

安卓连接mysql代码_用Eclipse开发android,怎么连接到数据库,最好有详细程序代码...

展开全部Android 连接数据库Android采用关系型数据库SQLite3,它是一个支持SQL轻量级的嵌入式数据库,在嵌入式操作上有很广泛的32313133353236313431303231363533e58685e5aeb931333262383531,WM采用的也是SQLite3关于过于、原理方面的东西在这篇文章里不会提到,但是如果你想能够快速的学会操作SQLite3,那这就是你要找的文...

weixin_36438028的博客 911

Android平台下的数据库SQLite

1、SQLite的基本信息:       http://baike.baidu.com/view/19310.htm 2、SQLite的应用详解:       http://blog.csdn.net/liuhe688/article/details/6715983 3、SQLite的存储方式:       http://www.sqlite.com.cn/MySqlite/4/565.

狼牙 636
上一篇: Android 数据存储——SQLite实例、判断数据库中表是否存在
下一篇: knx 协议入门
林知共创
博客等级 码龄15年 3435粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值