android Sqlite简单讲解

    xiaoxiao2021-03-26  19

    文章前面奉上代码,方便大家对照学习。

    1 Sqlite简介

    Sqlite作为嵌入型数据库出现在android中,它的作用是为了解决大量数据存储。

    2 Sqlite基本语法简单介绍

    2.1 sqlite数据类型

    android开发中sqlite支持的数据类型:NULL、INTEGER、REAL、TEXT、BLOB。 但是sqlite也支持如下的数据类型:

    名称介绍smallint16位整数integer32位整数decimal(p,s)p是精确值,s是小数位数float32位实数double64位实数char(n)n长度字符串,不能超过254varchar(n)长度不固定最大字符串长度为n,n不超过4000graphic(n)和 char(n) 一样,但是单位是两个字符double-bytes,n不超过127(中文字)vargraphic(n)可变长度且最大长度为ndate包含了年份、月份、日期time包含了小时、分钟、秒timestamp包含了年、月、日、时、分、秒、千分之一秒

    2.2 sqlite基本语法

    与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。这些命令基于它们的操作性质可分为以下几种:

    1.数据定义语法:

    命令描述语法例子CREATE创建一个新的表create table 表名(字段名1 数据类型 约束,字段名1 数据类型 约束…);create table test1(id Integer primary key,name varchar(10));ALTER修改表。略(不常用)略(不常用)DROP删除整个表drop table 表名drop table test1;

    2.数据操作语法:

    操作描述语法例子INSERT插入数据insert into 表名 (字段1,…,字段N)values(value1, …,valueN); 或 insert into 表名 values(value1, …,valueN);insert into test1 values (2,’yyd’);或insert into test1(id) values (3);UPDATE修改数据update 表名 set 字段1 = 值1, …, 字段N = 值N where [条件];update test1 set id=10,name=’yyy’ where id=1;DELETE删除数据delete from 表名 where [条件];delete from test1 where id=10;

    3.数据查询语法: 语法:

    select 字段名 from 表名 where 查询条件 group by 分组条件 having 筛选条件 order by 排序字段

    举例:

    select id,name from test1 select * from test1 select * from test1 where id=1 select * from test1 where id<>1 select * from test1 where id=1 and name='yyd' select * from test1 where name like "%小%" select * from test1 where name like "_小%" select * from test1 where name is null select * from test1 where id between 10 and 20 select * from test1 where id > 10 order by id

    3 SQLiteOpenHelper的使用

    SQLiteOpenHelper是android为SQLiteDatabase提供的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法.

    3.1 常用方法

    我们看一下SQLiteOpenHelper常用的方法有那些:

    方法介绍close()数据库用完一定要关闭!关闭!关闭!重要的话说3遍getWritableDatabase()创建或打开一个数据库来读写操作getReadableDatabase()创建或打开一个数据库来读写操作,注意:这个方法打开的数据库也能读写,并不是大家认为的只能读!onOpen(SQLiteDatabase db)当数据库被打开的时候被调用onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)当数据库需要升级的时候被调用onCreate(SQLiteDatabase db)当数据库第一次被创建的时候被调用,话外之意打开数据库不调用这个方法。

    3.2 代码实现

    /** * Created by yyd on 2017-02-05. */ public class MySqliteOpenHelper extends SQLiteOpenHelper{ public MySqliteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } /** * 这个构造方法只有一个参数,目的是为了方便new对象。 * @param context */ public MySqliteOpenHelper(Context context){ super(context, Constant.DataBaseName, null, Constant.Version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table "+Constant.TableName+"( _id Integer primary key,name varchar(10),age Integer )"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

    4 Sqlite增删改查

    在android中对sqlite的操作有三种:

    1.execSQL(String sql) 这种方法必须对Sql语法比较熟悉,并且没有返回值,其实在android底层这是用这个做的。 2.execSQL(String sql, Object[] bindArgs) 这种方法有返回值,bindArgs是我们要传的参数。大家用的时候要注意bindArgs数组中的值在顺序上一定要和前面的几个问号一一对应。下面实例的时候大家会看到。 3.SQLiteDatabase提供的API 这种方法针对Sql语法不熟悉的同学,有返回值

    下面我们对分别用这三种方法做增删改查操作,其中查询比较麻烦一些我们放在最后讲解。

    4.1 Insert(增)操作

    方法1.使用execSQL(String sql)

    String sqlExec = "insert into "+ Constant.TableName+" (_id,name,age) values (1,'yyd',12)"; db.execSQL(sqlExec);

    方法2.使用execSQL(String sql, Object[] bindArgs)

    String sqlExecArgs = "insert into "+ Constant.TableName+" (_id,name,age) values (?,?,?)"; Object[]args = {2,"yyd",12} ; db.execSQL(sqlExecArgs,args);

    大家用的时候要注意args数组中的值,在顺序上一定要和前面的几个问号一一对应。 方法3.使用api的方法 方法名:

    insert(String table, String nullColumnHack, ContentValues values)

    使用:

    ContentValues cv = new ContentValues(); cv.put("_id",4); cv.put("name","yyd"); cv.put("age",19); db.insert(Constant.TableName, null, cv);

    这里解释一下第二个参数为什么为null: nullColumnHack:当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。 大家可能还没明白,我们找源代码看看:

    public long insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm) { acquireReference(); try { StringBuilder sql = new StringBuilder(); sql.append("INSERT"); sql.append(CONFLICT_VALUES[conflictAlgorithm]); sql.append(" INTO "); sql.append(table); sql.append('('); Object[] bindArgs = null; int size = (initialValues != null && initialValues.size() > 0) ? initialValues.size() : 0; if (size > 0) { ... 这里做sql的拼接操作。(代码太多,节省篇幅) ... } else { //重点在这一行!这一行!这一行!重要的话说3遍! sql.append(nullColumnHack + ") VALUES (NULL"); } sql.append(')'); ...(代码太多,节省篇幅) } finally { releaseReference(); } }

    当形参initialValues为空的时候,就会进入else语句块中,sql语句就会变成:

    insert into tableName (nullColumnHack)values(null);

    这就符合语法规范了。大家明白了吗?

    4.2 Delete(删)操作

    方法1.使用execSQL(String sql)

    String delSql = "DELETE FROM "+Constant.TableName+" WHERE _id=1"; db.execSQL(delSql);

    方法2.使用execSQL(String sql, Object[] bindArgs)

    String delSqlArgs = "DELETE FROM "+Constant.TableName+" WHERE _id=?"; Object[]delArgs = {4} ; db.execSQL(delSqlArgs,delArgs);

    方法3.使用api的方法

    String[] whereArgs = {"12"}; db.delete(Constant.TableName, "age=?", whereArgs);

    4.3 Update(改)操作

    前面的弄明白了,后面的基本全面套路了,是不是发现Sqlite其实挺简单的。 方法1.使用execSQL(String sql)

    String updateSql = "UPDATE "+Constant.TableName+" SET name = 'aaaa',age= 45 WHERE _id = 3"; db.execSQL(updateSql);

    方法2.使用execSQL(String sql, Object[] bindArgs)

    String updateSqlArgs = "UPDATE " + Constant.TableName + " SET name = ?,age= ? WHERE _id = ?"; Object[] bindArgs = {"ddd", 23, 16}; db.execSQL(updateSqlArgs,bindArgs);

    方法3.使用api的方法 方法: update(String table, ContentValues values, String whereClause, String[] whereArgs) table:表名 values:是用键值对的方式存放字段名和值。 whereClause:是条件 whereArgs:如果whereClause中的值是“?”,那么这个就相应的填写值,切记必须和whereClause中的“?”顺序上对应!

    ContentValues values = new ContentValues(); values.put("name","rrr"); values.put("_id",45); values.put("age",78); String[] updateWhereArgs = {"16"}; db.update(Constant.TableName, values, "_id=?", updateWhereArgs);

    4.4 Select(查)操作

    查询之所以麻烦是因为.查询语句比较灵活一些,大家如果忘了看看菜鸟教程之SQLite 教程。

    方法1.使用rawQuery(String sql, String[] selectionArgs)

    String delSql = "SELECTFROM "+Constant.TableName+" WHERE _id=1"; Cursor c = db.rawQuery(selectSql,null); listView.setAdapter(new SqlAdapter(SelectActivity.this,c));

    方法2.使用API给出的方法 1.方法:

    1.db.rawQuery(String sql, String[] selectionArgs); 2.db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3.db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4.db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);

    看到API给出的方法,大家有没有感觉头疼,参数太多了!

    参数介绍table表名称columns列名称数组selection条件字句相当于whereselectionArgs条件字句,参数数组,如果where中有“?”的时候,就必须在这里指出groupBy分组列having分组条件orderBy排序列limit分页查询限制

    2.实例:

    String[] columns = {"_id","name","age"}; String[] selectionArgs= {"14"}; Cursor c = db.query(Constant.TableName, columns, "_id=?", selectionArgs, null, null,null); listView.setAdapter(new SqlAdapter(SelectActivity.this,c));

    5 Sqlite适配器CursorAdapter的使用

    设想一个场景:我们用ListView展示数据库中的数据,应该如何做呢? 上面我们讲过通过查询语句,我们获取到的是一个cursor引用,那么实现的方法中2种: 1.不用CursorAdapter: 我们遍历cursor,将其转化成ArrayList,然后放进BaseAdapter中, 2.用CursorAdapter: 直接将cursor放进CursorAdapter中。 相对第1种方法,是不是很方便呢?下面我们就用CursorAdapter来实现一下。 Adapter代码如下:

    public class SqlAdapter extends CursorAdapter { public SqlAdapter(Context context, Cursor c) { super(context, c, true); } /** 绑定view */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { View view = LayoutInflater.from(context).inflate(R.layout.adapter_cursor,null); return view; } /** 设置数据 */ @Override public void bindView(View view, Context context, Cursor cursor) { TextView idTv = (TextView)view.findViewById(R.id.idTv); TextView nameTv = (TextView)view.findViewById(R.id.nameTv); TextView ageTv = (TextView)view.findViewById(R.id.ageTv); idTv.setText(""+cursor.getString(cursor.getColumnIndex("_id"))); nameTv.setText(""+cursor.getString(cursor.getColumnIndex("name"))); ageTv.setText(""+cursor.getString(cursor.getColumnIndex("age"))); } }

    设置adapter代码如下:

    SQLiteDatabase db = SqliteManager.getInstance(SelectActivity.this).getWritableDatabase(); String selectSql = "select * from "+ Constant.TableName; Cursor c = db.rawQuery(selectSql,null); listView.setAdapter(new SqlAdapter(SelectActivity.this,c));

    其实CursorAdapter用起来非常简单,步骤如下: 继承CursorAdapter,实现newView和bindView2个方法。 讲了这么多我们并没有讲解cursor怎么使用,下面我们对cursor来讲解一下。

    6 Cursor的使用

    cursor是游标的意思。见名知意,cursor就好比一个指针一直指向当前的一条数据,我们可以读取出来,然后让cursor指向下一条数据。接下来我们看看它的方法有哪些:

    方法介绍getCount()总记录条数isFirst()判断是否第一条记录isLast()判断是否最后一条记录moveToFirst()移动到第一条记录moveToLast()移动到最后一条记录move(int offset)移动到指定的记录moveToNext()移动到下一条记录moveToPrevious()移动到上一条记录getColumnIndex(String columnName)获得指定列索引的int类型值close()关闭getString(int columnIndex)获取指定列上的值

    差不多常用的就这么多,使用起来非常简单,这里代码省略不写了。

    7 Sqlite事务

    7.1 什么是事务

    事务是一个不可分割的工作逻辑单元。 多个操作作为一个整体向系统提交,要么执行、要么所有都不执行。

    其实即使是一条增删改查操作,在底层也是先开启一个事务。大家想一下,如果插入100条记录呢?是不是要开启100个事务,那样太耗时间了!那么我们可以插入100条语句只开启1次事务吗?当然可以!

    7.2 使用步骤

    步骤1:beginTransaction();开启事务 步骤2:setTransactionSuccessful();设置提交事务 步骤3:endTransaction();关闭事务

    7.3 实例

    db.beginTransaction(); String sqlInsertExecArgs = "insert into "+ Constant.TableName+" (_id,name,age) values (?,?,?)"; for(int i =100;i<200;i++){ Object[]insertArgs = {i,"yyd"+i,i} ; db.execSQL(sqlInsertExecArgs,insertArgs); } db.setTransactionSuccessful(); db.endTransaction(); db.close();

    8 结尾

    文章最后奉上代码,方便大家对照学习。 好了就写到这里吧,希望对大家有所帮助。如果有不明白的请留言。如果觉的我写的不错,请点个赞吧,谢谢! 在技术上我依旧是个小渣渣,加油!勉励自己!

    9 参考资料

    【1】菜鸟教程之SQLite 教程 【2】ANDROID开发之SQLite详解 【3】Android基础-初识SQLite 【4】Android基础教程-SQLite高级操作 【5】android sqlite支持的数据类型 【6】官方文档

    转载请注明原文地址: https://ju.6miu.com/read-660569.html

    最新回复(0)