SQLite概述

一、SQLite特点

Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型,例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数。除非是主键被定义为Integer,这时只能存储64位整数。

创建数据库的表时可以不指定数据类型,例如:

CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))

CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name)

上面两句SQL语句是一样的。

SQLite支持大部分标准SQL语句,增删改查语句都是通用的,分页查询语句和MySQL相同

SELECT * FROM person LIMIT 20 OFFSET 10

SELECT * FROM person LIMIT 10,20

二、创建数据库

定义类继承SQLiteOpenHelper

声明构造函数,4个参数

重写onCreate()方法

重写upGrade()方法

注意:SQLite数据库中列一旦创建不能修改,如果一定要修改,需要重新创建表,拷贝数据

三.   CRUD操作

和JDBC访问数据库不同,操作SQLite数据库无需加载驱动,不用获取连接,直接可以使用

获取SQLiteDatabase对象之后通过该对象直接可以执行SQL语句

SQLiteDatabase.execSQL()

SQLiteDatabase.rawQuery()

getReadableDatabase()和getWritableDatabase()的区别

查看源代码后我们发现getReadableDatabase()在通常情况下返回的就是getWritableDatabase()拿到的数据库,只有在抛出异常的时候才会以只读方式打开

数据库对象缓存。getWritableDatabase()方法最后会使用一个成员变量记住这个数据库对象,下次打开时判断是否重用。

SQLiteDatabase封装了insert()、delete()、update()、query()四个方法也可以对数据库进行操作,这些方法封装了部分SQL语句,通过参数进行拼接。

四、事务管理

在使用SQLite数据库时可以用SQLiteDatabase类中定义的相关方法控制事务

beginTransaction() 开启事务

setTransactionSuccessful() 设置事务成功标记

endTransaction() 结束事务

endTransaction()需要放在finally中执行,否则事务只有到超时的时候才自动结束,会降低数据库并发效率

例子:

public class MyDBOpenHelper extends SQLiteOpenHelper {

       /**
        *
        * @param context 应用程序上下文
        * @param name    数据库的名字
        * @param factory 查询数据库的游标工厂 一般情况下 用sdk默认的
        * @param version  数据库的版本 版本号必须不小1
        *
        */
       public MyDBOpenHelper(Context context) {
              super(context, "itheima.db", null, 5);
       }

       // 在mydbOpenHelper 在数据库第一次被创建的时候  会执行onCreate();
       @Override
       public void onCreate(SQLiteDatabase db) {
              System.out.println("我被调用了 oncreate");
              db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
       }

       @Override
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
              System.out.println("on update ");
              db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL ");
       }
}

MyDBOpenHelper helper = new MyDBOpenHelper(this);

SQLiteDatabase ddatabase = helper.getReadableDatabase();

获取数据库后进行CRUD

常用DAO代码参考:

/**
 * 数据库常用Dao
 */
public class BlackNumberDao {
       private BlackNumberDBOpenHelper helper;
       public BlackNumberDao(Context context) {
              helper = new BlackNumberDBOpenHelper(context);
       }

       /**
        * 查找一条黑名单号码
        */
       public boolean find(String number) {
              boolean result = false;
              SQLiteDatabase db = helper.getReadableDatabase();
              if (db.isOpen()) {
                     Cursor cursor = db.rawQuery(
                                   "select * from blacknumber where number =?",
                                   new String[] { number });
                     if (cursor.moveToFirst()) {
                            result = true;
                     }
                     cursor.close();
                     db.close();
              }
              return result;
       }

       /**
        * 查找一条黑名单号码的拦截模式
        */
       public int findNumberMode(String number) {
              int result = -1;
              SQLiteDatabase db = helper.getReadableDatabase();
              if (db.isOpen()) {
                     Cursor cursor = db.rawQuery(
                                   "select mode from blacknumber where number =?",
                                   new String[] { number });
                     if (cursor.moveToFirst()) {
                            result = cursor.getInt(0);
                     }
                     cursor.close();
                     db.close();
              }
              return result;
       }

