经常用得到的安卓数据库基类

Java代码  

  1. //创建数据库
  2. public class DBCreate {
  3. public static void CreateDatabase(SQLiteDatabase db) {
  4. db.beginTransaction();
  5. try {
  6. create_NetTaskBuffer(db);
  7. insert_SQL(db);
  8. db.setTransactionSuccessful();
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. } finally {
  12. db.endTransaction();
  13. }
  14. }
  15. // 缓存
  16. private static void create_NetTaskBuffer(SQLiteDatabase db) {
  17. db.execSQL("DROP TABLE IF EXISTS NetTaskBuffer");
  18. StringBuilder sql = new StringBuilder();
  19. sql.append("CREATE TABLE IF NOT EXISTS NetTaskBuffer (");
  20. sql.append(" id INTEGER PRIMARY KEY AUTOINCREMENT,"); // 这一列不能修改
  21. sql.append(" label TEXT COLLATE NOCASE,"); //
  22. sql.append(" param TEXT COLLATE NOCASE,"); //
  23. sql.append(" result TEXT COLLATE NOCASE,"); //
  24. sql.append(" remark TEXT COLLATE NOCASE,");
  25. sql.append(" time LONG)"); //
  26. db.execSQL(sql.toString());
  27. }
  28. // 插入语句,初始化数据库使用
  29. private static void insert_SQL(SQLiteDatabase db) {
  30. }
  31. }
  32. //----------------------数据库操作基类--------------------------------------//
  33. /**
  34. * 数据库基本操作类,数据库的创建,更新的操作都在这里进行
  35. *
  36. * @author yizhe
  37. * @date 2014-9-11
  38. */
  39. public abstract class DBHelper extends SQLiteOpenHelper {
  40. static String name = "hk.db"; // 数据库名称
  41. static CursorFactory cursorFactory = null;
  42. static int version = 1000;// 初始版本:1000
  43. Context context;
  44. protected ContentValues contentValues; // cursor对象转行中介,给子类使用
  45. protected String tableName;
  46. protected DBHelper(Context context, String tableName) {
  47. super(context, name, cursorFactory, version);
  48. this.context = context;
  49. this.tableName = tableName;
  50. }
  51. /**
  52. * 软件第一次安装的时候会调用,覆盖安装不会调用
  53. */
  54. public void onCreate(SQLiteDatabase db) {
  55. // 所有表的创建过程都在这里进行
  56. DBCreate.createDatabase(db);
  57. }
  58. /**
  59. * 覆盖安装,当版本号version发生变化的时候,这个方法才会被调用,而且只执行一次
  60. */
  61. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  62. onCreate(db);
  63. // if (oldVersion < 109) {
  64. // onCreate(db);
  65. // } else {
  66. // }
  67. }
  68. /**
  69. * 每次成功打开数据库后首先被执行
  70. */
  71. public void onOpen(SQLiteDatabase db) {
  72. super.onOpen(db); // 每次成功打开数据库后首先被执行
  73. }
  74. public void finalize() {
  75. close();
  76. }
  77. // --------------------------sql方法---------------------------------//
  78. /**
  79. * 执行sql,没有返回
  80. */
  81. public void execSQL(String sql) {
  82. System.out.println("==execSQL==" + sql);
  83. SQLiteDatabase db = getWritableDatabase();
  84. db.execSQL(sql);
  85. db.close();
  86. }
  87. /**
  88. * 批量执行sql,内部启用事务
  89. *
  90. * @param list
  91. *            sql列表
  92. * @return 是否执行成功
  93. */
  94. public boolean execSQLBatch(ArrayList<String> list) {
  95. SQLiteDatabase db = getWritableDatabase();
  96. db.beginTransaction();
  97. try {
  98. for (String sql : list) {
  99. db.execSQL(sql);
  100. }
  101. db.setTransactionSuccessful();
  102. } catch (Exception e) {
  103. e.printStackTrace();
  104. return false;
  105. } finally {
  106. db.endTransaction();
  107. db.close();
  108. }
  109. return true;
  110. }
  111. /**
  112. * 根据id删除记录
  113. *
  114. * @param id
  115. *            表中必须有"id"字段
  116. * @return the number of rows affected if a whereClause is passed in, 0
  117. *         otherwise. To remove all rows and get a count pass "1" as the
  118. *         whereClause.
  119. */
  120. public int delete(int id) {
  121. SQLiteDatabase db = getWritableDatabase();
  122. int result = db.delete(tableName, "id=?", new String[] { id + "" });
  123. db.close();
  124. return result;
  125. }
  126. /**
  127. * 删除: 只需要写where 条件(不带where) 和 参数
  128. *
  129. * @param whereStr
  130. *            例如: "id=?"
  131. * @param arr
  132. *            例如: new String[] { "123" }
  133. * @return 受影响的行
  134. */
  135. public int delete(String whereStr, String[] arr) {
  136. SQLiteDatabase db = getWritableDatabase();
  137. int result = db.delete(tableName, whereStr, arr);
  138. db.close();
  139. return result;
  140. }
  141. /**
  142. * 清空表
  143. */
  144. public void clearTable() {
  145. SQLiteDatabase db = getWritableDatabase();
  146. db.execSQL("delete from " + tableName);
  147. db.close();
  148. }
  149. /**
  150. * 通用查询,多用于事务中
  151. */
  152. public static Cursor Query(SQLiteDatabase db, String sql) {
  153. System.out.println("==Query==" + sql);
  154. return db.rawQuery(sql, new String[] {});
  155. }
  156. /**
  157. * 通用执行sql,,多用于事务中
  158. *
  159. */
  160. public static void execSQL(SQLiteDatabase db, String sql) {
  161. System.out.println("==execSQL==" + sql);
  162. db.execSQL(sql);
  163. }
  164. }
  165. //-------------------------下面是一个具体实现的DEMO-------------------------------//
  166. /**
  167. * dao类,实现基本的数据库操作<br/>
  168. * 需要保存到数据库中的对象的属性不能使用基本类型,建议只使用Integer 和 String<br/>
  169. * 做为通用对象,从demo创建只要修改tableName即可
  170. *
  171. * @author yizhe
  172. * @date 2012-5-18
  173. */
  174. public class NetTaskBufferDao extends DBHelper {
  175. int expiryDays = 10; // 数据缓存有效期
  176. public NetTaskBufferDao(Context context) {
  177. super(context, "NetTaskBuffer");
  178. }
  179. // pojo的整数都需要使用Long类型 或者Integer类型 建议使用Long
  180. public void iniContentValues(NetTaskBuffer pojo) {
  181. contentValues = new ContentValues();
  182. contentValues.put("id", pojo.id);
  183. contentValues.put("label", pojo.label);
  184. contentValues.put("param", pojo.param);
  185. contentValues.put("result", pojo.result);
  186. contentValues.put("remark", pojo.remark);
  187. contentValues.put("time", pojo.time);
  188. }
  189. public NetTaskBuffer setBaseItem(Cursor cursor) {
  190. NetTaskBuffer pojo = new NetTaskBuffer();
  191. pojo.id = cursor.getInt(cursor.getColumnIndex("id"));
  192. pojo.label = cursor.getString(cursor.getColumnIndex("label"));
  193. pojo.param = cursor.getString(cursor.getColumnIndex("param"));
  194. pojo.result = cursor.getString(cursor.getColumnIndex("result"));
  195. pojo.remark = cursor.getString(cursor.getColumnIndex("remark"));
  196. pojo.time = cursor.getLong(cursor.getColumnIndex("time"));
  197. return pojo;
  198. }
  199. // --------------------自定义方法--------------------------------//
  200. public String getBuffer(String label, String param) {
  201. String sql = "select * from " + tableName
  202. + " where label=? and param=? ";
  203. NetTaskBuffer obj = getOneAsSQL(sql, new String[] { label, param });
  204. if (null == obj) {
  205. return null;
  206. }
  207. Date time = new Date(obj.time);
  208. Calendar c = Calendar.getInstance();
  209. c.add(Calendar.DAY_OF_MONTH, -expiryDays);
  210. if (time.compareTo(c.getTime()) < 0) {
  211. delete(obj.id);
  212. return null;
  213. }
  214. return obj.result;
  215. }
  216. public String getBuffer(String label, String param, String remark) {
  217. String sql = "select * from " + tableName
  218. + " where label=? and param=? and remark=?";
  219. NetTaskBuffer obj = getOneAsSQL(sql, new String[] { label, param,
  220. remark });
  221. if (null == obj) {
  222. return null;
  223. }
  224. Date time = new Date(obj.time);
  225. Calendar c = Calendar.getInstance();
  226. c.add(Calendar.DAY_OF_MONTH, -expiryDays);
  227. if (time.compareTo(c.getTime()) < 0) {
  228. delete(obj.id);
  229. return null;
  230. }
  231. return obj.result;
  232. }
  233. public void deleteBuffer(String label) {
  234. String whereSql = " label=?";
  235. delete(whereSql, new String[] { label });
  236. }
  237. public void deleteBuffer(String label, String param) {
  238. String whereSql = " label=? and param=?";
  239. delete(whereSql, new String[] { label, param });
  240. }
  241. public void deleteBuffer(String label, String param, String remark) {
  242. String whereSql = " label=? and param=? and remark=?";
  243. delete(whereSql, new String[] { label, param, remark });
  244. }
  245. // --------------------基础方法---------------------------------//
  246. /**
  247. * 根据sql获取list
  248. */
  249. public ArrayList<NetTaskBuffer> getListAsSQL(String sql) {
  250. SQLiteDatabase db = getReadableDatabase();
  251. Cursor cursor = db.rawQuery(sql, new String[] {});
  252. ArrayList<NetTaskBuffer> itemList = new ArrayList<NetTaskBuffer>();
  253. for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {
  254. itemList.add(setBaseItem(cursor));
  255. }
  256. cursor.close();
  257. db.close();
  258. return itemList;
  259. }
  260. /**
  261. * 根据ID获取一条记录
  262. */
  263. public NetTaskBuffer getById(int id) {
  264. String sql = "select * from " + tableName + " where id=" + id;
  265. return getOneAsSQL(sql, null);
  266. }
  267. /**
  268. * 返回结果中的提一条记录
  269. */
  270. public NetTaskBuffer getOneAsSQL(String sql, String[] arr) {
  271. SQLiteDatabase db = getReadableDatabase();
  272. Cursor cursor = db.rawQuery(sql, arr);
  273. try {
  274. if (null != cursor && cursor.getCount() > 0) {
  275. cursor.moveToFirst();
  276. return setBaseItem(cursor);
  277. }
  278. } finally {
  279. cursor.close();
  280. db.close();
  281. }
  282. return null;
  283. }
  284. /**
  285. * 保存对象到数据库,自动判断插入还是更像
  286. *
  287. * @return 返回更新的记录数,或者 插入数据的id,如果返回值<=0表示失败
  288. */
  289. public long save(NetTaskBuffer pojo) {
  290. if (null == pojo.time || 0 == pojo.time) {
  291. pojo.time = new Date().getTime();
  292. }
  293. Long idOrEffectRows = 0l;
  294. if (null == pojo.id || pojo.id < 1) {
  295. idOrEffectRows = insert(pojo);
  296. } else {
  297. idOrEffectRows = (long) update(pojo);
  298. }
  299. return idOrEffectRows;
  300. }
  301. /**
  302. * 添加数据,自动插入id
  303. *
  304. * @return the row ID of the newly inserted row, or -1 if an error occurred
  305. */
  306. public long insert(NetTaskBuffer pojo) {
  307. SQLiteDatabase db = getWritableDatabase();// 获取可写SQLiteDatabase对象
  308. iniContentValues(pojo); // ContentValues类似map,存入的是键值对
  309. long result = db.insert(tableName, null, contentValues);
  310. if (result != -1) {
  311. pojo.id = (int) result;
  312. }
  313. db.close();
  314. return result;
  315. }
  316. /**
  317. * 根据ID更新记录的,跟插入的很像
  318. *
  319. * @return the number of rows affected
  320. *
  321. */
  322. public int update(NetTaskBuffer pojo) {
  323. SQLiteDatabase db = getWritableDatabase();
  324. iniContentValues(pojo); // 初始化键值对
  325. int result = db.update(tableName, contentValues, "id=?",
  326. new String[] { pojo.id + "" });
  327. db.close();
  328. return result;
  329. }
  330. }

安卓标准数据库构建.zip (9.2 KB)

时间: 2024-10-07 18:08:02

经常用得到的安卓数据库基类的相关文章

面向对象编程、模块内高内聚、模块间低耦合、数据库操作工具类

一.web.config帮助类(ConfigHelper.cs) 1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Reflection; 5 6 namespace Common 7 { 8 /// <summary> 9 /// web.config操作类 10 /// author:陈彦斌 11 /// 时间:2019年7月14日23:32:08

通用权限管理系统基类中数据库的连接

public class BaseController : Controller { /// <summary> /// 用户中心Dbhelper /// </summary> public IDbHelper DbHelperUserCenter = GetDbConnection(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection, ConfigHelper.GetConfigBool(&

基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思路和特点,对Controller进行了封装.使得控制器能够获得很好的继承关系,并能以更少的代码,更高效的开发效率,实现Web项目的开发工作,整个控制器的设计思路如下所示. 从上图的设计里面可以看到,我把主要能通过抽象封装的CRUD方法都放到了BusinessController<B, T>类里面,

phpcms V9 数据模型基类

在学习<phpcms V9首页模板文件解析>的第七步,我们看到content_model类,文件路径:phpcms/model/content_model.class.php 从代码中,可以得知content_model类继承于model类.那么model类又是什么呢? 下面请看数据模型基类model类的解析.文件路径:phpcms\libs\classes\model.class.php 代码及注释,如下所示: 1 <?php 2 /** 3 * model.class.php 数据模

关于java可变(协变)返回类型的解说之一------------基类与派生类

在java代码中,人们惯性的认为一个方法中只能返回一种返回值或者无返回.博主在做开发过程中碰到了这样一种情况,安卓客户端请求数据,后台可能返回两种结果(1)访问令牌失效,无数据返回.(2)正常获取数据. 这样的情况下需要根据访问令牌标识来判断是否有数据返回.当无效时返回用户重新登录提示,正常时则返回数据.显然,返回的结果有两种,那么一个方法里面只能返回一种类型的禁锢使得开发起来略显笨拙.使得开发起来相当难受. 思考良久,又结合C++协变返回类型的启发.摘抄原文中的一句话:在C++中,只要原来的返

Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)

本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试,那么建立单元测试就有很大的必要,本篇主要介绍如何利用VS创建内置的单元测试项目进行实体框架的基类接口测试. 在采用单元测试这个事情上,很多人可能想到了NUnit单元测试工具和NMock工具进行处理,其实微软VS里面也已经为我们提供了类似的单元测试工具了,可以不需要使用这个第三方的单元测试工具,经试

一步一步搭建开发框架(三)基类基接口

1,AdoNetDal和EfDal都实现IDal这个接口,公共的方法写到接口中,接口中的代码! 1 namespace PCITC.OA.IDal 2 { 3 public interface IUserInforDal 4 { 5 UserInfor Add(UserInfor userInfor); 6 7 bool Update(UserInfor userInfor); 8 9 bool Delete(UserInfor userInfor); 10 11 int Delete(para

基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------&gt; 可以返回派生类对象的引用或指针

您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. 百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责.百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面. 首页 精选版块 移动开发 iOS Android Qt WP 云计算 IaaS Pass/SaaS 分布式计算/Hadoop J

基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思路和特点,对Controller进行了封装.使得控制器能够获得很好的继承关系,并能以更少的代码,更高效的开发效率,实现Web项目的开发工作,整个控制器的设计思路如下所示. 从上图的设计里面可以看到,我把主要能通过抽象封装的CRUD方法都放到了BusinessController<B, T>类里面,