SQLite

数据库:存储数据的仓库,每一个数据库都可以存在多张数据表

数据表:具体存储数据的表,类似excel表格

常见的数据库有:MS SQL Server、MY SQL、Oracle……

SQLite并不是数据库服务器软件,在开发中,它表现为某1个文件。

查看SQLite数据文件的软件:SQLiteSpy、SQLiteExpert



【初始化过程】

1. 创建数据库

2. 创建数据表

【访问数据流程】

1. 连接到(打开)数据库

2. 访问数据表

创建数据库

方法1:openOrCreateDatabase()


创建数据表

CREATE TABLE '表名' (设计字段列表);

字段列表的格式为:字段(列)名、数据类型、约束

创建数据表示例:

String sql = "CREATE TABLE 'student' (" +

"_id integer primary key autoincrement, " +

"stu_name varchar(16) not null, " +

"stu_phone_number varchar(16) not null unique" +

")";

注意:SQLite是非常轻量级的数据库,所以,SQLite对存储的数据类型要求是不严格的,但是,仍然推荐规范的使用SQLite数据库。

String name = "tedu.db";
int mode = MODE_PRIVATE;
CursorFactory factory = null;
SQLiteDatabase db;
db = openOrCreateDatabase(name, mode, factory);
 
// 创建数据表
String sql = "CREATE TABLE 'student' (" +
        "_id integer primary key autoincrement, " +
        "stu_name varchar(16) not null, " +
        "stu_phone_number varchar(16) not null unique" +
        ")";
db.execSQL(sql);


数据操作:增删改查

增:insert into '表名' (字段列表) values (值列表)

删:delete from '表名' where子句

改:update '表名' set 字段=值的赋值列表 where子句

查:select 字段列表 from '表名' where子句 排序 分页


使用SQLiteDatabase实现数据管理

insert()

  第1个参数:表名

  第2个参数:无视,当确保第3个参数为有效值时,第2个参数没有任何意义

  第3个参数:确定要增加的数据,第3个参数ContentValues对象必须至少调用过1次put方法,即可使得该参数是有效的

  返回值:新记录的ID,如果增加失败,则返回-1

// 无视,当确保第3个参数为有效值时,第2个参数没有任何意义
String nullColumnHack = null;
// 确定要增加的数据
ContentValues values = new ContentValues();
values.put("stu_name", "Alex");
values.put("stu_phone_number", "010-88668866");
// 执行增加数据
long id = db.insert(table, nullColumnHack, values);
if (id != -1) {
Toast.makeText(this, "增加完成,id=" + id, Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "增加失败,原因嘛,不知道", Toast.LENGTH_SHORT).show();
}

delete()

  第1个参数:表名

  第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现

  第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null

  返回值:受影响的行数,即删除的条目数量

eg:

// delete from student where id>1
// delete from student where stu_name='Jack' and
// stu_phone_number='010-88886666'
// 第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现
String whereClause = "stu_name=? and stu_phone_number=?";
// 第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null
String[] whereArgs = { "Jack", "027-66668888" };
int affectedRows = db.delete(table, whereClause, whereArgs);
if (affectedRows > 0) {
Toast.makeText(this, "删除完成,受影响的行数:" + affectedRows,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "删除失败,没有符合删除条件的记录!", Toast.LENGTH_SHORT)
.show();
}

update()

eg:

values = new ContentValues();
values.put("stu_phone_number", "10086");
whereClause = "_id=? and stu_name=?";
whereArgs = new String[] { 5 + "", "Rose" };
affectedRows = db.update(table, values, whereClause, whereArgs);
if (affectedRows > 0) {
Toast.makeText(this, "编辑完成,受影响的行数:" + affectedRows,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "编辑失败,没有符合删除条件的记录!", Toast.LENGTH_SHORT)
.show();
}


【查询数据】

方法:query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

参数说明:

String table:表名

String[] columns:要查询的列(字段),如果为null,则表示查询所有列

String selection:查询条件,即where子句

String[] selectionArgs:查询条件中各问号(?)对应的值

String groupBy:分组子句,暂无视

String having:分组筛选子句,暂无视

String orderBy:排序,例如 _id asc,或 name asc, _id desc

返回值:Cursor

【关于Cursor】

Cursor可以理解为一个表格,表格中是查询出的数据结果。

Cursor在获取数据之前,必须调用move???系列方法确定其位置,然后再获取数据。

推荐使用for循环实现Cursor的遍历:

for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext())

【关于SimpleCursorAdapter】

SimpleCursorAdapter是使用Cursor作为数据源的Adapter。

使用SimpleCursorAdapter时,应该保证在数据源Cursor中存在 _id 字段。

eg:

// 第2个参数,表示要查询的字段的列表,为null值时表示查询所有字段
String[] columns = { "stu_name", "_id", "stu_phone_number" };
// 第3个参数,参考whereClause
String selection = "_id>?";
// 第4个参数,参考whereArgs
String[] selectionArgs = { "0" };
// 第5个参数,分组,暂无视
String groupBy = null;
// 第6个参数,分组后的筛选,暂无视
String having = null;
// 第7个参数,排序,asc表示顺序排列,desc表示倒序排列
String orderBy = "stu_name asc";
// 执行查询
Cursor c = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
    String stuId = c.getString(1);
    String stuName = c.getString(0);
    String stuPhoneNumber = c.getString(2);
    Log.d(tag , "id -> " + stuId);
    Log.d(tag, "name -> " + stuName);
    Log.d(tag, "phone number -> " + stuPhoneNumber);
}

【SQLiteOpenHelper】

SQLiteOpenHelper是用于管理数据库的工具,可以实现创建数据库文件、创建数据表等操作,及数据库版本的升级、降级等。

使用SQLiteOpenHelper类定义的getReadableDatabase()或getWritableDatabase()方法可以获取SQLiteDatabase对象,以实现数据访问操作。

eg:

public class DbOpenHelper extends SQLiteOpenHelper {
    public DbOpenHelper(Context context) {
        super(context, "tarena.db", null, 1);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建数据表student
        String sql = "CREATE TABLE 'student' ("
        + "_id integer primary key autoincrement, "
        + "stu_name varchar(16) not null, "
        + "stu_phone_number varchar(16) not null unique" + ")";
        db.execSQL(sql);
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    }
}

使用SQLite的流程

---------------------------

1. 规划数据库与数据表

2. 自定义类继承自SQLiteOpenHelper,至少重写onCreate()方法,在onCreate()方法中完成所有的初始化操作,例如创建数据表、向数据表中插入默认数据。

3. 创建上述自定义类的对象,调用getReadableDatabase()方法获取SQLiteDatabase对象,以实现数据访问操作。

4. 确定数据访问结束后,关闭相关资源。

你可能感兴趣的:(SQLite)