文档章节

SQLite

 梦想家Peng
发布于 2016/03/02 11:43
字数 1507
阅读 9
收藏 0
点赞 1
评论 0

数据库:存储数据的仓库,每一个数据库都可以存在多张数据表

数据表:具体存储数据的表,类似excel表格

常见的数据库有:MS SQL Server、MY SQL、Oracle……

SQLite并不是数据库服务器软件,在开发中,它表现为某1个文件。

查看SQLite数据文件的软件:SQLiteSpy、SQLiteExpert



【初始化过程】

1. 创建数据库

2. 创建数据表

【访问数据流程】

1. 连接到(打开)数据库

2. 访问数据表

创建数据库

方法1:openOrCreateDatabase()


创建数据表

CREATE TABLE '表名' (设计字段列表);

字段列表的格式为:字段(列)名、数据类型、约束

创建数据表示例:

String sql = "CREATE TABLE 'student' (" +

"_id integer primary key autoincrement, " +

"stu_name varchar(16) not null, " +

"stu_phone_number varchar(16) not null unique" +

")";

注意:SQLite是非常轻量级的数据库,所以,SQLite对存储的数据类型要求是不严格的,但是,仍然推荐规范的使用SQLite数据库。

String name = "tedu.db";
int mode = MODE_PRIVATE;
CursorFactory factory = null;
SQLiteDatabase db;
db = openOrCreateDatabase(name, mode, factory);
 
// 创建数据表
String sql = "CREATE TABLE 'student' (" +
        "_id integer primary key autoincrement, " +
        "stu_name varchar(16) not null, " +
        "stu_phone_number varchar(16) not null unique" +
        ")";
db.execSQL(sql);


数据操作:增删改查

增:insert into '表名' (字段列表) values (值列表)

删:delete from '表名' where子句

改:update '表名' set 字段=值的赋值列表 where子句

查:select 字段列表 from '表名' where子句 排序 分页


使用SQLiteDatabase实现数据管理

insert()

  第1个参数:表名

  第2个参数:无视,当确保第3个参数为有效值时,第2个参数没有任何意义

  第3个参数:确定要增加的数据,第3个参数ContentValues对象必须至少调用过1次put方法,即可使得该参数是有效的

  返回值:新记录的ID,如果增加失败,则返回-1

// 无视,当确保第3个参数为有效值时,第2个参数没有任何意义
String nullColumnHack = null;
// 确定要增加的数据
ContentValues values = new ContentValues();
values.put("stu_name", "Alex");
values.put("stu_phone_number", "010-88668866");
// 执行增加数据
long id = db.insert(table, nullColumnHack, values);
if (id != -1) {
Toast.makeText(this, "增加完成,id=" + id, Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "增加失败,原因嘛,不知道", Toast.LENGTH_SHORT).show();
}

delete()

  第1个参数:表名

  第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现

  第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null

  返回值:受影响的行数,即删除的条目数量

eg:

// delete from student where id>1
// delete from student where stu_name='Jack' and
// stu_phone_number='010-88886666'
// 第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现
String whereClause = "stu_name=? and stu_phone_number=?";
// 第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null
String[] whereArgs = { "Jack", "027-66668888" };
int affectedRows = db.delete(table, whereClause, whereArgs);
if (affectedRows > 0) {
Toast.makeText(this, "删除完成,受影响的行数:" + affectedRows,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "删除失败,没有符合删除条件的记录!", Toast.LENGTH_SHORT)
.show();
}

update()

eg:

values = new ContentValues();
values.put("stu_phone_number", "10086");
whereClause = "_id=? and stu_name=?";
whereArgs = new String[] { 5 + "", "Rose" };
affectedRows = db.update(table, values, whereClause, whereArgs);
if (affectedRows > 0) {
Toast.makeText(this, "编辑完成,受影响的行数:" + affectedRows,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "编辑失败,没有符合删除条件的记录!", Toast.LENGTH_SHORT)
.show();
}


【查询数据】

方法:query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

参数说明:

String table:表名

String[] columns:要查询的列(字段),如果为null,则表示查询所有列

String selection:查询条件,即where子句

String[] selectionArgs:查询条件中各问号(?)对应的值

String groupBy:分组子句,暂无视

String having:分组筛选子句,暂无视

String orderBy:排序,例如 _id asc,或 name asc, _id desc

返回值:Cursor

【关于Cursor】

Cursor可以理解为一个表格,表格中是查询出的数据结果。

Cursor在获取数据之前,必须调用move???系列方法确定其位置,然后再获取数据。

推荐使用for循环实现Cursor的遍历:

for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext())

【关于SimpleCursorAdapter】

SimpleCursorAdapter是使用Cursor作为数据源的Adapter。

使用SimpleCursorAdapter时,应该保证在数据源Cursor中存在 _id 字段。

eg:

