Android 小项目之--SQLite 使用法门 (附源码)
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库 --大名鼎鼎的SQLite。SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,可能只需要几百KB,这也是 Android 系统采用 SQLite 数据库的原因之一吧。
简介
* 轻量级
使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。
* 独立性
SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
* 隔离性
SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。
* 跨平台
SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。
* 多语言接口
SQLite 数据库支持多语言编程接口。
* 安全性
SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。
继承 SQLiteOpenHelper 类实现的 DBRouteHelper 类。
package com.stark.itqs.util;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.FeatureInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.text.format.Time;
/**
* SQLite工具类 用于数据库表的增删改查操作
* @author WangYue
* @date 2010-3-26
*/
public class DBBusHelper extends SQLiteOpenHelper {
//定义常量信息
private final static String DATABASE_NAME="itqs"; //数据库名称
private final static int DATABASE_VERSION=1; //数据库版本号
private final static String TABLE_NAME="route"; //数据库中表名称
public final static String FIELD_PID="pid"; //route表中pid字段 用于标识父类编号
public final static String FIELD_ID="id"; //route表中id字段 用于标识表中编号
public final static String FIELD_NAME="name"; //站点名称
public final static String FIELD_ARRIVAL_TIME="arrival_time"; //到达该站的时间
public final static String FIELD_TRALVEL_TIME="travel_time"; //距下一站的时间
/**
* 构造函数
* @param context
*/
public DBBusHelper(Context context)
{
/*
* 第一个参数(context):to use to open or create the database
* 第二个参数(name):of the database file, or null for an in-memory database
* 第三个参数(factory):to use for creating cursor objects, or null for the default
* 第四个参数(version):number of the database (starting at 1); if the database is older, onUpgrade(SQLiteDatabase, int, int) will be used to upgrade the database
*/
super(context, DATABASE_NAME,null, DATABASE_VERSION);
}
/**
* 创建数据库方法
*/
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库语句
String sql="Create table "+TABLE_NAME+"("+FIELD_ID+" integer primary key autoincrement,"
+FIELD_PID+" integer,"
+FIELD_NAME+"varchar(20)"
+FIELD_ARRIVAL_TIME+"varchar(20)"
+FIELD_TRALVEL_TIME+" varchar(20) );";
//执行创建表
db.execSQL(sql);
}
/**
* 更新数据库表操作
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库语句
String sql=" DROP TABLE IF EXISTS "+TABLE_NAME;
//执行数据库语句操作
db.execSQL(sql);
//更新SQLiteDatabase
onCreate(db);
}
/**
* 查询数据方法
* @return Cursor
*/
public Cursor select()
{
//取得SQLiteDatabase
SQLiteDatabase db=this.getReadableDatabase();
//取得Cursor游标,根据字段id升序查询
/**
* 第一个参数:表明
* 第二个参数:结果集列表列中显示的字段。null:表示全部显示;String[] columns:你想显示的字段
* 第三个参数:返回结果中行数。null:表示全部显示;String selection:指定显示的行数
* 第四个参数:?占位符,用于替换value是中的值。null:表示禁止?占位符;String[] selectionArgs:指定?占位符
* 第五个参数:是否将行分组显示。null:不分组;String groupBy:分组
* 第六个参数:分组条件。null:代表没有分组条件;String having:分组条件
* 第七个参数:行显示顺序(升序|降序)。null:表示使用默认的排序方式;String orderBy:具体排序方式。
*/
Cursor cursor=db.query(TABLE_NAME,null, null, null, null, null, "id asc");
//返回从cursor
return cursor;
}
/**
* 插入数据方法
* @param pid 父编号
* @param name 站点名称
* @param arrival_time 到达时间
* @param travel_time 距下一站的时间
* @return rowNumber 返回所插入的行数
*/
public long insert(Integer pid,String name,String arrival_time,String travel_time )
{
//取得SQLiteDatabase
SQLiteDatabase db=this.getWritableDatabase();
//创建ContentValues,用于存放插入字段信息
ContentValues cv=new ContentValues();
//将字段信息放入发哦ContentValue中
cv.put(FIELD_PID, pid);
cv.put(FIELD_NAME, name);
cv.put(FIELD_ARRIVAL_TIME, arrival_time);
cv.put(FIELD_TRALVEL_TIME, travel_time);
//执行插入操作
/**
* 第一个参数:表名
* 第二个参数:如果初始化值为空时,就将该设置成null。
* 第三个参数:ContentValues
*/
long rowNumber=db.insert(TABLE_NAME, null, cv);
return rowNumber;
}
/**
* 删除方法
* @param pid
* @param id
*/
public void delete(int pid,int id)
{
//取得SQLiteDatabase对象
SQLiteDatabase db=this.getWritableDatabase();
//删除条件(利用占位符?操作)
String where=FIELD_ID+"=?,"+FIELD_PID+"=?";
//删除条件参数
String[] whereValue={Integer.toString(id),Integer.toString(pid)};
//执行删除操作
/**
* 第一个参数:表名称
* 第二个参数:SQL条件 需用利用占位符?操操作
* 第三个参数:SqL条件参数
*/
db.delete(TABLE_NAME, where, whereValue);
}
/**
* 更新方法
* @param id
* @param pid
* @param name
* @param arrival_time
* @param travel_time
* @return rowNumber 返回所插入的行数
*/
public long update(Integer id,Integer pid,String name,String arrival_time,String travel_time )
{
//取得SQLiteDatbase对象
SQLiteDatabase db=this.getWritableDatabase();
//SQL语句更新条件 ,利用占位符?
String where=FIELD_ID+"=?";
//设置SQL更新条件参数
String[] whereValue={Integer.toString(id)};
//创建ContentValues对象 ,用于存储更新的字段信息
ContentValues cv=new ContentValues();
//将所要更新的信息放入到cv对象中
cv.put(FIELD_PID, id);
cv.put(FIELD_NAME, name);
cv.put(FIELD_ARRIVAL_TIME,arrival_time);
cv.put(FIELD_TRALVEL_TIME, travel_time);
//执行更新操作
/**
* 第一个参数:表名称
* 第二个参数:ContentValues
* 第三个参数:SQL where条件
* 第四个参数:SQL where 条件参数
*/
long rowNumber=db.update(TABLE_NAME, cv, where, whereValue);
return rowNumber;
}
}
PS:
1,如果进入onCreate()函数,不存在此数据库则创建,如果存在此数据库则打开连接,只要进入此方法就可以用打开的连接获得getWritableDatabase()或getReadableDatabase()这两个方法。
2, ContentValue 其实可就是一个 HashTable,Key值是字段名称,Value 值是字段的值。通过 ContentValues 的put 方法就可以把数据库放到 ContentValue 对象中,然后插入到表中去。
3,在 Android 中查询数据是通过 Cursor 类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体截图如下: