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()方法都是其父类中的抽象方法。

public class MyHelper extends SQLiteOpenHelper {

@Override

private static String DATABASE_NAME = "alan.db";

private static int DATABASE_VERSION = 2;

public MyHelper(Context context){

super(context,DATABASE_NAME,null,DATABASE_VERSION); //调用父类的构造方法

}

//数据库第一次被创建时调用该方法

public void onCreate(SQLiteDatabase db){

//初始化数据库的表结构,执行一条建表的SQL语句

db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), price INTEGER);

}

//当数据库版本增加时调用

public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){

}

}

//SQLiteOpenHelper类的构造函数有四个参数

//context代表上下文,name是数据库名字,factory是游标工厂,一般情况下为null值,version是数据库版本,软件在今后的升级中会用到。

public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {

this(context, name, factory, version, null);

}

SQLite 数据库使用

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

一、SQLite 基本操作方法 一

1. 增加一条数据

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

public void insert(String name, String price){

SQLiteDatabase db = myHelper.getWritableDatabase(); //获取可写入的 SQLiteDatabase 对象

ContentValues values = new ContentValues(); //创建 ContentValues 对象

values.put("name",name); //将数据添加到ContentValues对象

values.put("price",price);

long id = db.insert("person",null,values); //插入一条数据到person表

db.close(); //关闭数据库

}

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

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

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

2. 修改一条数据

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

public int update(String name, string price) {

SQLiteDatabase db = myHelper.getwritableDatabasel;

ContentValues values = new ContentValues();

values.put ("price", price);

int number = db.update("person",values,"name =?",new String[]{name});

db.close();

return number;

}

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

3. 删除一条数据

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

public int delete(long id) {

SQLiteDatabase db = myHelper.getwritableDatabasel;

int number = db.delete("person",_id =?,"name =?",new String[]{id});

db.close();

return number;

}

从上述代码中可以看出,删除数据不同于增加和修改数据,因为删除数据不需要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; }

//Cursor 中的的重要方法:

c.move(int offset); //以当前位置为参考,移动到指定行

c.moveToFirst(); //移动到第一行

c.moveToLast(); //移动到最后一行

c.moveToPosition(int position); //移动到指定行

c.moveToPrevious(); //移动到前一行

c.moveToNext(); //移动到下一行

c.isFirst(); //是否指向第一条

c.isLast(); //是否指向最后一条

c.isBeforeFirst(); //是否指向第一条之前

c.isAfterLast(); //是否指向最后一条之后

c.isNull(int columnIndex); //指定列是否为空(列基数为0)

c.isClosed(); //游标是否已关闭

c.getCount(); //总数据项数

c.getPosition(); //返回当前游标所指向的行数

c.getColumnIndex(String columnName);//返回某列名对应的列索引值,如果不存在返回-1

c.getString(int columnIndex); //返回当前行指定列的值

c·getColumnIndexOrThrow(String columnName) //从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。

c.close() //关闭游标,释放资源

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

二、SQLite 基本操作方法 二

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

1. 增加一条数据

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

2. 修改一条数据

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数据库isnull,Android中SQLite数据库知识点总结相关推荐

  1. android模拟器的数据存放,Android模拟器在哪里存储SQLite数据库?

    Android模拟器在哪里存储SQLite数据库? 我正在开发一个将数据存储在SQLite数据库中的Android应用程序. 我的问题是,当您使用模拟器时,此数据库文件存储在文件系统中的哪个位置? 我 ...

  2. android打开sqlite数据库,Android:打开和关闭SQLite数据库

    我正在开发和android应用程序,我经常使用它访问本地数据库.这个数据库可以从不同的therads访问,所以我对数据库有一个协调问题.我使用以下open()和close()方法.Android:打开 ...

  3. Android中SQLite数据库查看及导入导出

    Android中可以采用SQLite数据库来存储数据,可是Google却没有直接给我们提供相关工具来管理数据库里的数据. 如果不能直接通过工具来查看,那我们就把数据库从手机/模拟器里面拷贝出来用工具查 ...

  4. android中Sqlite数据库存储

    1.activity_sql.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  5. Android内部自带的SQLite数据库操作dos命令

    1:什么叫做SQLite数据库 Android系统内核是Linux系统,Android系统很特殊,他自带了一个SQLite数据库,轻量型的一款嵌入式的数据库 它占用资源非常的低,在嵌入式设备中,可能只 ...

  6. android studio SQLScout插件查看sqlite数据库

    SQLScout (SQLite Support) SQLScout (SQLite Support) 是android studio集成开发工具中查看SQLite数据库的插件. 1.安装 file- ...

  7. Android 用户信息管理程序【SQLite数据库、多选框、单选按钮】

    创建一个名为"学号+姓名"的用户信息管理程序,该程序用于输入.保存.列表展示和选择删除. "用户信息管理"程序录入界面对应布局文件的图形化视图,如下图所示. 目 ...

  8. java sqlite 多线程并发_Android中Sqlite数据库多线程并发问题

    最近在做一个Android项目, 为了改善用户体验,把原先必须让用户"等待"的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. ...

  9. Sql Server数据库数据导入到SQLite数据库中

    背景:Sql Serve数据库中有个表格A,想把数据导入到SQLite数据库中 工具下载地址:点击打开链接 用法: 原作者地址及下载地址:点击打开链接

最新文章

  1. 之前遇到一位老面试官,问我的问题真的有点东西
  2. greenplum 存储过程_如何使用Greenplum提升PB级数据处理能力
  3. Linux下Java Font 中文字体不显示
  4. 201521123070 《JAVA程序设计》第2周学习总结
  5. MySQL字符串和二进制
  6. 222. 完全二叉树的节点个数 golang
  7. 一行指令造成 60 亿美元蒸发,更让 Facebook 遭遇史诗级故障!
  8. Calendar的api方法
  9. 网络协议从入门到底层原理(9)HTTP/1.1的升级改进(HTTP/2、HTTP/3)
  10. 大华股份2021年的半年报
  11. C++ 各种数据类型须知
  12. pycharm 变量批量重命名
  13. [高通MSM8909][Android7.1]电信卡信号优化
  14. Linux发行版列表
  15. IDEA maven项目使用Junit报错 java: 程序包org.junit不存在
  16. 考研的意义---解读
  17. 如何禁用笔记本键盘输入?屏蔽掉笔记本键盘
  18. 【结构化思考】边缘计算架构 3D模型参考
  19. fhq treap入门
  20. 产品经理有没有考PMP的必要?过来人告诉你

热门文章

  1. Docker容器的备份与恢复,Docker镜像的备份与恢复
  2. mysql64如何配置_win7 64位下如何安装配置mysql-winx64(安装记录)
  3. README 规范和项目文档规范
  4. 前端Vue学习之路(二)-Vue-router路由
  5. 用乐观的心态去面对生活,能让你的生活过得更加快乐
  6. 解决plsql中文显示问号(???)问题
  7. bootstrap上传文件美化
  8. nvGRAPH三角形计数和遍历示例
  9. 使用TensorRT集成推理inference
  10. 如何评估两张图片的差异