SQLite介绍


SQLiteDatabasel类介绍


数据操作是指对数据的添加、删除、查找和更新(CRUD)的操作。通过执行SQL命名完成数据操作,但推荐使用Android提供的专用类和方法,这些类和方法更加简洁、易用。

在上述实现了创建数据库的DBAdapter类的基础上,为了使DBAdapter类支持对数据的添加、删除、更新和查找等功能,在DBAdapter类中增加下面的这些方法:

 insert(People people)用来添加一条数据。
 queryAllData()用来获取全部数据。
 queryOneData(long id)根据id获取一条数据。
 deleteAllData()用来删除全部数据。
 deleteOneData(long id)根据id删除一条数据。
 updateOneData(long id , People people)根据id更新一条数据。

代码清单7-37  DBAdapter

public class DBAdapter {
 public long insert(People people) {}
 public long deleteAllData() { }
 public long deleteOneData(long id) { }
 public People[] queryAllData() {}
 public People[] queryOneData(long id) { }
 public long updateOneData(long id , People people){ }
 
 private People[] ConvertToPeople(Cursor cursor){}
}

其中,ConvertToPeople(Cursor cursor)是私有方法,作用是将查询结果转换为用来存储数据的自定义People类对象。

首先就来介绍一下自定义的People类。People类包含4个公共属性,分别为ID、Name、Age和Height,对应数据库中的4个属性值。覆盖Object中的toString()方法,主要是为了便于界面显示的需要。People类的代码如代码清单7-38所示。

代码清单7-38  People类

 public class People {
  public int ID = -1;
  public String Name;
  public int Age;
  public float Height;
  
  @Override
  public String toString(){
   String result = "";
   result += "ID:" + this.ID + ",";
   result += "姓名:" + this.Name + ",";
   result += "年龄:" + this.Age + ", ";
   result += "身高:" + this.Height + ",";
   return result;
  }
}

下面分别介绍如何使用SQLiteDatabase类的公共方法,完成数据的添加、删除、更新和查询等数据操作。

SQLiteDatabase类的公共方法insert()、delete()、update()和query(),封装了执行的添加、删除、更新和查询功能的SQL命令。

1.添加功能

首先构造一个ContentValues对象;其次调用ContentValues对象的put()方法,将每个属性的值写入ContentValues对象中;最后使用SQLiteDatabase对象的insert()方法,将ContentValues对象中的数据写入指定的数据库表中。

insert()方法的返回值是新数据插入的位置,即ID值。ContentValues类是一个数据承载容器,主要用来向数据库表中添加一条数据。

代码清单7-39  insert

public long insert(People people) {
 ContentValues newValues = new ContentValues();
 
 newValues.put(KEY_NAME, people.Name);
 newValues.put(KEY_AGE, people.Age);
 newValues.put(KEY_HEIGHT, people.Height);
 
 return db.insert(DB_TABLE, null, newValues);
}

在上述代码中,第4行代码向ContentValues对象newValues中添加一个名称/值对,put()方法的第1个参数是名称,第2个参数是值;在第8行代码的insert()方法中,第1个参数是数据表的名称,第2个参数是在NULL时的替换数据,第3个参数是需要向数据库表中添加的数据。

2.删除功能

删除数据比较简单,只需要调用当前数据库对象的delete()方法,并指明表名称和删除条件即可。

代码清单7-40  删除

public long deleteAllData() {
 return db.delete(DB_TABLE, null, null);
}
public long deleteOneData(long id) {
 return db.delete(DB_TABLE,  KEY_ID + "=" + id, null);
}

其中,delete()方法的第1个参数是数据库的表名称,第2个参数是删除条件。在第2行代码中,删除条件为null,表示删除表中的所有数据;第6行代码指明了需要删除数据的id值,因此deleteOneData()方法仅删除一条数据,此时delete()方法的返回值表示被删除的数据的数量。

3.更新功能

更新数据同样要使用ContentValues对象,首先构造ContentValues对象,其次调用put()方法将属性的值写入ContentValues对象中,最后使用SQLiteDatabase对象的update()方法,并指定数据的更新条件。

代码清单7-41  更新

public long updateOneData(long id , People people){
 ContentValues updateValues = new ContentValues();  
 updateValues.put(KEY_NAME, people.Name);
 updateValues.put(KEY_AGE, people.Age);
 updateValues.put(KEY_HEIGHT, people.Height);
 
 return db.update(DB_TABLE, updateValues,  KEY_ID + “=” + id, null);
}

在代码的第7行中,update()方法的第1个参数表示数据表的名称,第2个参数是更新条件,update()方法的返回值表示数据库表中被更新的数据数量。

4.查询功能

首先介绍Cursor类。在Android系统中,数据库查询结果的返回值并不是数据集合的完整复制,而是返回数据集的指针,这个指针就是Cursor类。Cursor类支持在查询的数据集合中多种移动方式,并能够获取数据集合的属性名称和序号。

