`
as11051105
  • 浏览: 60119 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

sqlite使用

阅读更多
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),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,parent_id,is_leaf) values(1 ,'','收藏夹','busi_favorite','','','', 0, 0)");
		db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,parent_id,is_leaf) values(2 ,'','热点业务','busi_top','','','', 0, 0)");
		db.execSQL("insert into busi_info(busi_id,busi_code,busi_name,parent_id,is_leaf) values(3 ,'','资费套餐','busi_package','','','', 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')");
	}

	@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();
			}
		}
	}

}




/**
 * 封装数据库操作类
 */
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.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.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.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.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.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()方法关闭连接,释放资源。
分享到:
评论

相关推荐

    sqlite 使用手册

    sqlite 使用手册, sqlite 教學

    sqlite使用流程图解

    sqlite使用流程

    SQLITE使用教程

    SQLITE 使用教程 1. SQLITE 简介 SQLite 是一个开源、轻量级的嵌入式数据库系统,它不需要独立的服务器进程,而是作为应用程序的一部分运行。SQLite 支持标准的关系型数据库特性,如 SQL 语言、事务处理等,并且...

    vc下sqlite使用

    SQLite是一款轻量级的、开源的关系型数据库管理系统,它无需单独的服务器进程,可以直接嵌入到应用程序中使用。在Visual C++(简称VC)环境下,SQLite可以为开发者提供方便的数据存储功能,尤其适合小型到中型的应用...

    ASP.NET Core和Sqlite使用DEMO

    参考杨万青写的《ASP.NET Core与Restful API开发实战》,这本书写的不错,但是书中使用的是Sql Server,我一般不用这个数据库,为了学习方便,我的DEMO使用的是Sqlite3,这种数据库太好用了。另外DEMO里面也去掉了书...

    IOS开发SQLite使用实例

    在Objective-C中,你需要创建一个`sqlite3_stmt`对象来执行查询,并使用`sqlite3_prepare_v2()`、`sqlite3_step()`和`sqlite3_column_text()`等函数获取结果: ```objc NSString *query = @"SELECT * FROM Users"; ...

    sqlite使用说明及PPC上的移植

    总结来说,SQLite 的移植到 PPC 平台涉及交叉编译库和应用程序,使用 SQLite 的开发则需要熟悉其提供的 API 以及 SQL 语言。封装后的 API 可以提高开发效率,而理解基础的 SQL 语句和事务处理机制对于正确操作数据库...

    C#连接sqlite 使用的类库System.Data.SQLite.dll

    这个类库为开发者提供了一种方便的方式来操作SQLite数据库,它集成了ADO.NET接口,使得与SQLite的数据交互变得和使用SQL Server或其他数据库系统一样简单。在本案例中,我们看到的`System.Data.SQLite.dll`就是这样...

    嵌入式数据库SQLite使用指南

    嵌入式数据库Sqlite指南。没想到sqlite很小、很不错。包括一般的SQL指南,高级attach使用实例(attach命令可以同时访问不同sqlite数据库中的表),C及C++语言访问Sqlite实例,用户自定义函数实例等。

    Android的SQLite使用

    Android当中内置SQLite数据库,那个SQLite有什么特点呢?... 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 更多详细介绍请参考博客:http://blog.csdn.net/stoppig/article/details/39155937

    sqlite3.h、sqlite3.lib、sqlite3.dll

    - **数据库文件格式**:SQLite使用单个磁盘文件存储整个数据库,这种设计使得数据库的移动和备份变得非常简单。 - **线程安全**:SQLite支持多线程操作,但有几种不同的线程安全模式,包括单线程、多线程和...

    SQLite使用.docx

    SQLite是一款轻量级的数据库管理系统,它以小巧高效、易于集成和使用的特点广泛应用于嵌入式设备和小型应用程序。SQLite的设计遵循ACID原则,确保数据的一致性和完整性,使其在可靠性方面与大型数据库系统如MySQL和...

    C#解决SQlite并发异常问题的方法(使用读写锁)

    使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java...

    SQLite移植和使用

    【SQLite 移植和使用详解】 SQLite 是一种广泛应用于嵌入式系统的轻量级数据库,因其小巧、高效、易于移植的特性,深受开发者喜爱。在本文中,我们将深入探讨如何在非 X86 平台,特别是 ARM 平台上移植和使用 ...

    SQLite使用示例

    sqlite使用的简单示例。 vs2005+win32程序+c语言。 具体配置步骤可见我的博客:http://blog.csdn.net/segen_jaa/article/details/7938959。

    Labview使用sqlite数据库

    labview数据库操作,目前我用过最强大最好用的labview数据库操作,又简单集成度也超高,要的功能都有,labview使用其他数据库无法自动生成数据库,这个是可以的。 1.自动生成数据库 2.可以以表格形式插入数据库。 3....

    C#+sqlite 登录Demo

    在本项目"C#+sqlite 登录Demo"中,我们主要探讨了如何使用C#编程语言结合SQLite数据库实现一个简单的登录系统。这个系统展示了如何在Windows Forms(winForm)应用程序中进行数据库交互,包括设置数据库连接、执行...

    Android中SQLite数据库查看工具

    SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您...SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。

    sqlite所需库和头文件以及操作代码

    "创建表"是数据库操作的基础,SQLite使用SQL语句来完成。例如,创建一个名为"Students"的表: ```c++ const char* sql = "CREATE TABLE Students (ID INTEGER PRIMARY KEY, Name TEXT, Age INTEGER)"; char* errMsg...

    android SQLite使用模版

    本程序是一个SQLite的规范使用示例,程序涉及到: SQLite 增、删、改、查、SQL版本更新,ListView创建条目生成,单个条目点击事件处理,程序中通过Junit来实现单元测试。

Global site tag (gtag.js) - Google Analytics