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);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);//执行建表
Log.d(TAG,"数据库初始化完成");
} @Override
public 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);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);//执行建表
db.execSQL(CREATE_CATEGORY);
Log.d(TAG,"数据库初始化完成");
} //当检测到数据库版本变化,就会执行onUpgrade()中的代码
@Override
public 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()方法中对当前数据库的版本号进行判断,再执行相应的改变就可以了
@Override
public 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.99
db.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(); // 结束事务
}
SQLite学习和使用的更多相关文章
- SQLite学习笔记(七)&&事务处理
说到事务一定会提到ACID,所谓事务的原子性,一致性,隔离性和持久性.对于一个数据库而言,通常通过并发控制和故障恢复手段来保证事务在正常和异常情况下的ACID特性.sqlite也不例外,虽然简单,依然 ...
- Sqlite学习笔记(四)&&SQLite-WAL原理
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- SQLite学习手册(目录)
链接地址:http://www.cnblogs.com/stephen-liu74/archive/2012/01/22/2328757.html 在实际的应用中,SQLite作为目前最为流行的开源嵌 ...
- Sqlite学习笔记(四)&&SQLite-WAL原理(转)
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- SQLite学习手册
在实际的应用中,SQLite作为目前最为流行的开源嵌入式关系型数据库,在系统的架构设计中正在扮演着越来越为重要的角色.和很多其它嵌入式NoSQL数据库不同的是,SQLite支持很多关系型数据库的基本特 ...
- SQLite 学习笔记
SQLite 学习笔记. 一.SQLite 安装 访问http://www.sqlite.org/download.html下载对应的文件. 1.在 Windows 上安装 SQLite. ...
- SQLite学习手册(转)
原文网址:http://www.cnblogs.com/stephen-liu74/archive/2012/01/22/2328757.html 在实际的应用中,SQLite作为目前最为流行的开源嵌 ...
- sqlite学习笔记7:C语言中使用sqlite之打开数据库
数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...
- SQlite 学习资料
很有用的开源跨平台数据库,可以作为客户端的小型内存数据库使用,据说它有N多用户(Nokia's Symbian,Mozilla,Abobe,Google,阿里旺旺,飞信,Chrome,FireFo ...
- sqlite学习
一鼓作气,今天继续学习了sqlite数据库在Xcode上的一些操作,主要是通过用oc代码进行salite表格的创建,删除,修改:以及对现有的表格数据进行增,删,改,查.虽然有点累,但是收获不小,感觉很 ...
随机推荐
- AnyCAD在医疗中的应用
void addPoint(List<float> buffer, Vector3 pt) { buffer.Add((float)pt.X); buffer.Add((float)pt. ...
- ngnix入门配置
文件1.首先到ngnix下载页面下载你操作系统对应的ngnix压缩包 http://nginx.org/en/download.html 博主我是window10操作系统 上面是我解压之后放的 ...
- 零基础逆向工程25_C++_02_类的成员权限_虚函数_模板
1 类的成员权限 1.1 小结: 1.对外提供的函数或者变量,发布成public的 但不能随意改动. 2.可能会变动的函数或者变量,定义成private的 这样编译器会在使用的时候做检测. 3.只有结 ...
- JavaScript获取URL参数公共方法
写一个JavaScript获取URL参数的通用方法,可以把它放到常用方法的JS文件中调用,直接上代码例子,新手可以学习一下! <!DOCTYPE html> <html lang=& ...
- C#对话框-打开和保存对话框(转)
//打开文件 OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.In ...
- 性能调优--大事务与Alwayson 之间的关系
最近性能调优的事比较多,所以摘一些比较有特点的 案例分享下. 业务系统用的是sql server 2016 ,搭建的ALWAYSON 两节点的 群集,今天早上突然辅助 副本的只读库出现大量的等待导致系 ...
- cms-详细页面-3
1.设置上一条.下一条数据 2.使用昌言插件 3.点击链接帖子的访问数加一 1.在mapper中设置分页: <?xml version="1.0" encoding=&quo ...
- sk-learning(1)
sk-learning学习笔记(1) 简介 scikit learning 是一个python的机器学习库,内置许多机器学习的算法诸如svm.随机森林.逻辑回归.贝叶斯网络等算法.覆盖了分类.聚类.回 ...
- codeforces 599D Spongebob and Squares
很容易得到n × m的方块数是 然后就是个求和的问题了,枚举两者中小的那个n ≤ m. 然后就是转化成a*m + c = x了.a,m≥0,x ≥ c.最坏是n^3 ≤ x,至于中间会不会爆,测下1e ...
- hdu-1875 畅通工程再续---MST
题目链接: https://vjudge.net/problem/HDU-1875 题目大意: 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小 ...