       /**
        * 添加一条黑名单号码
        */
       public boolean add(String number, String mode) {
              if (find(number))// 防止添加重复的数据
                     return false;

              SQLiteDatabase db = helper.getWritableDatabase();
              if (db.isOpen()) {
                     db.execSQL("insert into blacknumber (number,mode) values (?,?)",
                                   new Object[] { number, mode });
                     db.close();
              }

              return find(number);
       }

       /**
        * 删除一条黑名单号码
        */
       public void delete(String number) {

              SQLiteDatabase db = helper.getWritableDatabase();
              if (db.isOpen()) {
                     db.execSQL("delete from blacknumber where number=?",
                                   new Object[] { number });

                     db.close();
              }

       }

       /**
        * 更改黑名单号码
        *
        * @param oldnumber 旧的的电话号码
        * @param newnumber 新的号码 可以留空
        * @param mode 新的模式
        */
       public void update(String oldnumber, String newnumber, String mode) {

              SQLiteDatabase db = helper.getWritableDatabase();
              if (db.isOpen()) {
                     if (TextUtils.isEmpty(newnumber)) {
                            newnumber = oldnumber;
                     }
                     db.execSQL(
                                   "update blacknumber set number=?, mode=? where number=?",
                                   new Object[] { newnumber, mode, oldnumber });
                     db.close();
              }
       }

       /**
        * 查找全部的黑名单号码
        * @return
        */
       public List<BlackNumber> findAll() {
              List<BlackNumber> numbers = new ArrayList<BlackNumber>();
              SQLiteDatabase db = helper.getReadableDatabase();
              if (db.isOpen()) {
                     Cursor cursor = db.rawQuery("select number,mode from blacknumber",
                                   null);
                     while (cursor.moveToNext()) {
                            BlackNumber blackNumber = new BlackNumber();
                            blackNumber.setNumber(cursor.getString(0));
                            blackNumber.setMode(cursor.getInt(1));
                            numbers.add(blackNumber);
                            blackNumber = null;
                     }
                     cursor.close();
                     db.close();
              }
              return numbers;
       }
       /**
        * 分页的加载数据
        * @param startindex
        * @param maxresult
        * @return
        */
       public List<BlackNumber> findAllByPage(int startindex ,int maxresult) {
              List<BlackNumber> numbers = new ArrayList<BlackNumber>();
              SQLiteDatabase db = helper.getReadableDatabase();
              if (db.isOpen()) {
                     Cursor cursor = db.rawQuery("select number,mode from blacknumber limit ?,? ",
                                   new String[]{startindex+"",maxresult+""});
                     while (cursor.moveToNext()) {
                            BlackNumber blackNumber = new BlackNumber();
                            blackNumber.setNumber(cursor.getString(0));
                            blackNumber.setMode(cursor.getInt(1));
                            numbers.add(blackNumber);
                            blackNumber = null;
                     }
                     cursor.close();
                     db.close();
              }
              return numbers;
       }
}
 
时间: 2024-10-15 01:35:31

SQLite概述的相关文章

SQLite数据库学习小结(1)

1. SQlite概述 SQLite是一款轻量.快速.跨平台的嵌入式数据库,是遵守ACID(注:ACID指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability))的关系型数据库管理系统,它包含在一个相对小的C库中. SQLite 的设计目标是简单,从这种意义上说,SQLite 和其他很多现代的 SQL 数据库都不相同.SQLite 力求简单,即使这导致了它的某些特征偶尔执行效率比较

SQLite的使用(一):简介及原生SQL操作数据库