// 第2个参数,表示要查询的字段的列表,为null值时表示查询所有字段
String[] columns = { "stu_name", "_id", "stu_phone_number" };
// 第3个参数,参考whereClause
String selection = "_id>?";
// 第4个参数,参考whereArgs
String[] selectionArgs = { "0" };
// 第5个参数,分组,暂无视
String groupBy = null;
// 第6个参数,分组后的筛选,暂无视
String having = null;
// 第7个参数,排序,asc表示顺序排列,desc表示倒序排列
String orderBy = "stu_name asc";
// 执行查询
Cursor c = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
    String stuId = c.getString(1);
    String stuName = c.getString(0);
    String stuPhoneNumber = c.getString(2);
    Log.d(tag , "id -> " + stuId);
    Log.d(tag, "name -> " + stuName);
    Log.d(tag, "phone number -> " + stuPhoneNumber);
}

【SQLiteOpenHelper】

SQLiteOpenHelper是用于管理数据库的工具,可以实现创建数据库文件、创建数据表等操作,及数据库版本的升级、降级等。

使用SQLiteOpenHelper类定义的getReadableDatabase()或getWritableDatabase()方法可以获取SQLiteDatabase对象,以实现数据访问操作。

eg:

public class DbOpenHelper extends SQLiteOpenHelper {
    public DbOpenHelper(Context context) {
        super(context, "tarena.db", null, 1);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建数据表student
        String sql = "CREATE TABLE 'student' ("
        + "_id integer primary key autoincrement, "
        + "stu_name varchar(16) not null, "
        + "stu_phone_number varchar(16) not null unique" + ")";
        db.execSQL(sql);
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    }
}

使用SQLite的流程

---------------------------

1. 规划数据库与数据表

2. 自定义类继承自SQLiteOpenHelper,至少重写onCreate()方法,在onCreate()方法中完成所有的初始化操作,例如创建数据表、向数据表中插入默认数据。

3. 创建上述自定义类的对象,调用getReadableDatabase()方法获取SQLiteDatabase对象,以实现数据访问操作。

4. 确定数据访问结束后,关闭相关资源。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 33
码字总数 15605
作品 0
深圳
【防衰老教程】-windows环境下安装SQLite

什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。...

Weijue ⋅ 05/09 ⋅ 0

安卓应用安全指南 4.5.3 使用 SQLite 高级话题

安卓应用安全指南 4.5.3 使用 SQLite 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 4.5.3.1 在 SQL 语句的断言中使用通配符...

apachecn_飞龙 ⋅ 03/22 ⋅ 0

python中的SQLite数据库

python中的SQLite数据库 Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它使用一个文件存储整个数据库,操作十分方便...

幸运券发放 ⋅ 05/03 ⋅ 0

【Kotlin For Android】(三): Anko 库

一、简介 Github地址 是一个使 Android应用程序 开发更快,更容易的库。它使你的代码变得简洁易读,并让您忘记 的粗糙边缘。 Anko 由几部分组成: :一个轻量级的库,里面充满了,对话框,日...

Agnes2017 ⋅ 04/27 ⋅ 0

Xamarin SQLite教程数据库访问与生成

Xamarin SQLite教程数据库访问与生成 在本教程中,我们将讲解如何开发SQLite相关的App。在编写程序前,首先需要做一些准备工作,如了解Xamarin数据库访问方式,添加引用,构建使用库文件等。...

大学霸 ⋅ 前天 ⋅ 0

写一个“特殊”的查询构造器 - (一、程序结构,基础封装)

程序的结构 本篇开始,正式进入编码实践中。首先,简单的规划下程序的结构。 如上一篇所说的,我们需要一个基类 PDODriver 用来封装 PDO 的一些公用的方法,Mysql 等每个数据库都新建一个类 ...

MrQ被抢注了 ⋅ 05/11 ⋅ 0

Android_6.数据存储3_SQLite存储之创建数据库

本文是以Android Studio为开发工具,<> 为学习指导书籍的学习记录 6.4 SQLite数据 SQLite用于存储大量复杂的关系型数据,是内置在Android系统的一种轻量级的关系型数据库,它有速度快,占用资...

橄榄工作室 ⋅ 05/26 ⋅ 0

C语言实现的CGI,完成了留言板功能

地址:https://github.com/zhouweiit/cgi 基于ngnix+spawn_cgi+fastcgi作为服务器,使用C语言编写的cgi,实现了简单的留言板功能; 项目结构简介: 1.conf主要包含了nginx与fastcig的配置 2....

zhouweiit_ ⋅ 05/09 ⋅ 0

Node.js 的 SQLite 教程

在本教程中,我将演示如何结合sqlite3 Node.js驱动程序在Node.js环境中使用SQLite。 对于那些不熟悉SQLite的人来说,它是一个简单的单文件关系数据库,在智能设备,嵌入式系统甚至小型Web应用...

oschina ⋅ 05/31 ⋅ 0

SQLite增删改查小程序,运行报错,onClick 报错,不知道是哪里出现问题

写了一个简单得SQLite增删改查小程序,运行报错,检查了多遍,没检查出来。总是报错。报错如下 我的程序:ativity_main.xml MainActivity.java PersonDao.java PersonSQLiteOpenHelper.java...

小欢的 ⋅ 05/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部