android SQLite数据库总结
SQLite
SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用。
sql语法就不介绍了,直接看在android中的使用
SQLiteOpenHelper——封装好的数据库操作辅助类,需重写
重写方法
onCreate:初始化数据库,创建表,添加初始数据
onUpgrade:数据库版本升级时的数据库操作,如备份删除数据库等
常用方法
getReadableDatabase() 获取SQLiteDatabase对象,操作数据库
getWritableDatabase() 获取SQLiteDatabase对象,操作数据库
区别:在磁盘空间满或不可写时,1方法将获得只读的数据库对象,而2方法会报错,在正常情况下,获取到的都是可读写的数据库对象。
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- public class DBHelper extends SQLiteOpenHelper {
- private static final String name="my";//数据库名
- private static final int version=1;//版本号
- //重写构造方法的时候选择参数少的一项
- public DBHelper(Context context) {
- //1:上下文 2:数据库名称 3:游标创建工厂 4:数据库版本 版本只能是整数 1 2 3..
- super(context, name, null, version);
- }
- //数据库的初始化 SQLiteDatabase数据库操作对象
- //一般只在第一次运行和版本更新的时候调用
- @Override
- public void onCreate(SQLiteDatabase db) {
- //创建数据库 主键默认自增
- db.execSQL("create table student(" +
- "_id integer not null primary key autoincrement," +
- "name varchar(20)," +
- "phone varchar(11)," +
- "gender varchar(2))");
- //添加一条测试数据
- db.execSQL("insert into student values(null,?,?,?)"
- ,new Object[]{"小黑","12345678901","男"});
- }
- /**
- * 在版本升级的时候调用
- * 修改version 为2 表示版本升级 就会调用这个方法
- * @param db 数据库操作对象
- * @param oldVersion 旧版本号
- * @param newVersion 新版本号
- */
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- }
- }
在android数据库的创建是需要创建对象才能创建的
在activity类中创建出一个数据库类对象
创建好数据对象就可以操作数据了 通过SQLiteDatabase获取 两种获取方法的区别上面已经提到过了
- //创建数据
- DBHelper helper =new DBHelper(this);
- //调用数据操作对象
- SQLiteDatabase dbWrite=helper.getWritableDatabase();
- SQLiteDatabase dbRead=helper.getReadableDatabase();
SQLiteDatabase给我们提供了很多操作数据的方法
删除:(int) delete(String table,String whereClause,String[] whereArgs)
table: 表名
whereClause:where条件 列名 占位符 id=?
whereArgs:参数值数组
添加:(long) insert(String table,String nullColumnHack,ContentValues values)
nullColumnHack:为空列
ContentValues values:通过键值对存储添加的数据 key为列 value为值
insert方法 底层是通过拼接字符串的方式 如果ContentValues是空的 拼接成的sql语句无法执行会报错 所以给一个可以为空的列 当ContentValues为空时也可以执行 有兴趣的可以看一下源码
更新:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
参数意思同上
查询:(Cursor) query(boolean distinct,String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
返回值是一个游标 这个query参数较多 简单的查询就还是写一条sql语句简单点
boolean distinct 去重复
String table 表名
String[] columns要查询的列
String selection查询条件
String[] selectionArgs查询参数值
String groupBy分组
String having分组条件
String orderBy排序
String limit分页查询限制
关闭数据库:(void) close()
执行一条sql语句:(void) execSQL(String sql) 增删改查
查询查询sql:(Cursor) rawQuery(String sql, String[] selectionArgs)
事务
- try {
- db.beginTransaction();//开启事务
- // db.update();
- // db.insert();
- db.setTransactionSuccessful(); //没有设置事物成功 finally就会回滚
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- db.endTransaction();
- }
贴代码咯 执行sql语句 和封装好的方法
查询
- private void query() {
- StringBuffer sb=new StringBuffer("select * from student where 1=1");
- //参数集合
- List<String> params=new ArrayList<>();
- if(!TextUtils.isEmpty(id)){
- sb.append(" and _id=?");
- params.add(id);
- }
- if(!TextUtils.isEmpty(phone)){
- sb.append(" and phone=?");
- params.add(phone);
- }
- if(!TextUtils.isEmpty(name)){
- sb.append(" and name=?");
- params.add(name);
- }
- if(!TextUtils.isEmpty(gender)){
- sb.append(" and gender=?");
- params.add(gender);
- }
- SQLiteDatabase db=helper.getReadableDatabase();
- String [] projection=new String [params.size()];
- params.toArray(projection);
- //返回值 游标
- Cursor cursor=db.rawQuery(sb.toString(),projection);
//判断游标是否为空,是否有一个值- while(cursor!=null&&cursor.moveToNext()){
- // getColumnIndex获取列的下标 cursor.getXXXX()获取指定列的值
- String name=cursor.getString(cursor.getColumnIndex("name"));
- Integer id=cursor.getInt(cursor.getColumnIndex("_id"));
- }
- }
用不到的参数就让它为空吧 遍历数据就while循环就好咯
- Cursor c = db.query("student",null,null,null,null,null,null);//查询并获得游标
更新
- private void update() {
- StringBuffer sb=new StringBuffer("update student set ");
- List params=new ArrayList();
- if(!TextUtils.isEmpty(phone)){
- sb.append("phone=?,");
- params.add(phone);
- }
- if(!TextUtils.isEmpty(name)){
- sb.append("name=?,");
- params.add(name);
- }
- if(!TextUtils.isEmpty(gender)){
- sb.append("gender=?,");
- params.add(gender);
- }
- if (params.size()!=0){
- //更新操作拼接字符串末尾有一个","需要去除
- //删除最后一位的“,”
- sb.setLength(sb.length()-1);
- sb.append(" where 1=1");
- //通过id指定 更新那行数据
- if(!TextUtils.isEmpty(id)){
- sb.append(" and _id=?");
- params.add(id);
- }else{
- Toast.makeText(this,"请填写id",Toast.LENGTH_SHORT).show();
- return;
- }
- SQLiteDatabase db=helper.getWritableDatabase();
- Object [] o=new Object[params.size()];
- params.toArray(o);//将数据存放到指定的数组中
- db.execSQL(sb.toString(),o);
- }
- }
- ContentValues cv = new ContentValues();//实例化ContentValues
- cv.put("name","123");//添加要更改的字段及内容
- String whereClause = "phone=?";//修改条件
- String[] whereArgs = {"12312313213"};//修改条件的参数
- db.update("student",cv,whereClause,whereArgs);//执行修改
删除
- private void delete() {
- getAllText();
- //拼接sql语句
- StringBuffer sb=new StringBuffer("delete from student where 1=1");
- //保存参数的list
- List params=new ArrayList();
- //判断条件 动态拼接
- if(!TextUtils.isEmpty(id)){
- sb.append(" and _id=?");
- params.add(id);
- }
- if(!TextUtils.isEmpty(phone)){
- sb.append(" and phone=?");
- params.add(phone);
- }
- if(!TextUtils.isEmpty(name)){
- sb.append(" and name=?");
- params.add(name);
- }
- if(!TextUtils.isEmpty(gender)){
- sb.append(" and gender=?");
- params.add(gender);
- }
- SQLiteDatabase db=helper.getWritableDatabase();
- if (params.size()!=0){
- Object [] o=new Object[params.size()];
- params.toArray(o);//将数据存放到指定的数组中
- //执行删除
- db.execSQL(sb.toString(),o);
- }else{
- db.execSQL(sb.toString());
- }
- Toast.makeText(this,"删除完成",Toast.LENGTH_SHORT).show();
- }
- String whereClause = "name=?";//删除的条件
- String[] whereArgs = {"123"};//删除的条件参数
- db.delete("student",whereClause,whereArgs);//执行删除
增加
- private void insert() {//保存数据到object数组
- Object [] o=new Object[]{name,phone,gender};
- //获取数据库操作对象
- SQLiteDatabase db=helper.getWritableDatabase();
- //sql:sql语句 bingArgs:参数数组
- db.execSQL("insert into student values(null,?,?,?)",o);
- //关闭连接
- db.close();
- Toast.makeText(this,"增加成功",Toast.LENGTH_SHORT).show();
- }
- ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据
- cv.put("name","123");
- db.insert("student",null,cv);//执行插入操作
android SQLite数据库总结的更多相关文章
- Android Sqlite 数据库版本更新
Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...
- Android SQLite 数据库详细介绍
Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...
- Android sqlite数据库存取图片信息
Android sqlite数据库存取图片信息 存储图片:bitmap private byte[] getIconData(Bitmap bitmap){ int size = bitmap.get ...
- Android SQLite 数据库 增删改查操作
Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...
- 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持
IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...
- Android——SQLite/数据库 相关知识总结贴
android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...
- Android Sqlite数据库加密
Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收 ...
- Android SQLite数据库使用
在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的.一. ...
- android: SQLite 数据库的最佳实践
6.5.1 使用事务 前面我们已经知道,SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操 作要么全部完成,要么一个都不会完成.那么在什么情况下才需要使用事务呢?想象以下场 景, ...
- Android—SQLITE数据库的设计和升降级
Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...
随机推荐
- .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序
在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...
- NodeJs 开发微信公众号(三)微信事件交互
微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...
- Team Leader 你不再只是编码, 来炖一锅石头汤吧
h3{ color: #000; padding: 5px; margin-bottom: 10px; font-weight: bolder; background-color: #ccc; } h ...
- Failed to stop iptables.service: Unit iptables.service not loaded.
redhat 7 [root@lk0 ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Fai ...
- iOS---观察者模式之--->KVO
文章结构如下: Why? (为什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) More (更多细节) 原理 自己实现KVO 在我的上一篇文章浅谈 iOS Notifica ...
- Python初学者之网络爬虫(二)
声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)
系列目录 这一节我们要着手建立系统管理员表,但发布之前,我先发布一个代码生成器给大家先用着. 这个生成器是为这个项目而生的,理论不能用于其他项目,而且写得比较潦草,但能用 下载地址 有兴趣要生成器源码 ...
- 安装MYSQL详细教程 版本:mysql-installer-community-5.7.16.0 免安装版本和安装版本出现错误的解决
一.版本的选择 之前安装的Mysql,现在才来总结,好像有点晚,后台换系统了,现在从新装上Mysql,感觉好多坑,我是来踩坑,大家看到坑就别跳了,这样可以省点安装时间,这个折腾了两天,安装了好多个版本 ...
- 读书笔记--SQL必知必会19--存储过程
不同的DBMS对存储过程的实现不同,差异巨大,这里不涉及具体的DBMS,仅仅说明存储过程的简单含义. 19.1 存储过程 简单来说,存储过程就是为以后使用而保存的一条或多条SQL语句. 可以将存储过程 ...
- Cesium教程系列汇总
Cesium系列目录: 应用篇 入门 Cesium应用篇:1快速搭建 影像 Cesium应用篇:2影像服务(上) Cesium应用篇:2影像服务(下) 控件 Cesium应用篇:3控件(1)Clock ...