当前位置: 首页 > 编程日记 > 正文

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

案例:

AndroidStudy_Database

转载于:https://www.cnblogs.com/james1207/p/3265447.html

相关文章:

3GPP组织和协议概述

3GPP组织概述 1. TSG/WG 3GPP是以工作组开展工作的,目前有3个大的技术规范组:RAN, SA, CT, 这一级别的工作组英语写为 TSG (Technical Specification Group)。每个TSG下面又分了很多工作组(WG: work group). 详见下表: https://www.3gpp.or…

mysql被拖垮_说几个拖垮系统的小细节!

本文首发于个人微信公众号《andyqian》,期待你的关注!前言有好几天没有更新了,期间确实比较忙些,以至于周末也没休息。在这期间,感触还是蛮深的。现在碎片化的想法等整理好后,再以文章的形式分享出来。今天要说的是另外…

为 区域添加 Tag

tagsinput selectTag 转载于:https://www.cnblogs.com/yunqianduan/p/4740902.html

android中文字中间有超链接的实现方法

1.XML里写&#xff1a; <resources> <string name"ACCOUNT_REGISTER_PROMPT_AGREEMENT">点击注册&#xff0c;表示同意<a href"http://www.ouragreement.com">服务协议</a></string> </resources> <TextView …

4.4 类型转换

from http://www.learncpp.com/cpp-tutorial/44-type-conversion-and-casting/ 类型隐式转换 类型隐式转换的步骤如下所示&#xff1a; Long double (highest)DoubleFloatUnsigned long intLong intUnsigned intInt (lowest) 最底层是int而不是short或是char&#xff0c;是因为…

LFSR 和 m序列

翻译自&#xff1a;sharetechnote: LFSR LFSR Linear Feedback Shift Register - 线性反馈移位寄存器 LFSR 是一种移位寄存器电路&#xff0c;其中两个或多个中间步骤的输出线性组合并反馈到输入值&#xff0c;这就是为什么它被称为线性反馈移位寄存器的原因。 该电路具有以…

python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python

一、描述给你一个链表数组&#xff0c;每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。示例 1&#xff1a;输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]]输出&#xff1a;[1,1,2,3,4,4,5,6]解释&#xff1a;链表数组如下&…

Qt界面风格设置

每个widget都可以设置风格setStyle(QStyle style)对QApplication设置QStyle即对所有QApplication::setStyle(QStyleFactory::create("Fusion"));其他widget如过没有被设置QStyle&#xff0c;默认使用QApplication的QStyle主要可重写接口绘制复杂控件virtual void …

树莓派练习程序(蜂鸣器)

蜂鸣器模块如下图&#xff1a; 树莓派的引脚如下图&#xff1a; 我们将Vcc引脚连接物理接口1&#xff08;注意这里需要用3.3v&#xff09;&#xff0c;I/O引脚连接物理接口40&#xff0c;GND引脚连接物理接口39。 实物连接如下图&#xff1a; 编程使用WiringPi库&#xff0c;使…

Gold Code,Gold Sequence

Gold Code Gold Code是以Robert Gold的名字命名的。它是一组特殊的二进制随机(伪随机)序列&#xff0c;其中成员序列之间的相关性很小。由于这种特性(较小的相关性)&#xff0c;它被广泛地用作各种无线通信系统的扰码。 我们可以非常简单地利用 m序列 来生成Gold Code: 选择两…

【PHP高效搜索专题(1)】sphinxCoreseek的介绍与安装

我们已经知道mysql中带有"%keyword%"条件的sql是不走索引的,而不走索引的sql在大数据量大并发量的时候,不仅效率极慢还很有可能让数据库崩溃.那我们如何通过某些关键字来搜索我们想要的文章呢? 虽然mysql的MYISAM提供全文索引,但是只支持中文,并且性能却不敢让人恭维…

java 开源sns_JEESNS V1.0发布,JAVA 开源 SNS 社交系统

JEESNS V1.0 发布了&#xff0c;本次更新内容&#xff1a;增加后台管理员授权与取消功能增加私信模块解决在微博页面&#xff0c;左侧微博点赞过后&#xff0c;左侧展示列表小手会变黑&#xff0c;但是右侧热门出小手依然是白色修复后台添加栏目、文章成功后&#xff0c;提示页…

Balanced Binary Tree leetcode java

题目&#xff1a;Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 题解&#xff1a;采用递归…

leaflet地图框架

leaflet 中文API LeafLet js 官网&#xff1a; http://leafletjs.com/index.html LeafLet js 官网demo&#xff1a; http://leafletjs.com/examples.html LeafLet js 官网API&#xff1a; http://leafletjs.com/reference-1.3.0.html L.Map API各种类中的核心部分&#xff0c;用…

NR:UE初始搜网流程

UE的初始搜网流程&#xff0c;PSS->SSS->PBCH->RMSI.我画了一个简单的流程图如下&#xff0c;里面标注了每个环节的重点。 UE的初始搜网流程: 分为SSB同步(包括MIB读取)和RMSI的读取。 1. SSB SSB包括&#xff1a; PSS,SSS,PBCH. UE 在GSCN频点上&#xff0c;搜索…

