SQLite 数据库简介

  SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本。它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需要占用几百kB的存储空间,这也是Android移动设备采用SQLite数据库的重要原因之一。

  SQLite 是遵守ACID的关系型数据库管理系统。这里的ACID是指数据库事务正确执行的4个基本要素,即原子性(Atomicity)、致性 ( Consistency)、 隔离性( lolation). 持久性( Durabilily )。它能够支持Windows/Linux/UNIX等主流的操作系统,能够跟很多程序语言,例如Tcl、C#、PHP、 Java等相结合。比起Mysql、PostgreSQL 这两款开源数据库管理系统来讲,SQLite的处理速度更快。

  SQLite 没有服务器进程,它通过文件保存数据,该文件是跨平台的,可以放在其他平台中使用。并且在保存数据时,支持null(零) 、integer (整数)、real (浮点数字) 、text (字符串文本)和blob(二进制对象)5种数据类型。但实际上SQLite也接收varchar(n)、 char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转换成对应的5种数据类型。因此,可以将各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型。

SQLite 数据库创建

  在Android系统中,创建SQLite数据库是非常简单的。Android系统推荐使用 SQLiteOpenHelper 的子类创建数据库,因此需要创建一个继承自SQLiteOpenHelper,并重写该类中的onCreate()方法和onUpgrade()方法即可。

  为什么要使用SQLiteOpenHelper的子类呢,因为SQLiteOpenHelper为抽象类(abstract),必须使用其子类进行继承,同时还需要重写父类的抽象方法,onCreate()方法和onUpgrade()方法都是其父类中的抽象方法。

 1 public class MyHelper extends SQLiteOpenHelper {
2 @Override
3 private static String DATABASE_NAME = "alan.db";
4 private static int DATABASE_VERSION = 2;
5 public MyHelper(Context context){
6 super(context,DATABASE_NAME,null,DATABASE_VERSION); //调用父类的构造方法
7 }
8
9 //数据库第一次被创建时调用该方法
10 public void onCreate(SQLiteDatabase db){
11 //初始化数据库的表结构,执行一条建表的SQL语句
12 db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), price INTEGER);
13
14 }
15 //当数据库版本增加时调用
16 public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
17
18 }
19 }
1 //SQLiteOpenHelper类的构造函数有四个参数
2 //context代表上下文,name是数据库名字,factory是游标工厂,一般情况下为null值,version是数据库版本,软件在今后的升级中会用到。
3 public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
4   this(context, name, factory, version, null);
5 }

SQLite 数据库使用

  前面介绍了SQLite 数据库及如何创建数据库,接下来将针对SQLite数据库的增、删、改、查操作进行详细讲解。

一、SQLite 基本操作方法 一

1. 增加一条数据

  下面以 alan.db 数据库中的person表为例,介绍如何使用 SQLiteDatabase对象的insert()方法向表中插入一条数据,示例代码如下。

1 public void insert(String name, String price){
2 SQLiteDatabase db = myHelper.getWritableDatabase(); //获取可写入的 SQLiteDatabase 对象
3 ContentValues values = new ContentValues(); //创建 ContentValues 对象
4 values.put("name",name); //将数据添加到ContentValues对象
5 values.put("price",price);
6 long id = db.insert("person",null,values); //插入一条数据到person表
7 db.close(); //关闭数据库
8 }

  在上述代码中,通过getWritableDatabase()方 法得到SQLiteDatabase对象,然后获得ContentValues对象并将数据添加到ContentValues对象中,最后调用inser()方法将数据插入到person表中。

  insert()方法接收3个参数,第一个参数是数据表的名称,第二个参数表示如果发现将要插入的行为空行时,会将这个列名的值设为null,第三个参数为ContentValues对象。ContentValues类类似于Map类,通过键值对的形式存入数据,这里的key表示插入数据的列名,value 表示要插入的数据。

  需要注意的是,使用完SQLiteDatabase对象后定要调用close()方法关闭,否则数据库连接会一直存在,不断消耗内存,当系统内存不足时将获取不到SQLiteDatabase对象,并且会报出数据库未关闭异常。

2. 修改一条数据

  下面介绍如何使用SQLiteDatabase的update()方法修改person表中的数据,示例代码如下。

1 public int update(String name, string price) {
2 SQLiteDatabase db = myHelper.getwritableDatabasel;
3 ContentValues values = new ContentValues();
4 values.put ("price", price);
5 int number = db.update("person",values,"name =?",new String[]{name});
6 db.close();
7 return number;
8 }

  

  在上述代码中,通过SQLiteDatebase对象db调用update()方法用来修改数据库中的数据,update()方法接收4个参数,第一个参数表示表名,第二个参数接收一个ContentValues对象,第三个参数可选择where语句,第四个参数表示whereClause语句中的占位参数列表,这些字符串会替换掉where条件中的 " ? "。

3. 删除一条数据

  下面介绍如何使用SQLiteDatabase的delete()方法修改person表中的数据,示例代码如下。

1  public int delete(long id) {
2 SQLiteDatabase db = myHelper.getwritableDatabasel;
3 int number = db.delete("person",_id =?,"name =?",new String[]{id});
4 db.close();
5 return number;
6 }

  从上述代码中可以看出,删除数据不同于增加和修改数据,因为删除数据不需要ContentValues来添加数据。