一.SQLite概述 SQLite 是一个轻量级的.嵌入式的.关系型数据库.它支持 SQL 语言,开源,可移植性好.它的数据是以单个文件形式存储的,存储位置为data/data/<项目文件夹>/database下. 二.常用类说明 SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库创建.打开.关闭等操作. SQLiteDatabase 数据库访问类:执行对数据库的插入记录.查询记录等操作. Cursor 查询结构操作类:用来访问查询结果中的记录 2.1 SQLit

【sqlite权威指南】笔记1 概述

关系数据库,紧凑的可嵌入的,处理海量数据,支持c.java.Perl.PHP.Python.ruby.tcl等,作为产品组件嵌入到应用程序中 本书主要内容: 将sqlite部署为iphone或android的数据库引擎 通过java.c++.PHP等与sqlite交互 利用主键约束和外键约束,设计健壮的数据库 在应用程序中嵌入无需维护的数据库 理解sqlite内核,改善数据库性能 数据库特性包括共享缓存.SQL逻辑测试集.解锁.通知API .查询计划改善等 典型sqlite产品:火狐浏览器.Ad

Sqlite 基本概念及使用概述

SQLite 是一个开源的嵌入式关系型数据库,是一个自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 具有如下特点: 无需单独的服务器进程,是无服务器的 不需要配置,无需复杂的安装或管理步骤 数据库存储在一个单一的跨平台的磁盘文件中 非常小的,轻量级的 自给自足的,不需要任何外部的依赖 事务是完全兼容 ACID,允许从多个进程或线程安全访问 支持 SQL92(SQL2)标准的大多数查询语言的功能 使用 ANSI-C 编写的,并提供了简单易用 API 兼容类 UNIX

【苦读官方文档】2.Android应用程序基本原理概述

官方文档原文地址 应用程序原理 Android应用程序是通过Java编程语言来写.Android软件开发工具把你的代码和其它数据.资源文件一起编译.打包成一个APK文件,这个文档以.apk为后缀,保存了一个Android应用程序全部的内容.Android设备通过它来安装相应的应用. 一旦安装到设备上.每一个Android应用程序就执行在各自独立的安全沙盒中: Android系统是一个多用户的Linux系统.每一个应用都是一个用户. Android系统默认会给每一个应用分配一个唯一的用户ID(这个

Zabbix功能概述及架构介绍(理论篇)

1.Zabbix的功能概述 1.1 zabbix是什么 Alexei Vladishev创建了Zabbix项目,当前处于活跃的开发状态,Zabbix SIA提供支持. Zabbix是一个企业级的.开源的.分布式的监控套件. Zabbix可以对网络和服务进行监控. Zabbix利用灵活的告警机制,可实现微信.短信和邮件的自动报警.Zabbix利用存储的监控数据提供监控报告及实现图形化显示. Zabbix支持polling和trapping两种方式.所有的Zabbix报告都可以通过配置参数在WEB界

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

sqlite之WAL模式

链接 概述 在3.7.0以后,WAL(Write-Ahead Log)模式可以使用,是另一种实现事务原子性的方法. WAL的优点 在大多数情况下更快 并行性更高.因为读操作和写操作可以并行. 文件IO更加有序化,串行化(more sequential) 使用fsync()的次数更少,在fsync()调用时好时坏的机器上较为未定. 缺点 一般情况下需要VFS支持共享内存模式.(shared-memory primitives) 操作数据库文件的进程必须在同一台主机上,不能用在网络操作系统. 持有多

ios开发:Core Data概述

Core Data 概述 2005年的四月份,Apple 发布了 OS X 10.4,在这个版本中 Core Data 框架发布了.Core Data本身既不是数据库也不是数据库访问框架.相反,Core Data是一个完整的数据模型解决方案.可以简单理解为对持久层的封装,使得我们可以通过可视化建立数据模型,简化数据存取.即使不懂SQL语句,也依然可以使用Core Data.因为Core Data将底层的数据库SQL语句封装成了一套API,并可通过可视化操作来建立数据库的模型和表之间的关系,它甚至