android中与SQLite数据库相关的类

时间:2022-04-07 06:21:09

为什么要在应用程序中使用数据库?
数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆算法来操作数据结构。

android系统集成了一个轻量级的关系型数据库:SQLite,从本质上讲,SQLite数据库在底层其实就是一个数据库文件,当我们打开SQLite数据库时,其实只是打开与之对应的数据库文件进行读写,所以说SQLite数据库的操作本质上只是一种更为便捷的文件操作。android系统中与SQLite数据库相关的类主要有三个:
SQLiteDatabase
SQLiteOpenHelper
Cursor

现分别对其一一做介绍:
1 SQLiteDatabase:

在应用程序中,我们无法通过sqlite shell直接输入命令来操作数据库,所以android系统提供了SQLiteDatabase类,该类提供的大量的API来操控SQLite数据库,每一个SQLiteDatabase的实例就代表了一个数据库(对应底层的一个数据库文件),一旦应用程序获得了SQLiteDatabase对象,就可以通过该对象来操作与之相对应的数据库。

SQLiteDatabase提供了许多方法用来管理SQLite数据库.主要的方法有:

打开或创建数据库相关的方法:
static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)
static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)
static SQLiteDatabase openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory)

path:代表了要打开数据库文件。

factory: (一个可选的工厂类,当执行数据库查询语句时(即select语句),该参数会
          被调用,用来实例化一个cursor对象,如果为null则表示使用系统默认的工厂来实例化cursor对象。

flag: 该参数的值可以是:OPEN_READWRITE,OPEN_READONLY,CREATE_IF_NECESSARY.分别代表读写,只读,
                        数据库不存在则创建。

2 操作数据库相关的方法:
void execSQL(String sql)
void execSQL(String sql, Object[] bindArgs)
Cursor rawQuery(String sql, String[] selectionArgs)

前两个方法用来执行无返回值的sql语句,比如create table ,drop table,alter table ,insert into,delete from,update,分别代表数据库表的增删改和记录的增删改命令
void execSQL(String sql)用来执行无占位符的sql语句,例如,如下两行代码将在数据库创建一个名为person_info的表:

String sql = "create table person_info (_id integer primary key, name text, age integer)";
db.execSQL(sql);

void execSQL(String sql, Object[] bindArgs)用来执行带占位符的sql语句,例如:
String sql = "insert into person_info (name,age) values(?,?)";
db.execSQL(sql,new Object[]{"孙悟空",500});

第一个参数sql代表了带占位符的sql语句。第二个参数指定占位符的值。

Cursor rawQuery(String sql, String[] selectionArgs)方法执行带占位符的数据库查询语句(即select语句),该方法返回一个Cursor对象用来遍历数据库查询语句的结果集(select语句的结果其实质就是一张表,select语句其实就是以一个或多个表作为输入,经过一些列处理,产生一个新的表作为输出而已。)

备注:为什么需要带占位符的sql语句?
例如:
db.execSQL("insert into person(name, age) values('安桌', 4)");
该sql语句用来向persron表中插入一行记录。但实际应用中, 语句中类似“安桌”这些参数值往往来自用户UI界面,如果把用户输入的内容原样组拼到上面的insert语句,当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。为决绝类似的问题,SQLiteDatabase提供void execSQL(String sql)方法,用来执行带占位符的sql语句。

除此之外SQLiteDatabase还提供一大堆诸如insert,delete,updata,query的方法。其实这些方法都可以通过执行sql语句来实现。之所以提供这些方法,主要是android考虑到部分开发者对sql语法不熟悉,所以提供了这些方法来帮助开发者操作SQLite数据库,对于熟悉sql语法的开发者而言,完全可以忽略此类方法。
有关SQLite的粗略介绍,可参见:
SQlite学习笔记

2 Cursor

Cursor接口提供了一个随机访问的通道,通过这个通道来访问数据库查询语句(select语句)的结果集。android系统不要求Cursor接口的实现类是同步的,因此开发者在在使用Cursor的多线程代码中应该执行自己的同步操作。

所以Curosr其实就是一个工具类,其用途就是用来访问数据库查询语句的结果集。有过数据库基础的都知道:select语句的结果集其实就是一张表,由若干行和若干列组成,每一个行被称为记录,每一列被称为字段。
Cursor对象中包含一个记录指针,用来指向结果集中的某一行记录,Cur对象提供了一大堆的方法用来操作结果集,根据用途主要分两类:

1 与Cursor记录指针相关的方法:
abstract boolean moveToFirst()    //记录指针移到第一行
abstract boolean moveToLast()     //记录指针移到最后一行
abstract boolean moveToNext()     //记录指针移到下一行
abstract boolean moveToPrevious()  //记录指针移到上一行
abstract boolean moveToPosition(int position)    //记录指针移到指定行
abstract boolean move(int offset)  / /记录指针从当前位置向前或向后移动指定的行数,offset正数时向后移动,为负时向前移动。
abstract int getPosition()        //返回记录指针当前位置 0代表第一行。.
abstract int getCount()         //返回结果集中的记录总数。

备注:执行数据库查询语句返回的Cursor对象,其初始状态下记录指针指向的是第一行记录的前一个位置,通过调用getPosition()返回-1即可知。

2 其它一大堆都是用来读取指定字段值得方法getXxx().
abstract int getColumnCount()       //返回结果集的列数(即结果集中每一行记录包含了多少个字段)

getColumnIndex(String columnName)     //根据字段名返回该字段在结果集中的索引值(第一列为0,第二列为1,依次类推),如该字段不存在则返回-1.

getColumnName(int columnIndex)       //根据索引值获取该字段的字段名。

abstract int getType(int columnIndex)     //获得指定字段的类型,整形常量值FIELD_TYPE_BLOB,FIELD_TYPE_FLOAT,FIELD_TYPE_INTEGER,FIELD_TYPE_NULL,FIELD_TYPE_STRING 分别表示布尔类型,实数类型,整形,null,字符串类型。

其它都是getXxx()方法.

总结:如何通过Cursor对象读取结果集中的m行n的值呢?
其实非常简单,首先将Cursor的记录指针移动到m行,然后通过getXxx(n)方法读取指定字段的值即可。

遍历数据库结果集的的一般方法:

while(cursor.moveToNext())
{
    //getXxx()读取指定列的值
}

3 SQLiteOpenHelper

SQLiteOpenHelper是一个助手类,用来管理数据库的创建和版本更新。SQLiteOpenHelper是一个抽象类,一般的用法是创建它的子类,并覆写onCreate(SQLiteDatabase db),onUpgrade(SQLiteDatabase, int, int)方法,然后该类负责数据库的打开(如果数据库存在)和创建(如果数据库不存在),以及数据库的更新。

SQLiteOpenHelper常用方法介绍:
与打开关闭数据库相关的方法:

SQLiteDatabase getWritableDatabase()   //以读写的方式打开数据库,并返回该数据库所对应的SQLiteDatabase对象。synchronized void close()    //关闭数据库

public abstract void onCreate(SQLiteDatabase db)   //Called when the database is created for the first time. This is where the creation of tables and the initial population of the tables should happen.

onCreate(SQLiteDatabase db)方法是一个回调方法。当应用程序第一次调用getReadableDatabase()或getWritableDatabase方法来打开数据库时,此时数据库不存在,于是系统就会回调该方法用来创建和初始化数据库的值。所以通常onCreate方法()用来执行数据库的建表,及数据初始化的地方。

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法同样也是一个回调方法。当我们在应用程序中创建SQLiteOpenHelper的实例且指定的数据库版本比原来的版本高时,系统就会回调该方法。

android应用程序中使用SQLite数据库的步骤:
1 第一步定义一个SQLiteOpenHelper的子类XxxDBHelper,并覆写OnCreate(SQLiteDatabase db)方法。
2 根据需要在XxxDBHelper类中添加记录的增删改查方法。
3 在需要获取数据库数据的activity中创建XxxDBHelper的实例,并调用其方法操作数据库。

android中与SQLite数据库相关的类的更多相关文章

  1. android中滑动SQLite数据库分页加载

    今天用到了android中滑动SQlit数据库分页加载技术,写了个测试工程,将代码贴出来和大家交流一下: MainActivity package com.example.testscrollsqli ...

  2. Android中操作SQLite数据库

    我又回到了安卓的学习当中,忙来忙去终于忙的差不多有时间做自己的事情了,这感觉实在是太棒了!!本来想写android的控件以及他们的监视器的,但是我查了查android的手册,基本上都能查到,但是查有些 ...

  3. android中的SQLite数据库

    SQLite是android中集成的一个轻量级的数据库,该数据库支持绝大部分SQL92语法 SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQ ...

  4. 在Android 开发中使用 SQLite 数据库笔记

    SQLite 介绍   SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PH ...

  5. Android 开发中使用 SQLite 数据库

    SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能. 此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP ...

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

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

  7. 在 Android 应用程序中使用 SQLite 数据库以及怎么用

    part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...

  8. Android虚拟机中的sqlite数据库文件

    Android虚拟机中的sqlite数据库文件 ①

  9. Android版本升级同时Sqlite数据库的升级及之前数据的保留

    http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...

随机推荐

  1. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  2. java 性能优化(代码优化)

    参考博文: java 性能优化:35 个小细节,让你提升 java 代码的运行效率

  3. thymeleaf的常见用法

    1,th:属性名="",就可以直接修改控件的属性,比如 <input th:type="button" th:name="xinxin&quot ...

  4. mfc 连连看3&period;2 修改器

    内涵图 连连看3.2下载

  5. matplotlib 显示中文 与 latex冲突

    如果在使用中文之前包含了使用latex的语法: mpl.rcParams['text.usetex'] = True 将不能正确显示含有中文的图片. 附 显示中文的方法: from matplotli ...

  6. jqgrid在colModel中多次调用同一个字段值

    Debug: 代码1: { name : 'input', index : 'input', width : 100, align : "center", formatter : ...

  7. 通过Application传递数据代码

    使用Application传递数据步骤如下:创建新class,取名MyApp,继承android.app.Application父类,并在MyApp中定义需要保存的属性     在整个Android程 ...

  8. JAVA编程心得-多态设计初步

    面向对象的思想中,封装,继承,多态作为特性会在开发中广泛应用,一个健壮的系统除了功能强大以外,它的可扩展性应该也很强,多态恰好应用了这个思路. 下面我以杨小聪去某地的方式为例,我们知道首先杨小聪要去某 ...

  9. ios控制器modal跳转

    1. http://www.cnblogs.com/smileEvday/archive/2012/05/29/presentModalViewController.html 2012年5月- Pre ...

  10. poj 1328 Radar Installation &lpar;简单的贪心&rpar;

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42925   Accepted: 94 ...