4. 查询一条数据

  在进行数据查询时使用的是SQLiteDatabase的query0方法,该方法返回的是一个行数集合Cursor。 Cursor 是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等,通过这些方法可以获取集合中的属性值以及序号等。

  需要注意的是,在使用完Cursor对象后,一定要及时关闭,否则会造成内存泄露。下面介绍如何使用SQLiteDatabase的query()方法查询数据,示例代码如下。

public boolean find(long id) {
SQLiteDatabase db = helper .getReadableDatabase ();//获取可读取的 SQLiteDatabase 对象
Cursor cursor = db.query("person", null,“_id =?", new String[]{id}),null, null, null) ; boolean result = cursor.moveToNext () ; cursor.close(); // 关闭游标  db.close() ; return result; }
 1 //Cursor 中的的重要方法:
2
3 c.move(int offset); //以当前位置为参考,移动到指定行
4 c.moveToFirst(); //移动到第一行
5 c.moveToLast(); //移动到最后一行
6 c.moveToPosition(int position); //移动到指定行
7 c.moveToPrevious(); //移动到前一行
8 c.moveToNext(); //移动到下一行
9 c.isFirst(); //是否指向第一条
10 c.isLast(); //是否指向最后一条
11 c.isBeforeFirst(); //是否指向第一条之前
12 c.isAfterLast(); //是否指向最后一条之后
13 c.isNull(int columnIndex); //指定列是否为空(列基数为0)
14 c.isClosed(); //游标是否已关闭
15 c.getCount(); //总数据项数
16 c.getPosition(); //返回当前游标所指向的行数
17 c.getColumnIndex(String columnName);//返回某列名对应的列索引值,如果不存在返回-1
18 c.getString(int columnIndex); //返回当前行指定列的值
19 c·getColumnIndexOrThrow(String columnName) //从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
20 c.close() //关闭游标,释放资源

  在上述代码中,介绍了使用query()方法查询person表中的数据,query()方法接收7个参数,第一个参数表示表名称,第二个参数表示查询的列名,第三个参数接收查询条件子句,第四个参数接收查询子句对应的条件值,第五个参数表示分组方式,第六个参数接收having条件,即定义组的过滤器,第七个参数表示排序方式。

二、SQLite 基本操作方法 二

  这种操作方法类似于执行SQL语句 (语法和SQL server类似)。

1. 增加一条数据

1 db.execSQL("insert into perosn (name, price) values(?,?)",new String[]{name,price})

2. 修改一条数据

1 db.execSQL("update person set price =? where name =?", new String[]{price,name});

3. 删除一条数据

db.execSQL("delete from person where _id = ?",new String[]{id});

4. 查询一条数据

Cursor cursor = db.rawQuery("select _id,name,price from person where id =?",new String[]{id});

  从上述代码可以看出,查询操作与增、删、改操作有所不同,前面三个操作都是通过execSQL()方法执行SQL语句,而查询操作使用的是rawQuery()方法。这是因为查询数据库会返回一个结果集Cursor,而execSQL()方法则没有返回值。

Android SQLite 数据库学习的更多相关文章

  1. Android sqlite数据库存取图片信息

    Android sqlite数据库存取图片信息 存储图片:bitmap private byte[] getIconData(Bitmap bitmap){ int size = bitmap.get ...

  2. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  3. Android Sqlite 数据库版本更新

      Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...

  4. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  5. 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持

    IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...

  6. Android——SQLite/数据库 相关知识总结贴

    android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...

  7. 21.Android之SQLite数据库学习

    Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...

  8. Android数据存储之SQLite 数据库学习

    Android提供了五种存取数据的方式 (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQLite数据库,存放各种数据, ...

  9. android: SQLite 数据库的最佳实践

    6.5.1    使用事务 前面我们已经知道,SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操 作要么全部完成,要么一个都不会完成.那么在什么情况下才需要使用事务呢?想象以下场 景, ...

随机推荐

  1. 【转】网上看到的“12个非常有用的JavaScript技巧”

    1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true.对于做这样的检查,你可以使用!!(双重否定运算符),它能自动将任何类型的数据转 ...

  2. spring 切入点表达式

    spring表达式有多种的指示符,如: 切入点指示符用来指示切入点表达式目的,,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下: exe ...

  3. 如何识别企业内的“千里马”?

    很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...

  4. Java NIO Scatter / Gather

    原文链接:http://tutorials.jenkov.com/java-nio/scatter-gather.html Java NIO发布时内置了对scatter / gather的支持.sca ...

  5. Java 8 文件操作(转)

    我们知道在JDK6甚至之前的时候,我们想要读取一个文本文件也是非常麻烦的一件事,而现在他们都变得简单了, 这要归功于NIO2,我们先看看之前的做法: 读取一个文本文件 BufferedReader b ...

  6. java 23种设计模式教程

    设计模式分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模 ...

  7. Java公开课-03.内部类

    一.内部类的作用 1.实现了类的隐藏 2.实现了多重继承 3.内部类拥有外部类所拥有的属性和方法的访问权限 4.避免修改接口的时候出现同名方法 二.内部类--成员内部类 1.如果我们想访问内部类,我们 ...

  8. Ribbon负载均衡策略配置

    在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接 ...

  9. Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方

    转自https://www.cnblogs.com/qiumingcheng/p/7126281.html 先说明一下好处有哪些:1,如果你想 new 一个空的 List ,而这个 List 以后也不 ...

  10. 把List<string>集合,编程string,并以“,”号分割

    List<int> roleIdList = GetRoleIdList(user.ID); string roleIdsStr = ""; if (roleIdLis ...