Android黄金篇-SQLite数据库

SQLite

Android SQLite,是一款轻量级的关系型数据库。在很多嵌入式设备都用来存储数据。

SQLite介绍

SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用。

SQLite特点

  • 轻量级
    使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。
  • 独立性
    SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
  • 隔离性
    SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。
  • 跨平台
    SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android和IOS。
  • 多语言接口
    SQLite 数据库支持多语言编程接口。
  • 安全性
    SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。
  • 弱类型的字段
    同一列中的数据可以是不同类型

SQLite数据类型

SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。
您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:

存储类 描述
NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。

传送门

SQLiteDatabase的介绍

Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。

方法 描述
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) 打开或创建数据库
insert(String table,String nullColumnHack,ContentValues values) 插入一条记录
delete(String table,String whereClause,String[] whereArgs) 删除一条记录
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) 查询一条记录
update(String table,ContentValues values,String whereClause,String[] whereArgs) 修改记录
execSQL(String sql) 执行一条SQL语句
close() 关闭数据库

打开或创建数据库

在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库。它会自动去检测是否存在这个数据库,如果存在则打开,不存在则创建一个数据库;创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。

下面是创建名为“stu.db”数据库的代码:
openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
参数1 数据库创建的路径
参数2 一般设置为null就可以了

1
db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);

创建表

创建了一张用户表,属性列为:id(主键并且自动增加)、sname(学生姓名)、snumber(学号)

1
2
3
4
5
6
7
private void createTable(SQLiteDatabase db)
{
// 创建表SQL语句
String stu_table="CREATE TABLE IF NOT EXISTS usertable(_id integer primary key autoincrement,sname text,snumber text)";
// 执行SQL语句
db.execSQL(stu_table);
}

判断数据表是否存在

sqlite_master这个表是系统的表,sqlitedatabase会为每一个数据库创建一个这样的表,目的是用来记录用户自己创建的表的索引。如果用户进行了表的增删改查操作,这个表都会相应的进行索引的改动。通过查询sqlite_master,判断表是否存在。

1
2
3
4
5
6
7
8
9
10
11
12
private boolean isTableExist()
{
String sql = "select count(*) as c from sqlite_master where type ='table' and name = 'tableName'";
Cursor cursor = db.rawQuery(sql, null);
if(cursor.moveToNext())
{
int count = cursor.getInt(0);
if(count>0)
retutrn true;
}
return false;
}

数据表删除

1
2
3
4
5
6
7
private void drop(SQLiteDatabase db)
{
// 删除表的SQL语句
String sql ="DROP TABLE IF EXISTS stu_table";
// 执行SQL
db.execSQL(sql);
}

数据总记录数

1
2
3
4
5
6
7
8
9
10
11
12
13
public long allCaseNum( ){
long count = 0;
// 查询记录数语句
String sql = "select count(*) from tableName";
Cursor cursor = db.rawQuery(sql, null);
if(cursor != null)
{
cursor.moveToFirst();
long count = cursor.getLong(0);
cursor.close();
}
return count;
}

插入数据

两种方式插入数据

  • SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法
    参数1 表名称,
    参数2 空列的默认值
    参数3 ContentValues类型的一个封装了列名称和列值的Map;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void insert(SQLiteDatabase db)
    {
    // 实例化常量值
    ContentValues cValue = new ContentValues();
    // 添加用户名
    cValue.put("sname","xiaoming");
    // 添加密码
    cValue.put("snumber","01005");
    // 调用insert()方法插入数据
    db.insert("stu_table",null,cValue);
    }
  • 编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行

    1
    2
    3
    4
    5
    6
    7
    private void insert(SQLiteDatabase db)
    {
    //插入数据SQL语句
    String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')";
    //执行SQL语句
    db.execSQL(sql);
    }

删除数据

两种方式

  • 调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
    参数1 表名称
    参数2 删除条件
    参数3 删除条件值数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void delete(SQLiteDatabase db) 
    {
    // 删除条件
    String whereClause = "id=?";
    // 删除条件参数
    String[] whereArgs = {String.valueOf(2)};
    // 执行删除
    db.delete("stu_table",whereClause,whereArgs);
    }
  • 编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除

    1
    2
    3
    4
    5
    6
    7
    private void delete(SQLiteDatabase db) 
    {
    // 删除SQL语句
    String sql = "delete from stu_table where _id = 6";
    // 执行SQL语句
    db.execSQL(sql);
    }

修改数据

两种方式

  • 调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
    参数1 表名称
    参数2 跟行列ContentValues类型的键值对Key-Value
    参数3 更新条件(where字句)
    参数4 更新条件数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void update(SQLiteDatabase db) 
    {
    // 实例化内容值
    ContentValues values = new ContentValues();
    // 在values中添加内容
    values.put("snumber","101003");
    // 修改条件
    String whereClause = "id=?";
    // 修改添加参数
    String[] whereArgs={String.valuesOf(1)};
    // 修改
    db.update("usertable",values,whereClause,whereArgs);
    }
  • 编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新

    1
    2
    3
    4
    5
    6
    7
    private void update(SQLiteDatabase db)
    {
    // 修改SQL语句
    String sql = "update stu_table set snumber = 654321 where id = 1";
    // 执行SQL
    db.execSQL(sql);
    }

