数据库:存储数据的仓库,每一个数据库都可以存在多张数据表
数据表:具体存储数据的表,类似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. 确定数据访问结束后,关闭相关资源。