浏览 2936 次
锁定老帖子 主题:sqlite使用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-04-19
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; /** * sqlite工具类,用于管理数据库 */ public class DBHelper extends SQLiteOpenHelper { //数据库版本号 public static int DB_VERSION = 1; public DBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * 获取SQLiteDatabase对象 * * @param context * @return */ public static SQLiteDatabase getSQLiteDb(Context context) { DBHelper dbHelper = new DBHelper(context, "lx100.db", null, DB_VERSION); return dbHelper.getWritableDatabase(); } @Override public void onCreate(SQLiteDatabase db) { // 业务信息表 String createTableSql = "create table busi_info(_id integer not null primary key autoincrement,busi_id integer, busi_code varchar(30), busi_name varchar(50),busi_icon varchar(30), busi_alias varchar(20), busi_money varchar(200),busi_desc varchar(1000), parent_id integer, is_leaf integer)"; db.execSQL(createTableSql); // 收藏夹 createTableSql = "create table busi_favorites(_id integer not null primary key autoincrement, busi_code varchar(30))"; db.execSQL(createTableSql); // 热点业务 createTableSql = "create table busi_top(_id integer not null primary key autoincrement, hot_id integer,busi_code varchar(30))"; db.execSQL(createTableSql); // 初始化业务信息 db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(1 ,'','收藏夹','busi_favorite','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(2 ,'','热点业务','busi_top','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(3 ,'','资费套餐','busi_package','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(4 ,'','增值业务','busi_value','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(5 ,'','手机报','busi_sjb','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(6 ,'','营销活动','busi_camp','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(7 ,'','家庭产品','busi_family','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(8 ,'','基础服务','busi_service','','','', 0, 0)"); db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(9 ,'','集团业务','busi_ent','','','', 0, 0)"); // 初始化热点业务 db.execSQL("insert into busi_top(hot_id,busi_code) values(1,'KTDXZFYL')"); db.execSQL("insert into busi_top(hot_id,busi_code) values(2,'WSTD')"); db.execSQL("insert into busi_top(hot_id,busi_code) values(3,'KTCFJT')"); db.execSQL("insert into busi_top(hot_id,busi_code) values(4,'KTDZ')"); db.execSQL("insert into busi_top(hot_id,busi_code) values(5,'NYSJB')"); db.execSQL("insert into busi_top(hot_id,busi_code) values(6,'KTSJLL5')"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库版本升级 if (1 == oldVersion) { // 删除以前的数据表 db.execSQL("drop table if exists busi_info"); this.onCreate(db); } else if (oldVersion >= 2 && oldVersion < DB_VERSION) { db.beginTransaction(); try { // 先将业务信息表、业务类型表删除 db.execSQL("drop table if exists busi_info"); db.execSQL("drop table if exists busi_favorites"); db.execSQL("drop table if exists busi_top"); this.onCreate(db); // 设置事务标识为成功 db.setTransactionSuccessful(); } finally { db.endTransaction(); } } } } package com.lx100.db; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.lx100.pojo.BusiInfo; import com.lx100.pojo.PhoneHotBusiInfo; import com.lx100.util.LX100Constant; import com.lx100.util.LX100Utils; /** * 封装数据库操作类 * * @author Mr.Z * @date 2012-05-24 */ public class DBUtil { /** * 根据关键词查询符合条件的业务 * * @param context 上下文环境 * @param keyWord 查询关键词 */ public static HashMap<String, Object> findByKeyWord(Context context, String keyWord) { List<BusiInfo> list = new ArrayList<BusiInfo>(); SQLiteDatabase db = DBHelper.getSQLiteDb(context); String sql = "select * from busi_info where is_leaf = 1 and (busi_name like '%" + keyWord + "%' or busi_alias like '%" + keyWord + "%') order by _id"; // 查询数据 Cursor cursor = db.rawQuery(sql, null); int rowCounts = cursor.getCount(); while (cursor.moveToNext()) { BusiInfo busiInfo = new BusiInfo(); busiInfo.setId(cursor.getInt(cursor.getColumnIndex("busi_id"))); busiInfo.setBusiName(cursor.getString(cursor.getColumnIndex("busi_name"))); busiInfo.setBusiCode(cursor.getString(cursor.getColumnIndex("busi_code"))); busiInfo.setBusiIcon(cursor.getString(cursor.getColumnIndex("busi_icon"))); busiInfo.setBusiDesc(cursor.getString(cursor.getColumnIndex("busi_desc"))); busiInfo.setBusiAlias(cursor.getString(cursor.getColumnIndex("busi_alias"))); busiInfo.setBusiMoney(cursor.getString(cursor.getColumnIndex("busi_money"))); busiInfo.setIsLeaf(cursor.getInt(cursor.getColumnIndex("is_leaf"))); list.add(busiInfo); } cursor.close(); db.close(); HashMap<String, Object> resultMap = new HashMap<String, Object>(); resultMap.put("rowCounts", rowCounts); resultMap.put("resultList", list); return resultMap; } /** * 查询热点业务 * * @param context 上下文环境 * @return List<BusiInfo> */ public static List<BusiInfo> queryTopBusiInfo(Context context) { // 存储查询结果 List<BusiInfo> busiList = new ArrayList<BusiInfo>(); // 获取数据库操作对象 SQLiteDatabase db = DBHelper.getSQLiteDb(context); // 查询sql String sql = "select A.* from busi_info A,busi_top B where A.busi_code = B.busi_code order by B.hot_id"; // 查询并获取查询结果 Cursor cursor = db.rawQuery(sql, null); while (cursor.moveToNext()) { BusiInfo busiInfo = new BusiInfo(); busiInfo.setId(cursor.getInt(cursor.getColumnIndex("busi_id"))); busiInfo.setBusiName(cursor.getString(cursor.getColumnIndex("busi_name"))); busiInfo.setBusiCode(cursor.getString(cursor.getColumnIndex("busi_code"))); busiInfo.setBusiIcon(cursor.getString(cursor.getColumnIndex("busi_icon"))); busiInfo.setBusiDesc(cursor.getString(cursor.getColumnIndex("busi_desc"))); busiInfo.setBusiAlias(cursor.getString(cursor.getColumnIndex("busi_alias"))); busiInfo.setBusiMoney(cursor.getString(cursor.getColumnIndex("busi_money"))); busiInfo.setIsLeaf(cursor.getInt(cursor.getColumnIndex("is_leaf"))); busiList.add(busiInfo); } // 关闭数据库连接 cursor.close(); db.close(); return busiList; } /** * 查询收藏夹中的业务 * * @param context 上下文环境 * @return List<BusiInfo> */ public static List<BusiInfo> queryColloctBusiInfo(Context context) { // 存储查询结果 List<BusiInfo> busiList = new ArrayList<BusiInfo>(); // 获取数据库操作对象 SQLiteDatabase db = DBHelper.getSQLiteDb(context); // 查询sql String sql = "select A.* from busi_info A,busi_favorites B where A.busi_code = B.busi_code order by B._id"; // 查询并获取查询结果 Cursor cursor = db.rawQuery(sql, null); while (cursor.moveToNext()) { BusiInfo busiInfo = new BusiInfo(); busiInfo.setId(cursor.getInt(cursor.getColumnIndex("busi_id"))); busiInfo.setBusiName(cursor.getString(cursor.getColumnIndex("busi_name"))); busiInfo.setBusiCode(cursor.getString(cursor.getColumnIndex("busi_code"))); busiInfo.setBusiIcon(cursor.getString(cursor.getColumnIndex("busi_icon"))); busiInfo.setBusiDesc(cursor.getString(cursor.getColumnIndex("busi_desc"))); busiInfo.setBusiAlias(cursor.getString(cursor.getColumnIndex("busi_alias"))); busiInfo.setBusiMoney(cursor.getString(cursor.getColumnIndex("busi_money"))); busiInfo.setIsLeaf(cursor.getInt(cursor.getColumnIndex("is_leaf"))); busiList.add(busiInfo); } // 关闭数据库连接 cursor.close(); db.close(); return busiList; } /** * 根据节点ID获取子业务 * * @param context 上下文环境 * @param parentId 父菜单id * @return List<BusiInfo> */ public static List<BusiInfo> findBusiInfoByParentId(Context context, int parentId) { // 存储查询结果 List<BusiInfo> busiList = new ArrayList<BusiInfo>(); // 获取数据库操作对象 SQLiteDatabase db = DBHelper.getSQLiteDb(context); // 查询sql String sql = "select * from busi_info where parent_id=" + parentId + " order by busi_id"; // 查询并获取查询结果 Cursor cursor = db.rawQuery(sql, null); while (cursor.moveToNext()) { BusiInfo busiInfo = new BusiInfo(); busiInfo.setId(cursor.getInt(cursor.getColumnIndex("busi_id"))); busiInfo.setBusiName(cursor.getString(cursor.getColumnIndex("busi_name"))); busiInfo.setBusiCode(cursor.getString(cursor.getColumnIndex("busi_code"))); busiInfo.setBusiIcon(cursor.getString(cursor.getColumnIndex("busi_icon"))); busiInfo.setBusiDesc(cursor.getString(cursor.getColumnIndex("busi_desc"))); busiInfo.setBusiAlias(cursor.getString(cursor.getColumnIndex("busi_alias"))); busiInfo.setBusiMoney(cursor.getString(cursor.getColumnIndex("busi_money"))); busiInfo.setIsLeaf(cursor.getInt(cursor.getColumnIndex("is_leaf"))); busiList.add(busiInfo); } // 关闭数据库连接 cursor.close(); db.close(); return busiList; } /** * 从收藏夹中移除业务 * * @param context 上下文环境 * @param busiInfo 业务信息 */ public static void delCollectBusiInfo(Context context, BusiInfo busiInfo) { SQLiteDatabase db = DBHelper.getSQLiteDb(context); // 判断当前业务是否已在收藏夹中 String sql = "delete from busi_favorites where busi_code='" + busiInfo.getBusiCode() + "'"; db.execSQL(sql); db.close(); } /** * 清空收藏夹 * * @param context */ public static void clearCollectBusiInfo(Context context) { SQLiteDatabase db = DBHelper.getSQLiteDb(context); String sql = "delete from busi_favorites"; db.execSQL(sql); db.close(); } /** * 保存到收藏夹 * * @param context 上下文环境 * @param busiInfo 业务信息 * @return int(1:保存成功 2:收藏夹内业务数已达上限 3:该业务已在收藏夹中) */ public static int saveCollectBusiInfo(Context context, BusiInfo busiInfo) { int result = 1; SQLiteDatabase db = DBHelper.getSQLiteDb(context); // 判断当前业务是否已在收藏夹中 String sql = "select * from busi_favorites where busi_code='" + busiInfo.getBusiCode() + "'"; Cursor existCursor = db.rawQuery(sql, null); if (!existCursor.moveToNext()) { // 查询当前收藏夹内的业务数 sql = "select count(*) as busi_quantity from busi_favorites"; Cursor busiQuantityCursor = db.rawQuery(sql, null); if (busiQuantityCursor.moveToNext()) { int busiQuantity = busiQuantityCursor.getInt(busiQuantityCursor.getColumnIndex("busi_quantity")); // 未达到允许收藏的上限 if (busiQuantity < LX100Constant.ALLOW_COLLECT_MAX) { sql = "insert into busi_favorites(busi_code) values('" + busiInfo.getBusiCode() + "')"; db.execSQL(sql); } else { result = 2; } } busiQuantityCursor.close(); } else { result = 3; } existCursor.close(); db.close(); return result; } /** * 更新业务信息 * * @param context 上下文环境 * @param dataMap 包含业务及类型信息的Map */ public static void updateBusiInfo(Context context, List<BusiInfo> busiInfoList) { SQLiteDatabase db = DBHelper.getSQLiteDb(context); // 开启事务控制 db.beginTransaction(); try { // 先将业务信息表清空 db.execSQL("delete from busi_info"); // 更新业务信息 for (BusiInfo busiInfo : busiInfoList) { db.execSQL(String.format( "insert into busi_info(busi_id,busi_code,busi_name,busi_icon,busi_alias,busi_money,busi_desc,parent_id,is_leaf) values(%d,'%s','%s','%s','%s','%s','%s', %d, %d)", busiInfo.getId(), busiInfo.getBusiCode(), busiInfo.getBusiName(), busiInfo.getBusiIcon(), busiInfo.getBusiAlias(), busiInfo.getBusiMoney(), busiInfo.getBusiDesc(), busiInfo.getParentId(), busiInfo.getIsLeaf())); } // 设置事务标志为成功 db.setTransactionSuccessful(); } finally { // 结束事务 db.endTransaction(); db.close(); } } /** * 更新热点业务信息 * * @param context 上下文环境 * @param dataMap 包含业务及类型信息的Map */ public static void updateBusiHotInfo(Context context, List<PhoneHotBusiInfo> busiHotBusiInfos) { SQLiteDatabase db = DBHelper.getSQLiteDb(context); // 开启事务控制 db.beginTransaction(); try { // 先将业务信息表清空 db.execSQL("delete from busi_top"); // 更新业务信息 for (PhoneHotBusiInfo busiInfo : busiHotBusiInfos) { db.execSQL(String.format("insert into busi_top(hot_id,busi_code) values(%d,'%s')", busiInfo.getId(), busiInfo.getBusiCode())); } // 设置事务标志为成功 db.setTransactionSuccessful(); } finally { // 结束事务 db.endTransaction(); db.close(); } } } 代码完了,再来看理论: SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以用INTEGER的0和1代替true和false,而DATE类型则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显示,为了能方便的操作DATE类型,SQLite提供了一组函数,这样简单的数据类型设计更加符合嵌入式设备的要求。 在Android系统中提供了android.database.sqlite包,用于进行SQLite数据库的增、删、改、查工作。其主要方法如下: beginTransaction(): 开始一个事务。 close(): 关闭连接,释放资源。 delete(String table, String whereClause, String[] whereArgs): 根据给定条件,删除符合条件的记录。 endTransaction(): 结束一个事务。 execSQL(String sql): 执行给定SQL语句。 insert(String table, String nullColumnHack, ContentValues values): 根据给定条件,插入一条记录。 openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory): 根据给定条件连接数据库,如果此数据库不存在,则创建。 query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy): 执行查询。 rawQuery(String sql, String[] selectionArgs): 根据给定SQL,执行查询。 update(String table, ContentValues values, String whereClause, String[] whereArgs): 根据给定条件,修改符合条件的记录。 除了上诉主要方法外,Android还提供了诸多实用的方法,总之一句话:其实Android访问数据库是一件很方便的事儿。 一、 创建数据库 通过写一个继承SQLiteOpenHelper类的方式创建数据库,例子如上: 此外还有一种方法,通过openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法创建数据库,如: SQLiteDatabase db = this.openOrCreateDatabase("test_db.db", Context.MODE_PRIVATE, null); SQLiteDatabase db2 = SQLiteDatabase.openOrCreateDatabase("/data/data/com.test/databases/test_db2.db3", null); 二、创建数据表,插入数据。 Android系统并没有提供特别的创建数据表的方法,数据表通过SQL语句创建,代码如下: db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)"); 表创建好之后,通过insert(String table, String nullColumnHack, ContentValues values)方法插入数据,其中参数含义分别为: table: 目标表名 nullColumnHack: 指定表中的某列列名。因为在SQLite中,不允许不允许插入所有列均为null的记录,因此初始值有值为空时,此列需显式赋予null values: ContentValues对象,类似于java中的Map。以键值对的方式保存数据。 数据插入代码如下: ContentValues values = new ContentValues(); for(int i=0;i<10;i++){ values.put("name", "test" + i); db.insert("tab", "_id", values); } 利用SQLite客户端(推荐:SQLite Expert Personal 3)可轻松查看表结构和数据。 三、修改数据 update(String table, ContentValues values, String whereClause, String[] whereArgs)方法用于修改数据,其四个参数的具体含义如下: table: 目标表名 values: 要被修改成为的新值 whereClause: where子句,除去where关键字剩下的部分,其中可带?占位符。如没有子句,则为null。 whereArgs: 用于替代whereClause参数中?占位符的参数。如不需传入参数,则为null。 数据修改代码如下: ContentValues values = new ContentValues(); values.put("name", "name"); db.update("tab", values, "_id=1", null); db.update("tab", values, "_id=?", new String[]{"5"}); 四、查询数据 之前一直使用SQLite客户端查看数据情况了,这里就使用android提供的query()和rowQuery()方法执行查询。具体代码如下: Cursor c = db.query("tab", null, null, null, null, null, null); c.moveToFirst(); while(!c.isAfterLast()){ int index = c.getColumnIndex("name"); Log.d("SQLite", c.getString(index)); c.moveToNext(); } c = db.rawQuery("select * from tab", null); c.moveToFirst(); while(!c.isAfterLast()){ int index = c.getColumnIndex("name"); Log.d("SQLite", c.getString(index)); c.moveToNext(); } 可以清晰的在查询结果中,红线上下的数据是完全一致的,也就是说query和rawQuery方法在的不同仅仅在于所需参数的不同。rawQuery方法需要开发者手动写出查询SQL,而query方法是由目标表名、where子句、order by子句、having子句等诸多子句由系统组成SQL语句。两方法同返回Cursor对象,所以两方在使用时孰优孰劣,就看具体情况了。本人更喜欢rawQuery的方式,因为此方式更接近传统Java开发,也可以由专业DBA来书写SQL语句,这样更符合MVC的思想,而且这样的代码可读性更高。(query方法里面参数实在太多,有点记不住谁是order by子句,谁是having子句了) Cursor对象可以理解为游标对象,凡是对数据有所了解的人,相信对此对象都不会陌生,在这里机不再累述。只提醒一点,在第一次读取Cursor对象中的数据时,一定要先移动游标,否则此游标的位置在第一条记录之前,会引发异常。 五、删除数据 删除数据也是一件很简单的事,只需要调用delete方法,传入参数即可,delete(String table, String whereClause, String[] whereArgs)的参数三个参数具体含义如下: table: 目标表名 whereClause: where子句,除去where关键字剩下的部分,其中可带?占位符。如没有子句,则为null。 whereArgs: 用于替代whereClause参数中?占位符的参数。如不需传入参数,则为null。 具体代码如下: db.delete("tab", "_id=? or name=?", new String[]{"8", "name"}); 整个数据库的CRUD操作到此演示完了。最后提醒一点,在操作完数据后,一定要记得调用close()方法关闭连接,释放资源。这个原因相信大家都是懂的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |