`
zheyiw
  • 浏览: 999636 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

安卓数据库基类

sql 
阅读更多

//创建数据库
public class DBCreate {
	public static void CreateDatabase(SQLiteDatabase db) {
		db.beginTransaction();
		try {
			create_NetTaskBuffer(db);

			insert_SQL(db);

			db.setTransactionSuccessful();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			db.endTransaction();
		}
	}

	// 缓存
	private static void create_NetTaskBuffer(SQLiteDatabase db) {
		db.execSQL("DROP TABLE IF EXISTS NetTaskBuffer");
		StringBuilder sql = new StringBuilder();
		sql.append("CREATE TABLE IF NOT EXISTS NetTaskBuffer (");
		sql.append(" id INTEGER PRIMARY KEY AUTOINCREMENT,"); // 这一列不能修改
		sql.append(" label TEXT COLLATE NOCASE,"); //
		sql.append(" param TEXT COLLATE NOCASE,"); //
		sql.append(" result TEXT COLLATE NOCASE,"); //
		sql.append(" remark TEXT COLLATE NOCASE,");
		sql.append(" time LONG)"); //
		db.execSQL(sql.toString());
	}

	// 插入语句,初始化数据库使用
	private static void insert_SQL(SQLiteDatabase db) {
		
	}
}



//----------------------数据库操作基类--------------------------------------//


/**
 * 数据库基本操作类,数据库的创建,更新的操作都在这里进行
 * 
 * @author yizhe
 * @date 2014-9-11
 */
public abstract class DBHelper extends SQLiteOpenHelper {

	static String name = "hk.db"; // 数据库名称
	static CursorFactory cursorFactory = null;
	static int version = 1000;// 初始版本:1000
	Context context;

	protected ContentValues contentValues; // cursor对象转行中介,给子类使用

	protected String tableName;

	protected DBHelper(Context context, String tableName) {
		super(context, name, cursorFactory, version);
		this.context = context;
		this.tableName = tableName;
	}

	/**
	 * 软件第一次安装的时候会调用,覆盖安装不会调用
	 */
	public void onCreate(SQLiteDatabase db) {
		// 所有表的创建过程都在这里进行
		DBCreate.createDatabase(db);
	}

	/**
	 * 覆盖安装,当版本号version发生变化的时候,这个方法才会被调用,而且只执行一次
	 */
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		onCreate(db);
		// if (oldVersion < 109) {
		// onCreate(db);
		// } else {
		// }
	}

	/**
	 * 每次成功打开数据库后首先被执行
	 */
	public void onOpen(SQLiteDatabase db) {
		super.onOpen(db); // 每次成功打开数据库后首先被执行
	}

	public void finalize() {
		close();
	}

	// --------------------------sql方法---------------------------------//
	/**
	 * 执行sql,没有返回
	 */
	public void execSQL(String sql) {
		System.out.println("==execSQL==" + sql);
		SQLiteDatabase db = getWritableDatabase();
		db.execSQL(sql);
		db.close();
	}

	/**
	 * 批量执行sql,内部启用事务
	 * 
	 * @param list
	 *            sql列表
	 * @return 是否执行成功
	 */
	public boolean execSQLBatch(ArrayList<String> list) {
		SQLiteDatabase db = getWritableDatabase();
		db.beginTransaction();
		try {
			for (String sql : list) {
				db.execSQL(sql);
			}
			db.setTransactionSuccessful();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			db.endTransaction();
			db.close();
		}
		return true;
	}

	/**
	 * 根据id删除记录
	 * 
	 * @param id
	 *            表中必须有"id"字段
	 * @return the number of rows affected if a whereClause is passed in, 0
	 *         otherwise. To remove all rows and get a count pass "1" as the
	 *         whereClause.
	 */
	public int delete(int id) {
		SQLiteDatabase db = getWritableDatabase();
		int result = db.delete(tableName, "id=?", new String[] { id + "" });
		db.close();
		return result;
	}

	/**
	 * 删除: 只需要写where 条件(不带where) 和 参数
	 * 
	 * @param whereStr
	 *            例如: "id=?"
	 * @param arr
	 *            例如: new String[] { "123" }
	 * @return 受影响的行
	 */
	public int delete(String whereStr, String[] arr) {
		SQLiteDatabase db = getWritableDatabase();
		int result = db.delete(tableName, whereStr, arr);
		db.close();
		return result;
	}

	/**
	 * 清空表
	 */
	public void clearTable() {
		SQLiteDatabase db = getWritableDatabase();
		db.execSQL("delete from " + tableName);
		db.close();
	}

	/**
	 * 通用查询,多用于事务中
	 */
	public static Cursor Query(SQLiteDatabase db, String sql) {
		System.out.println("==Query==" + sql);
		return db.rawQuery(sql, new String[] {});
	}

	/**
	 * 通用执行sql,,多用于事务中
	 * 
	 */
	public static void execSQL(SQLiteDatabase db, String sql) {
		System.out.println("==execSQL==" + sql);
		db.execSQL(sql);
	}

}

//-------------------------下面是一个具体实现的DEMO-------------------------------//
/**
 * dao类,实现基本的数据库操作<br/>
 * 需要保存到数据库中的对象的属性不能使用基本类型,建议只使用Integer 和 String<br/>
 * 做为通用对象,从demo创建只要修改tableName即可
 * 
 * @author yizhe
 * @date 2012-5-18
 */
public class NetTaskBufferDao extends DBHelper {
	int expiryDays = 10; // 数据缓存有效期

	public NetTaskBufferDao(Context context) {
		super(context, "NetTaskBuffer");
	}

	// pojo的整数都需要使用Long类型 或者Integer类型 建议使用Long
	public void iniContentValues(NetTaskBuffer pojo) {
		contentValues = new ContentValues();
		contentValues.put("id", pojo.id);
		contentValues.put("label", pojo.label);
		contentValues.put("param", pojo.param);
		contentValues.put("result", pojo.result);
		contentValues.put("remark", pojo.remark);
		contentValues.put("time", pojo.time);
	}

	public NetTaskBuffer setBaseItem(Cursor cursor) {
		NetTaskBuffer pojo = new NetTaskBuffer();
		pojo.id = cursor.getInt(cursor.getColumnIndex("id"));
		pojo.label = cursor.getString(cursor.getColumnIndex("label"));
		pojo.param = cursor.getString(cursor.getColumnIndex("param"));
		pojo.result = cursor.getString(cursor.getColumnIndex("result"));
		pojo.remark = cursor.getString(cursor.getColumnIndex("remark"));
		pojo.time = cursor.getLong(cursor.getColumnIndex("time"));
		return pojo;
	}

	// --------------------自定义方法--------------------------------//
	public String getBuffer(String label, String param) {
		String sql = "select * from " + tableName
				+ " where label=? and param=? ";
		NetTaskBuffer obj = getOneAsSQL(sql, new String[] { label, param });
		if (null == obj) {
			return null;
		}
		Date time = new Date(obj.time);
		Calendar c = Calendar.getInstance();

		c.add(Calendar.DAY_OF_MONTH, -expiryDays);
		if (time.compareTo(c.getTime()) < 0) {
			delete(obj.id);
			return null;
		}
		return obj.result;
	}

	public String getBuffer(String label, String param, String remark) {
		String sql = "select * from " + tableName
				+ " where label=? and param=? and remark=?";
		NetTaskBuffer obj = getOneAsSQL(sql, new String[] { label, param,
				remark });
		if (null == obj) {
			return null;
		}
		Date time = new Date(obj.time);
		Calendar c = Calendar.getInstance();

		c.add(Calendar.DAY_OF_MONTH, -expiryDays);
		if (time.compareTo(c.getTime()) < 0) {
			delete(obj.id);
			return null;
		}
		return obj.result;
	}

	public void deleteBuffer(String label) {
		String whereSql = " label=?";
		delete(whereSql, new String[] { label });
	}

	public void deleteBuffer(String label, String param) {
		String whereSql = " label=? and param=?";
		delete(whereSql, new String[] { label, param });
	}

	public void deleteBuffer(String label, String param, String remark) {
		String whereSql = " label=? and param=? and remark=?";
		delete(whereSql, new String[] { label, param, remark });
	}

	// --------------------基础方法---------------------------------//

	/**
	 * 根据sql获取list
	 */
	public ArrayList<NetTaskBuffer> getListAsSQL(String sql) {
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.rawQuery(sql, new String[] {});
		ArrayList<NetTaskBuffer> itemList = new ArrayList<NetTaskBuffer>();
		for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {
			itemList.add(setBaseItem(cursor));
		}
		cursor.close();
		db.close();
		return itemList;
	}

	/**
	 * 根据ID获取一条记录
	 */
	public NetTaskBuffer getById(int id) {
		String sql = "select * from " + tableName + " where id=" + id;
		return getOneAsSQL(sql, null);
	}

	/**
	 * 返回结果中的提一条记录
	 */
	public NetTaskBuffer getOneAsSQL(String sql, String[] arr) {
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.rawQuery(sql, arr);
		try {
			if (null != cursor && cursor.getCount() > 0) {
				cursor.moveToFirst();
				return setBaseItem(cursor);
			}
		} finally {
			cursor.close();
			db.close();
		}
		return null;
	}

	/**
	 * 保存对象到数据库,自动判断插入还是更像
	 * 
	 * @return 返回更新的记录数,或者 插入数据的id,如果返回值<=0表示失败
	 */
	public long save(NetTaskBuffer pojo) {
		if (null == pojo.time || 0 == pojo.time) {
			pojo.time = new Date().getTime();
		}
		Long idOrEffectRows = 0l;
		if (null == pojo.id || pojo.id < 1) {
			idOrEffectRows = insert(pojo);
		} else {
			idOrEffectRows = (long) update(pojo);
		}
		return idOrEffectRows;
	}

	/**
	 * 添加数据,自动插入id
	 * 
	 * @return the row ID of the newly inserted row, or -1 if an error occurred
	 */
	public long insert(NetTaskBuffer pojo) {
		SQLiteDatabase db = getWritableDatabase();// 获取可写SQLiteDatabase对象
		iniContentValues(pojo); // ContentValues类似map,存入的是键值对
		long result = db.insert(tableName, null, contentValues);
		if (result != -1) {
			pojo.id = (int) result;
		}
		db.close();
		return result;
	}

	/**
	 * 根据ID更新记录的,跟插入的很像
	 * 
	 * @return the number of rows affected
	 * 
	 */
	public int update(NetTaskBuffer pojo) {
		SQLiteDatabase db = getWritableDatabase();
		iniContentValues(pojo); // 初始化键值对
		int result = db.update(tableName, contentValues, "id=?",
				new String[] { pojo.id + "" });
		db.close();
		return result;
	}

}


分享到:
评论

相关推荐

    iOS系统框架搭建--集成了数据请求类,数据库,基类等.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...

    基于Android的无人书店管理 (源码 + 说明文档 + 演示视频)

    基于Android的无人书店管理 (源码 + 说明文档 + 演示视频) app: 1.列表采用了recyleview进行了展示,并且用adapter进行了适配修改 2.界面开发方式采用了mvc方式开发 3.开发熟悉了安卓activity的相关属性 4.部分...

    数据库实现一个轻量的背单词APP

    本文目录总体功能目标:前期功能:后期功能:大致思路:当前效果图:开始编码:词库:选择题:用到的基类、自定义Button、工具类 在使用背单词APP的过程中,我发现我就没专心背单词,而是想着:咦,这功能可以!唉?...

    Android代码-安卓聊天组件化SDK

    数据库 使用 Realm 数据库 realm数据库使用时注意线程问题,即realm对象的创建和使用要在同一个线程中。 核心内容 db:数据库操作相关,主要有两张表:消息表和联系人表 emojicon:emoji表情处理 ...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    封装android开发中常用的Utils,也许你的项目只需要这一个库就完全够了。

    封装android开发中常用的Utils,也许你的项目只需要这一个库就完全够了。不信你看,有图有真相。集成优雅的日志打印风格、app引导页面两行代码实现(也可用作轮播广告图,支持加载本地和网络,一键开启自动翻页功能,...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...

    AndroidAndroid Pokedex使用基于MVVM架构的Dagger Hilt,Motion,Coroutines,Jetpack(Room,ViewModel,LiveData)。-Android开发

    Pokedex是基于现代Android应用程序技术堆栈和MVVM架构的小型演示应用程序。 这个项目的重点是实现依赖注入的新库Dagger-Hilt。 还可以从网络中获取数据,并通过存储库模式将持久性数据集成到数据库中。 Pokedex ...

    P2P_Basket:一个安卓项目

    com.p2pnote.chart 放第三方图表控件的基类代码 com.p2pnote.db 放数据库操作的公共类,另外就是程序首次启动时会自动创建的表 com.p2pnote.db.dao 放数据库操作的实体类 com.p2pnote.db.pojo 放数据库的表类 ...

    动软代码生成器,可以一键生成数据字典等等

    主要实现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、Model类构造等基础代码片断,支持不同3种架构代码生成,使程序员可以节省大量机械录入的时间和重复劳动,而将精力...

    Android-BaseProject:用于启动新项目或重建旧项目的基础项目

    本文初衷:由于很多Android项目的基础框架大致一致,于是针对主流的Android项目基础需求,严格按照MVC模式进行基类代码封装,以便可以将工程应用到任何一个新项目开发中,或者在代码重构时引入。框架抽取存在可优化...

    Android聊天项目D3Xmpp.zip

    dao负责获取数据库的数据,并返回给Activitymodel是基础数据类5.com.d3.d3xmpp.d3View 和 com.d3.d3xmpp.util这是私人框架,集成了android开发中常用的一些方法及View。包括录音按钮RecordButton,加入了下拉刷新的...

    android_dagger2_sample:匕首2解释

    具有支持操作栏,网络请求,数据库模式和基类的完成项目。 1.简介 假设读者在当今流行的android应用程序中需要使用dagger 2。 在此示例中,我想弄清楚Dagger 2的用法,我将尝试以最容易理解的方式描述Dagger的内容...

    FastDev4Android

    后续会进行逐步添加整体项目目录如下:FastDev4Android包名描述libs 一些公共jar包库adapter适配器application全局applicationbase基类包cache数据缓存相关处理common公共类,或者配置相关db数据库操作相关event事件...

    以spring+mybatis为框架的jee开发基础包.zip

    提供用于开发业务对象、dao、service、缓存、安全等业务的基类对象和相关工具类 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计到产品部署的各个环节。以下是开发工具的主要...

    百度地图开发java源码-KUtils-master:封装android开发中常用的Utils,也许你的项目只需要这一个库就完全够了。不信你看

    封装android开发中常用的Utils,也许你的项目只需要这一个库就完全够了。不信你看,有图有真相。集成优雅的日志打印风格、app引导页面两行代码实现(也可用作轮播广告图,支持加载本地和网络,一键开启自动翻页功能,...

    MyCommons:我的共享资源

    org.liushui.mycommons.android |+ annotation // 标注工具 |+ base // 常用类的基类 |+ data // 数据库工具类 |+ exception // 异常类 |+ image // 图片工具类 |+ log // 日志工具类 |+ net // 网络工具类 |+ util ...

    百度地图开发java源码-KUtils:封装android开发中常用的Utils,也许你的项目只需要这一个库就完全够了。不信你看,有图有真相。

    封装android开发中常用的Utils,也许你的项目只需要这一个库就完全够了。不信你看,有图有真相。集成优雅的日志打印风格、app引导页面两行代码实现(也可用作轮播广告图,支持加载本地和网络,一键开启自动翻页功能,...

    ledypi:用RapsberryPi和python控制您的led灯带!

    每个模式都继承自具有其自身逻辑的基类。 这样,任何人都可以通过重写方法来实现自己的模式(请参阅自述文件中的更多信息)。 而且,可以通过更进一步地更改其属性的值来自定义每个模式。 固定逻辑 具有稳定逻辑的...

Global site tag (gtag.js) - Google Analytics