文章前面奉上代码,方便大家对照学习。
Sqlite作为嵌入型数据库出现在android中,它的作用是为了解决大量数据存储。
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包含了年、月、日、时、分、秒、千分之一秒与关系数据库进行交互的标准 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 idSQLiteOpenHelper是android为SQLiteDatabase提供的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法.
我们看一下SQLiteOpenHelper常用的方法有那些:
方法介绍close()数据库用完一定要关闭!关闭!关闭!重要的话说3遍getWritableDatabase()创建或打开一个数据库来读写操作getReadableDatabase()创建或打开一个数据库来读写操作,注意:这个方法打开的数据库也能读写,并不是大家认为的只能读!onOpen(SQLiteDatabase db)当数据库被打开的时候被调用onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)当数据库需要升级的时候被调用onCreate(SQLiteDatabase db)当数据库第一次被创建的时候被调用,话外之意打开数据库不调用这个方法。在android中对sqlite的操作有三种:
1.execSQL(String sql) 这种方法必须对Sql语法比较熟悉,并且没有返回值,其实在android底层这是用这个做的。 2.execSQL(String sql, Object[] bindArgs) 这种方法有返回值,bindArgs是我们要传的参数。大家用的时候要注意bindArgs数组中的值在顺序上一定要和前面的几个问号一一对应。下面实例的时候大家会看到。 3.SQLiteDatabase提供的API 这种方法针对Sql语法不熟悉的同学,有返回值
下面我们对分别用这三种方法做增删改查操作,其中查询比较麻烦一些我们放在最后讲解。
方法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);这就符合语法规范了。大家明白了吗?
方法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);前面的弄明白了,后面的基本全面套路了,是不是发现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);查询之所以麻烦是因为.查询语句比较灵活一些,大家如果忘了看看菜鸟教程之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));设想一个场景:我们用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来讲解一下。
cursor是游标的意思。见名知意,cursor就好比一个指针一直指向当前的一条数据,我们可以读取出来,然后让cursor指向下一条数据。接下来我们看看它的方法有哪些:
方法介绍getCount()总记录条数isFirst()判断是否第一条记录isLast()判断是否最后一条记录moveToFirst()移动到第一条记录moveToLast()移动到最后一条记录move(int offset)移动到指定的记录moveToNext()移动到下一条记录moveToPrevious()移动到上一条记录getColumnIndex(String columnName)获得指定列索引的int类型值close()关闭getString(int columnIndex)获取指定列上的值差不多常用的就这么多,使用起来非常简单,这里代码省略不写了。
事务是一个不可分割的工作逻辑单元。 多个操作作为一个整体向系统提交,要么执行、要么所有都不执行。
其实即使是一条增删改查操作,在底层也是先开启一个事务。大家想一下,如果插入100条记录呢?是不是要开启100个事务,那样太耗时间了!那么我们可以插入100条语句只开启1次事务吗?当然可以!
步骤1:beginTransaction();开启事务 步骤2:setTransactionSuccessful();设置提交事务 步骤3:endTransaction();关闭事务
文章最后奉上代码,方便大家对照学习。 好了就写到这里吧,希望对大家有所帮助。如果有不明白的请留言。如果觉的我写的不错,请点个赞吧,谢谢! 在技术上我依旧是个小渣渣,加油!勉励自己!
【1】菜鸟教程之SQLite 教程 【2】ANDROID开发之SQLite详解 【3】Android基础-初识SQLite 【4】Android基础教程-SQLite高级操作 【5】android sqlite支持的数据类型 【6】官方文档