查询数据

在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句,相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
参数Cursor:返回值,相当于结果集ResultSet

Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.

Cursor游标常用方法

方法 描述
getCount() 获得总的数据项数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录
moveToNext() 移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 根据列名称获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值
getString(int columnIndex) 获得指定列缩影的String类型值

示例:查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void query(SQLiteDatabase db) 
{
// 查询获得游标
Cursor cursor = db.query ("usertable",null,null,null,null,null,null);
// 判断游标是否为空
if(cursor.moveToFirst()
{
// 遍历游标
for(int i=0;i<cursor.getCount();i++)
{
cursor.move(i);
// 获得ID
int id = cursor.getInt(0);
// 获得用户名
String username=cursor.getString(1);
// 获得密码
String password=cursor.getString(2);
// 输出用户信息
System.out.println(id+":"+sname+":"+snumber);
}
}
}

SQLiteOpenHelper

该类是SQLiteDatabase一个辅助类。这个类主要生成一 个数据库,并对数据库的版本进行管理。在特殊情况下,即当打开外部数据库如/sdcard/sqlite.db,则不会执行管理;而一般情况下,即打开/data/data/package/databases/应用里的内部数据库会执行管理。当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。 SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:

  • onCreate(SQLiteDatabase)
    在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。

  • onUpgrade(SQLiteDatabase,int,int)
    当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。

  • onOpen(SQLiteDatabase)
    这是当打开数据库时的回调函数,一般在程序中不是很常使用。

SQLiteOpenHelper操作内部数据库

数据库帮助类SQLiteOpenHelper操作内部数据库时,在应用安装后第一次启动时会执行onCreate方法,在此方法中创建数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class DBUtils extends SQLiteOpenHelper {

protected static final int DB_VERSION = BuildConfig.dbVersion;
public static final String SQLITE_MASTER = "sqlite_master ";

protected SQLiteDatabase mDatabase = null;

public DBUtils(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
try {
mDatabase = getWritableDatabase();
} catch (Exception e) {
mDatabase = getReadableDatabase();
}
}

@Override
public void onCreate(SQLiteDatabase db) {
if (mDatabase == null)
mDatabase = db;
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
mDatabase = db;
}
}

SQLiteOpenHelper操作外部数据库

数据库帮助类SQLiteOpenHelper操作外部数据库时,在应用安装后第一次启动时不会执行onCreate方法

  • 借助ContextWrapper类打开外部数据库,注意数据库文件需要判断是否存在,否则报错

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public class DatabaseContext extends ContextWrapper {

    private String mDBPath = null;

    private DatabaseContext(Context base) {
    super(base);
    }

    public DatabaseContext(Context base, String dbPath) {
    super(base);
    mDBPath = dbPath;
    }

    @Override
    public File getDatabasePath(String name) {
    String dbPath = mDBPath + name;
    if (FileUtils.isFileExists(dbPath)) {
    return new File(dbPath);
    } else {
    return null;
    }
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
    int flags = SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS;
    return SQLiteDatabase.openDatabase(getDatabasePath(name).getAbsolutePath(), factory, flags, null);
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
    int flags = SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS;
    return SQLiteDatabase.openDatabase(getDatabasePath(name).getAbsolutePath(), factory, flags, errorHandler);
    }
    }
  • 创建数据库帮助类,开启数据库操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class UtilDao
    {
    private void initDao()
    {
    // DB_PATH 数据库文件路径,如:/sdcard/db/sqlite.db
    DatabaseContext dbContext = new DatabaseContext(mContext, DB_PATH);
    // 然后创建数据库帮助类,后面的操作与内部数据库一致。参数Context、数据表名、数据库版本号等
    DBUtils dbUtils = new DBUtils(mContext, tableName, null, dbVersion);
    }
    }

Android常用SQLite命令

  • 打开数据库

    1
    > sqlite3 sql.db
  • 查看

    1
    2
    3
    4
    sqlite> .database // 显示数据库信息
    sqlite> .tables // 显示表名
    sqlite> .schema // 命令可以查看创建数据表时的SQL命令
    sqlite> .schema table_name // 查看创建表table_name时的SQL的命令
  • 插入记录

    1
    insert into table_name values (field1, field2, field3...);
  • 删除

    1
    drop table if exists table_name;    // 删除表
  • 修改

    1
    update table set field1='xxxxx' where option1='';
  • 查询

    1
    2
    select * from table_name;	// 查看table_name表中所有记录
    select * from table_name where field1='xxxxx'; // 查询符合指定条件的记录
谢谢老板,请尽情用红包来蹂躏我吧!!!
0%