SQLite学习和使用
创建数据库并创建表格
1.创建MyDatabaseHelper继承于SQLiteOpenHelper(抽象类,必须实现onCreate()和onUpgrade()方法)
2.把数据库建表指令弄成一个字符串CREATE_BOOK常量,并在onCreate()函数中执行建表
public class MyDatabaseHelper extends SQLiteOpenHelper {//把数据库建表指令弄成一个字符串CREATE_BOOK常量public static final String CREATE_BOOK = "create table book ("+ "id integer primary key autoincrement, "+ "author text, "+ "price real, "+ "pages integer, "+ "name text)";public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context,name,factory,version);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);//执行建表Log.d(TAG,"数据库初始化完成");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}
3.在MianActivity()中新建数据库
private MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);//新建一个MyDatabaseHelper对象,上下文;数据库名;第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null;数据库版本号dbHelper.getWritableDatabase();
升级数据库方法1(覆盖式)
需 求:增加一个新的表格,Category
由于数据库BookStore.db已经存在,onCreate()方法不会再次执行,直接在onCreate()方法中,添加table不能被更新。
解决方案:使用onUpgrade()方法更新数据库
添加表格常量;在onCreate()方法中建表;在upGreate()方法中删去存在表格,并重新执行onCreate()方法;在引用数据库时更改数据库版本号
public class MyDatabaseHelper extends SQLiteOpenHelper {//把数据库建表指令弄成一个字符串CREATE_BOOK常量public static final String CREATE_BOOK = "create table book ("+ "id integer primary key autoincrement, "+ "author text, "+ "price real, "+ "pages integer, "+ "name text)";//integer 表示整型,real 表示浮点型,text 表示文本类型,blob 表示二进制类型。另外,上述建表语句中我们还//使用了 primary key 将 id 列设为主键,并用 autoincrement 关键字表示 id 列是自增长的public static final String CREATE_CATEGORY = "create table category("+ "id integer primary key autoincrement, "+ "category_name text, "+ "category_code integer)";public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context,name,factory,version);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);//执行建表 db.execSQL(CREATE_CATEGORY);Log.d(TAG,"数据库初始化完成");}//当检测到数据库版本变化,就会执行onUpgrade()中的代码 @Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//调用SQL语句,若存在表格则删去,之后在重新调用onCreate()方法db.execSQL("drop table if exists Book");db.execSQL("drop table if exists Category");onCreate(db);}}
升级数据库方法2(追加式)
需 求:根据所需变更数据库,增加一个新的表格,Category
由于覆盖式更新数据库的方法会重置数据库,导致用户数据丢失,不能在产品中使用
解决方案:为每一个版本号赋予它各自改变的内容,然后在onUpgrade()方法中对当前数据库的版本号进行判断,再执行相应的改变就可以了
@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//调用SQL语句,若存在表格则删去,之后在重新调用onCreate()方法/*** 注释时间:20170117* 代码作用:覆盖式更新数据库,删除之前的数据库再新建库* 注释原因:学习新的数据库更新方法db.execSQL("drop table if exists Book");db.execSQL("drop table if exists Category");onCreate(db);*/switch (newVersion){case 2:db.execSQL(CREATE_CATEGORY);//!!!注意,无break;case 3:db.execSQL("alter table Book add column category_id integer");//!!!注意,无break;//因为无论覆盖哪一个版本安装,都需要安装其他更新,从第二版安装第三版时,只需要更新case3,确保数据库最新Log.d(TAG,"第3版数据库更新成功");break;default:Log.d(TAG,"数据库更新失败");break;}}
增删改查操作(SQL语句操作)
对数据进行的操作也就无非四种,即CRUD。其中 C 代表添加(Create) ,R 代表查询(Retrieve) ,U 代表更新(Update) ,D 代表删除(Delete)
SQLiteDatabase db = dbBookStoreHelper.getWritableDatabase();//新建两个数据db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });//查询所有数据db.rawQuery("select * from Book", null);//把《The Da Vinci Code》这本书改成10.99db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99","The Da Vinci Code" });//把500页以上的书删了db.execSQL("delete from Book where pages > ?", new String[] { "500" });
增删改查操作(Android语法操作)
增加数据
insert()方法,1.表名;2.未指定添加数据的情况下给某些可为空的列自动赋值 NULL;3.ContentValues 对象,它提供了一系列的 put()方法重载,用于向 ContentValues 中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可
//!!!先组装数据,再插入数据 SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); // 开始组装第一条数据 values.put("name", "The Da Vinci Code"); values.put("author", "Dan Brown"); values.put("pages", 454); values.put("price", 16.96); db.insert("Book", null, values); // 插入第一条数据 values.clear(); // 开始组装第二条数据 values.put("name", "The Lost Symbol"); values.put("author", "Dan Brown"); values.put("pages", 510); values.put("price", 19.95); db.insert("Book", null, values); // 插入第二条数据
更改数据
update()方法,1.表名;2.ContentValues 对象,要把更新数据在这里组装进去;第三、第四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行
SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("price", 10.99); db.update("Book", values, "name = ?", new String[] { "The DaVinci Code" }); values.clean();
删除数据
delete()方法,1.表名;第二、第三个参数用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行
db.delete("Book","pages > ?",new String[] {"300"});
查询数据
query()方法,1.表名;2.指定去查询哪几列,如果不指定则默认查询所有列;3.第三、第四个参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据;5.指定需要去 group by 的列,不指定则表示不对查询结果进行 group by 操作;6. group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤;7,指定查询结果的排序方式,不指定则表示使用默认的排序方式。
query()方法参数 | 对应 SQL 部分 | 描述 |
table | from table_name | 指定查询的表名 |
columns | select column1, column2 | 指定查询的列名 |
selection | where column = value | 指定 where 的约束条件 |
selectionArgs | - | 为 where 中的占位符提供具体的值 |
groupBy | group by column | 指定需要 group by 的列 |
having | having column = value | 对 group by 后的结果进一步约束 |
orderBy | order by column1, column2 | 指定查询结果的排序方式 |
Cursor cursor = db.query("Book",null,"1",null,null,null,null);if (cursor != null){if(cursor.moveToFirst()){do {//直到型循环String name = cursor.getString(cursor.getColumnIndex("name"));String author = cursor.getString(cursor.getColumnIndex("author"));Double price = cursor.getDouble(cursor.getColumnIndex("price"));int pages = cursor.getInt(cursor.getColumnIndex("pages"));Log.d(TAG,"name = " + name);Log.d(TAG,"author = " + author);Log.d(TAG,"price = " + price);Log.d(TAG,"pages = " + pages);}while (cursor.moveToNext());}}cursor.close();
使用事务Transaction
事情要有始有终,就像转账,钱没到达对方账户就会退回原始账户
需 求:删除旧的数据库,更换新的数据库
解决方案:使用beginTransaction,setTransactionSuccessful,endTransaction三个来监控事务的执行,一旦执行失败,返回原始的数据库
db.beginTransaction();//开始事务try {db.delete("Book", null, null);if (true) {// 在这里手动抛出一个异常,让事务失败throw new NullPointerException();}db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",new String[]{"马克思主义2", "中国**党", "1000", "100.00"});//居然和谐db.setTransactionSuccessful(); // 事务已经执行成功} catch (Exception e) {e.printStackTrace();} finally {db.endTransaction(); // 结束事务}
转载于:https://www.cnblogs.com/cenzhongman/p/6392753.html
SQLite学习和使用相关推荐
- sqlite学习笔记7:C语言中使用sqlite之打开数据库
数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...
- Sqlite学习笔记(四)SQLite-WAL原理(转)
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- SQLite学习手册(目录)
在实际的应用中,SQLite作为目前最为流行的开源嵌入式关系型数据库,在系统的架构设计中正在扮演着越来越为重要的角色.和很多其它嵌入式NoSQL数据库不同的是,SQLite支持很多关系型数据库的基本特 ...
- SQLite学习笔记(七)-- 数据插入、更新和删除(C++实现)
1.代码实例 代码说明 本例主要说明如何对数据表进行插入.更新和删除操作. 测试平台 1.开发语言:C++ 2.开发工具:VS2015 3.操作系统:Win7 X64 测试数据说明 测试表为Stude ...
- 2010年SQLite学习笔记之一
2010年SQLite学习笔记之一 一. 如何获取SQLite最新版本 官方站点:http://www.sqlite.org/ 从http://www.sqlite.org/网站 ...
- SQLite学习笔记(三)
概述 本篇文章将介绍 SQLite 中的函数,了解如何利用内置的函数来处理数据.文章结构如下: 聚合函数介绍 其他内置函数介绍 时间和日期函数介绍 数据类型的比较和NULL值的处理 一.聚合函数 SQ ...
- 学习Stephen Liu的《SQLite学习手册(数据表和视图)》(一)
好好学习,day day up.不能再玩了,学习要紧 以下内容主要基于对于Stephen Liu的博文SQLite学习手册(数据表和视图)的学习. 零.准备工作 先把sqlite3.exe的路径添加到 ...
- SQLite学习之路② Pager模块介绍和Pager对象(2021SC@SDUSC)
2021SC@SDUSC SQLite 学习之路 第二节 模块介绍和Pager对象 Pager介绍 Pager对象 Pager介绍 根据上图我们能够大致了解Pager模块在SQLite占据的地位,它是 ...
- SQLite学习笔记(八)-- BLOB数据的插入与查询(C++实现)
1.什么是BLOB数据 BLOB (binary large object)即二进制大对象,是一种可以存储二进制文件的容器.在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型.常见的BLO ...
- 2010年SQLite学习笔记之三
2010年SQLite学习笔记之三 一.如何备份数据库 先打开数据库test.db E:/sqlite/tool/sqlite-3_6_22>sqlite3 D:/Test/debug/tes ...
最新文章
- LVS实现负载均衡及高可用
- Maven全局配置文件settings.xml 全解
- 解决win10安装MySQL数据库出现服务无法启动的问题
- 时空上下文视觉跟踪(STC)
- excel未完全加载怎么办_你知道如何改变Excel的打开姿势吗?
- 你不知道的 字符集和编码(编码字符集与字符集编码)
- linux用ping命令测试网速,linux下面使用命令测试网速
- 单招计算机英语面试口语,单招面试英语自我介绍范文 自我介绍说什么
- 复制书稿(信息学奥赛一本通-T1278)
- 某项目网络实施中的几个关键点解析
- mySAP标准培训教材全套列表
- 单片机第13课:串口通信---向计算机发送数据
- 解决百度云下载过慢、Linux下载百度云数据问题
- c语言图形显示功能,C语言图形编程(二、图形显示).doc
- java参数传入数组_java传入数组参数
- Java导出word模板
- 查找手机号绑定的百度账号
- python连接S3
- maltab-图像拼接(左右两幅图)
- 2009级 华中科技大学 计算机学院 本科生名单,华中科技大学2009届本科生.doc
热门文章
- [swift]-类的构造函数
- easyui之treegrid的生成
- 临时笔记, 有意思的东西
- python进阶教程之异常处理
- oracle数据设置为ull,Oracle _11g_使用手册_自备
- hadoop yarn 获取日志_Hadoop YARN日志查看方式
- 【PHP】PHP include()和require()方法的区别
- “BASH: FORK: RESOURCE TEMPORARILY UNAVAILABLE”的解决方案
- perl调用shell命令并获取输出
- Firefox 67不能勾选“以后自动采用相同的动作处理此类文件”解决方案