纯CSS3制作的圆角效果按钮菜单

<!DOCTYPE html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>纯CSS3制作的圆角效果按钮菜单丨曲阳雕塑</title> <style type"text/css"> nav{display: block; wid…

java 左右键_js 区分鼠标左右键点击

oncontextmenu 是右键事件但是滚轮事件并没有获取到, 使用vue可以用middle获取Title.box {width: 200px;height: 200px;background: deepskyblue;}let div document.getElementById(app)div.oncontextmenu function (e) {e.preventDefault();console.log(右键, e.button)};d…

面向对象设计领域的OCP原则

一、OCP简介&#xff08;OCP--Open-Closed Principle &#xff09;&#xff1a;Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification。软件实体应当对扩展开放&#xff0c;对修改关闭&#xff0c;即软件实体应当在不…

Python教学课程分享9-面向对象编程

面向对象程序设计的思想主要是针对大型软件设计而提出的&#xff0c;它的一个关键性观念是将数据以及对数据的操作封装在一起&#xff0c;组成一个相互依存、不可分割的整体&#xff0c;即不同对象之间通过消息机制来通信或者同步。对于相同类型对象进行分类、抽象后&#xff0…

UE capability与 双连接相关的参数。

UE capability 分为 Network capability 和 Radio capability, 即网络能力和无线能力。 Netowrk Capability UE 在做Attach Request 时会主动上报自己的网络能力&#xff1b;Radio Capability 网络侧下发Enquiry Capability来请求UE无线能力&#xff0c;UE 回复capability inf…

Linux下Tomcat的安装配置

Linux下Tomcat的安装配置 一.下载安装对应的jdk,并配置Java环境。 官网下载地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html 下载将jdk加压后放到/usr/local目录下&#xff1a; [rootmaster ~]#chmod 755 jdk-6u5-li…

python登录代码思路_用python登录Dr.com思路以及代码分享

用python登录Dr.com思路以及代码分享发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递Python编程语言Python 是一种面向对象、解释型计算机程序设计语言&#xff0c;由Guido van Rossum于1989年底发明&#xff0c;第一个公开发行版发行于1991年。Python语法…

postgresql开发中可能有用的知识

2019独角兽企业重金招聘Python工程师标准>>> postgresql手册 一、PostgreSQL中可以直接对时间进行加减运算&#xff1a; 查询系统当前时间&#xff1a; select now();或者select current_timestamp;SELECT now()::timestamp 1 year; --当前时间加1年SELECT now():…

css实现 textarea 高度自适应

此textarea非彼textarea &#xff0c;有经验的老司机们应该知道html标签contenteditable这个属性。 利用此属性使当前的标签成为可以输入的状态&#xff0c;等同于输入框。 演示地址&#xff1a;https://xibushijie.github.io/static/textareaHeihgAuto.html <!DOCTYPE html…

LTE PUCCH Format1

PUCCH 格式 1/1a/1b 是向eNodeB传递1或2或4位数据。 这个过程相当复杂&#xff0c;我们用如下3个章节来描述&#xff1a; PUCCH Format 1,1a,1b 所在RB位置PUCCH F1信号的生成PUCCH 多UE 复用 PUCCH Format 1,1a,1b 所在RB位置 LTE中有很多课题(尤其是物理层)&#xff0c;如…

innodb force recovery

innodb force recovery的6种设置&#xff1a; 1.innodb force recovery1&#xff0c;即使发现了损坏页面也继续让服务器继续运行&#xff0c;这个选项对于备份或者转存当前数据尤为有用2.innodb force recovery2&#xff0c;阻止恢复主线程的运行&#xff0c;如果清除操作会导致…

随机森林 java_机器学习weka,java api调用随机森林及保存模型

工作需要&#xff0c;了解了一下weka的java api&#xff0c;主要是随机森林这一块&#xff0c;刚开始学习&#xff0c;记录下。了解不多&#xff0c;直接上demo&#xff0c;里面有一些注释说明&#xff1a;package weka;import java.io.File;import weka.classifiers.Classifie…

[转载]64位linux安装WPS

2019独角兽企业重金招聘Python工程师标准>>> 网上下载了最新的WPS&#xff0a;.deb 安装后发现运行不了。&#xff08;点Unity > WP搜出来的图标&#xff09; 还以为安装有问题。于是重装了几次。还是不成功。 然后打开终端 wps 原来是程序出错了 提示找不到/opt…

mybatis报错There is no getter for property named '***' in 'class ***'

mybatis报错There is no getter for property named *** in class ***&#xff0c; 检查一看是xml中映射字段拼写错误&#xff0c;大小写。 有的时候用插件生成了原始的代码没问题&#xff0c;增加了一个字段在没有再自动生成的时候&#xff0c; 喜欢自己手动加一部分进去&…

LTE - PUCCH Format2

LTE中有很多课题(尤其是物理层)&#xff0c;如果不仔细阅读规范中给出的每个参数和方程&#xff0c;是无法解释清楚的。物理资源分配就是其中之一。 PUCCH格式2/2a/2b的物理资源分配由以下过程确定。看到这些公式千万不要惊慌&#xff0c;方程本身就是高中数学的一部分&#xf…