Cursor类的方法和说明如表7-8所示。

表7-8  Cursor类的方法和说明


方法 说明
moveToFirst 将指针移动到第一条数据上,返回boolean类型值,为true表示指针移动成功
moveToNext 将指针移动到下一条数据上,返回boolean类型值,为true表示指针移动成功
moveToPrevious 将指针移动到上一条数据上,返回boolean类型值,为true表示指针移动成功
getCount 获取集合的数据数量
getColumnIndexOrThrow 返回指定属性名称的序号,如果属性不存在则产生异常
getColumnName 返回指定序号的属性名称
getColumnNames 返回属性名称的字符串数组
getColumnIndex 根据属性名称返回序号
moveToPosition 将指针移动到指定的数据上,返回boolean类型值,为true表示指针移动成功
getPosition 返回当前指针的位置
 从Cursor中提取数据可以参考ConvertToPeople()方法的实现方法,具体代码如代码清单7-42所示。

代码清单7-42  从Cursor中提取数据

private People[] ConvertToPeople(Cursor cursor){
 int resultCounts = cursor.getCount();
 if (resultCounts == 0 || !cursor.moveToFirst()){
  return null;
 }
 People[] peoples = new People[resultCounts];
 for (int i = 0 ; i<resultCounts; i++){
  peoples[i] = new People();
  peoples[i].ID = cursor.getInt(0);
  peoples[i].Name=cursor.getString(cursor.getColumnIndex(KEY_NAME));
  peoples[i].Age = cursor.getInt(cursor.getColumnIndex(KEY_AGE));
  peoples[i].Height=cursor.getFloat(cursor.getColumnIndex(KEY_HEIGHT));
  cursor.moveToNext();
 }
 return peoples;
}

在提取Cursor数据的数据前,推荐测试Cursor中的数据数量,避免在数据获取中产生异常,例如,代码的第3行到第5行。从Cursor中提取数据使用类型安全的get<Type>()方法,方法的输入值为属性的序号,为了获取属性的序号,可以使用getColumnIndex()方法获取指定属性的序号,如代码的第10行到第12行。

要进行数据查询就需要调用SQLiteDatabase类的query()方法,query()方法的语法如代码清单7-43所示。

代码清单7-43  query语法

Cursor android.database.sqlite.SQLiteDatabase.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

query()方法的参数说明如表7-9所示。

表7-9  query()方法的参数


位置 类型+名称 说明
1 String table 表名称
2 String[] columns 返回的属性列名称
3 String selection 查询条件
4 String[] selectionArgs 如果在查询条件中使用的问号,则需要定义替换符的具体内容
5 String groupBy 分组方式
6 String having 定义组的过滤器
7 String orderBy 排序方式
 根据id查询数据的代码如代码清单7-44所示。

代码清单7-44  根据id查询数据的代码

public People[] getOneData(long id) {
 Cursor results =  db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT}, KEY_ID + "=" + id, null, null, null, null);
 return ConvertToPeople(results);
}

查询全部数据的代码如代码清单7-45所示。

代码清单7-45  查询全部数据的代码

public People[] getAllData() { 
 Cursor results = db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT}, null, null, null, null, null);
 return ConvertToPeople(results);
}


SQLiteDatabase表示一个数据库,可以通过增加,删除,修改,查询等相关的sql 命令进行操作,同时也支持通用的一部分 sql 指令。 SQLiteDatabase 类为我们提供了很多种方法,而较常用的方法如下 :


/执行一个 SQL 语句,可以是一个 select 或其他的 sql 语句

(void) execSQL(String sql)

//关闭数据库

(void) close()


//查询指定的数据表返回一个带游标的数据集

(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

//运行一个预置的 SQL 语句,返回带游标的数据集(与上面的语句最大的区别就是防止 SQL 注入)

(Cursor) rawQuery(String sql, String[] selectionArgs)


 SQLiteOpenHelper

SQLiteOpenHelper  SQLiteDatabase 的一个帮助类,用来管理数据库的创建和版本的更新。

一般是建立一个类继承它,并实现它的 onCreate  onUpgrade 方法。


//构造方法,一般是传递一个要创建的数据库名称那么参数

SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)

第一个参数:Context类型,上下文对象。 
第二个参数:String类型,数据库的名称 
第三个参数:CursorFactory类型 
第四个参数:int类型,数据库版本 


//创建数据库时调用

onCreate(SQLiteDatabase db)

//版本更新时调用

onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion)

//创建或打开一个只读数据库

getReadableDatabase()

//创建或打开一个读写数据库

getWritableDatabase()















5.使用事务操作SQLite数据库


使用beginTransaction开启一个事务,程序执行到endTransaction方法时会检查事务的标志是否为成功:如果程序执行到endTransaction之前调用     了setTransactionSuccessful方法设置事务的标志为成功,则提交事务;如果没有调用setTransactionSuccessful方法则回滚事务





6.事务可以提高效率






































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值