2012-04-13我发布了AHibernate1.0,后面我的博客中很多个例子都用到了这个框架,看到这些博客的访问量和代码下载量我觉得我的辛苦没有白费.但任何代码都不会非常完美,在使用中发现了一些bug,并完善了一些功能,弄个新版本吧,就叫AHibernate1.1吧.

AHibernate1.1主要修改的内容:
1.修改bug,实体类的属性定义为int时自动生成Id正常,定义为Integer类型后不能自动生成Id.
2.实现功能:自动处理java.util.Date类型.
3.实现功能:调试时自动输入sql到日志中,输出的sql已经将?参数替换为了传入的变量,sql能直接运行.
4.实现功能:实现了主键自增和不自增控制方法的重载.默认使用主键自增,
//insert(entity)方法Id会自增,相当于调用insert(entity,true);
//使用insert(entity,false)这样方式可以插入有固定Id的数据
5.支持代码混淆处理,当设置了proguard.config=proguard.cfg后发布程序时,程序会自动混淆处理.使用老接口:public BaseDaoImpl(SQLiteOpenHelper dbHelper)会报错,请使用新接口:
public BaseDaoImpl(SQLiteOpenHelper dbHelper, Class<T> clazz)
注:使用混淆时最好在proguard.cfg文件添加设置:-keepattributes *Annotation*

6.其他一些bug.

AHibernate1.0主要实现功能:

1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并且对于继承类中的注解字段也支持自动建表.
2.自动支持增删改,增改支持对象化操作:增删改是数据库操作的最基本单元,不用重复写这些增删改的代码,并且添加和更新支持类似于hibernate中的对象化操作.
3.查询方式灵活:支持android框架提供的方式,也支持原生sql方式.
4.查询结果对象化:对于查询结果可自动包装为实体对象,类似于hibernate框架.
5.查询结果灵活:查询结果支持对象化,也支持结果为List<Map<String,String>>形式,这个方法在实际项目中很实用,且效率更好些.

使用示例:

package com.tgb.lk.demo;import java.util.List;
import java.util.Map;import com.tgb.lk.demo.R;import com.tgb.lk.demo.dao.impl.StudentDaoImpl;
import com.tgb.lk.demo.dao.impl.TeacherDaoImpl;
import com.tgb.lk.demo.model.Student;
import com.tgb.lk.demo.model.Teacher;import android.app.Activity;
import android.os.Bundle;/*** AHibernate概要 <br/>* (一)支持功能: 1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并且对于继承类中的注解字段也支持自动建表. 2.自动支持增删改* ,增改支持对象化操作:增删改是数据库操作的最基本单元,不用重复写这些增删改的代码,并且添加和更新支持类似于hibernate中的对象化操作.* 3.查询方式灵活:支持android框架提供的方式,也支持原生sql方式.* 4.查询结果对象化:对于查询结果可自动包装为实体对象,类似于hibernate框架.* 5.查询结果灵活:查询结果支持对象化,也支持结果为List<Map<String,String>>形式,这个方法在实际项目中很实用,且效率更好些.* 6.日志较详细:因为android开发不支持热部署调试,运行报错时可根据日志来定位错误,这样可以减少运行Android的次数. <br/>* (二)不足之处: <br/>* 1.id暂时只支持int类型,不支持uuid,在sqlite中不建议用uuid.* 2.现在每个方法都自己开启和关闭事务,暂时还不支持在一个事务中做多个操作然后统一提交事务. <br/>* (三)作者寄语:<br/>* 昔日有JavaScript借Java发展,今日也希望AHibernate借Hibernate之名发展.* 希望这个项目以后会成为开源社区的重要一员,更希望这个项目能给所有Android开发者带便利.* 欢迎访问我的博客:http://blog.csdn.net/lk_blog,* 这里有这个框架的使用范例和源码,希望朋友们多多交流完善这个框架,共同推动中国开源事业的发展,AHibernate期待与您共创美好未来!!!*/
public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 熟悉用接口的朋友注意哦,这里也可以定义为接口哦,见StudentDaoImpl.java中的注释.TeacherDaoImpl teacherDao = new TeacherDaoImpl(MainActivity.this);StudentDaoImpl studentDao = new StudentDaoImpl(MainActivity.this);// 添加Teacher teacher = new Teacher();teacher.setName("米老师");teacher.setAge(50);teacher.setTitle("教授");Long teacherId = teacherDao.insert(teacher);Student student1 = new Student();student1.setName("lk");student1.setAge(26);student1.setClasses("五");student1.setTeacherId(teacherId.intValue());Long studentId1 = studentDao.insert(student1);Student student2 = new Student();student2.setName("cls");student2.setAge(26);student2.setClasses("五");student2.setTeacherId(teacherId.intValue());Long studentId2 = studentDao.insert(student2);Student student3 = new Student();student3.setName("lb");student3.setAge(27);student3.setClasses("五期");student3.setTeacherId(teacherId.intValue());Long studentId3 = studentDao.insert(student3);Student student4 = new Student();student4.setId(1111);student4.setName("李坤");student4.setAge(26);student4.setClasses("五期提高班");student4.setTeacherId(teacherId.intValue());// 上面的示例中insert(entity)方法Id会自增.// 使用insert(entity,false)这样方式可以插入有固定Id的数据.Long studentId4 = studentDao.insert(student4, false);System.out.println("插入数据时可以不让主键自增,插入指定Id的数据值为=====" + studentId4);// 查询// 方式1:根据Id查询单个对象// 结果:student1Student [id=1, name=lk,age=26,teacherId=1, classes=五]Student student5 = studentDao.get(studentId1.intValue());System.out.println("student4" + student5);// 方式2:查询出表中的所有记录// 执行结果如下:// list1:Student [id=1, name=lk,age=26,teacherId=1, classes=五]// list1:Student [id=2, name=cls,age=26,teacherId=1, classes=五]// list1:Student [id=3, name=lb,age=27,teacherId=1, classes=五期]List<Student> list1 = studentDao.find();for (Student student : list1) {System.out.println("list1:" + student);}// 方式3:限制条件查询和查询结果// 执行结果:list2:Student [id=2, name=cls,age=0,teacherId=0, classes=null]List<Student> list2 = studentDao.find(new String[] { "id", "name" }," id = ? ", new String[] { studentId2.toString() }, null, null,null, null);for (Student student : list2) {System.out.println("list2:" + student);}// 方式4:使用sql查询出结果,此种方式是2,3,4中最灵活的.// 执行结果:// list3:Student [id=2, name=cls,age=26,teacherId=1, classes=五]// list3:Student [id=3, name=lb,age=27,teacherId=1, classes=五期]List<Student> list3 = studentDao.rawQuery("select * from t_student where id in (?,?) ", new String[] {studentId2.toString(), studentId3.toString() });for (Student student : list3) {System.out.println("list3:" + student);}// 方式4:使用模糊查询.List<Student> list = studentDao.rawQuery("select * from t_student t where t.classes like ?",new String[] { "%五%" });System.out.println(list.size());// 方式4进阶:如果想查询出米老师的学生,可以这样实现:// 执行结果:// list4:Student [id=1, name=lk,age=26,teacherId=1, classes=五]// list4:Student [id=2, name=cls,age=26,teacherId=1, classes=五]// list4:Student [id=3, name=lb,age=27,teacherId=1, classes=五期]List<Student> list4 = studentDao.rawQuery("select s.* from t_student s join t_teacher t on s.teacher_id = t.id where t.name= ? ",new String[] { "米老师" });for (Student student : list4) {System.out.println("list4:" + student);}// 方式5:我只想知道姓名和年龄,查询得到List<Map<String,String>>形式.只查2个字会比查询所有字段并封装为对象效率高吧,尤其字段值很多时我们的手机更喜欢这种方式哦.// 结果:// listMap1: name:lk;age:26// listMap1: name:cls;age:26// listMap1: name:lb;age:27List<Map<String, String>> listMap1 = studentDao.query2MapList("select name,Age from t_student ", null);for (Map<String, String> map : listMap1) {// 查询的List中的map以查询sql中的属性值的小写形式为key,注意是小写形式哦.System.out.println("listMap1: name:" + map.get("name") + ";age:"+ map.get("age"));}// 方式5进阶:我想知道前2名学生的姓名和班主任姓名,这种方式是不是超灵活啊,用其他的方式查询都没这种方式好用吧,哈哈.// 结果:// listMap2: student_name:lk;teacher_name:米老师// listMap2: student_name:cls;teacher_name:米老师List<Map<String, String>> listMap2 = studentDao.query2MapList("select s.name sname,t.name tname from t_student s join t_teacher t on s.teacher_id = t.id limit ? ",new String[] { "2" });for (Map<String, String> map : listMap2) {System.out.println("listMap2: student_name:" + map.get("sname")+ ";teacher_name:" + map.get("tname"));}// 更新// 结果: Student [id=1, name=李坤,age=26,teacherId=1, classes=五期]student1 = studentDao.get(studentId1.intValue());student1.setName("李坤");student1.setClasses("五期");studentDao.update(student1);System.out.println(student1);// 删除:支持单个id删除,也支持多个id同时删除哦.studentDao.delete(studentId1.intValue());studentDao.delete(new Integer[] { studentId2.intValue(),studentId3.intValue() });studentDao.delete(1111);// 支持执行sql语句哦.teacherDao.execSql("insert into t_teacher(name,age) values('米教授',50)",null);}
}

(1)在LogCat中设置查看日志:


(2)运行后输出的日志:


jar和源码下载地址:http://download.csdn.net/download/lk_blog/4786640

Android sqlite数据库操作通用框架AHibernate(三)-升级为1.1版本相关推荐

  1. Android sqlite数据库操作通用框架AHibernate(一)-CRUD示例和使用步骤

    AHibernate简介 一句话描述,使用AHibernate框架进行sqlite数据库操作您将从重复性劳动中解脱出来. (一)支持功能: 1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并 ...

  2. Android sqlite数据库操作通用框架AHibernate(二)源码-用于交流

    贴出源代码供大家交流使用,欢迎朋友们对代码提供宝贵意见,直接写到评论中即可.使用示例和步骤见上一篇博客:http://blog.csdn.net/lk_blog/article/details/745 ...

  3. android sqlite alert table,android sqlite数据库操作

    sqlite有一点不同于其他常见数据库,就是sqlite数据库是存成文件的,可以直接把该文件从手机里导出来,以文件的形式存在,然后放到电脑上查看. Android操作数据库有如下步骤: 1.继承SQL ...

  4. Android Sqlite数据库操作

    Android中的数据存储方式有:SharedPreferences 首选项,文件,网络,sqllite; 很多时候开发APP时需要缓存数据,其中以SQL为最常用了.  在此记录一下sql的各种方法. ...

  5. java 安卓 sqlite数据库,android sqlite数据库操作

    [实例简介] [实例截图] [核心代码] package com.example.datastorage; import android.app.Activity; import android.ap ...

  6. android数据库三个方法有哪些,如何将Android数据库操作通用化(二)

    概述 接着上回的说,虽然我们已经找出了阻挡我们通用化Android数据库操作的五个问题,但是现在我们还不能立即开始去解决这些问题. 试想一下,我们有一个News,那么,相应的就会有NewsDao和Ne ...

  7. [Android] SQLite数据库之增删改查基础操作

        在编程中经常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,能够支持Windows/Linux/Un ...

  8. 如何将Android数据库操作通用化(四)

    概述 明窗半掩小庭幽夜静灯残未待留 风冷结阴寒落叶别离长倚望高楼 迟迟月影斜依竹叠叠诗余赋旅愁 将欲断肠随断梦雁飞连阵几声秋 概述 上一篇文章,已经解决了前两个问题,那么现在我们继续. 首先,我们回顾 ...

  9. 数据存储之 SQLite 数据库操作(三)

    上一讲中我们讲到了SQLite数据库的操作方法 [数据存储之SQLite数据库操作(二)],我们主要是以SQL语句对数据库进行增删改查,这一讲我们来学习一下 Android 建议的对数据库的操作方法 ...

最新文章

  1. python嵌套字典取值_python嵌套字典比较值与取值的实现示例
  2. Genome Biology:人体各部位微生物组时间序列分析Moving Pictures
  3. LruDiskCache要点--不可不用的磁盘缓存工具类
  4. Android Binder ProcessState IPCThreadState相关介绍
  5. 对象 普通po转_厦门2020年转学怎么转?需要什么材料?你想知道的答案都在这!......
  6. Java IO: 字节和字符数组
  7. QuickPart应用系列
  8. poj(2406) kmp
  9. java项目中包的命名规范
  10. 入门学习因果推断在智能营销/权益应用的通用框架
  11. 用vue-cli+iview做项目不兼容ie问题
  12. 关于去除Eclipse对JavaScript的验证
  13. CSS3实现DIV圆角完整代码
  14. 银行如何构建反欺诈模型
  15. Python 多行注释
  16. qlv文件怎么打开 怎么把qlv文件转换成MP4的文件呢
  17. Socket UDP、TCP 简介
  18. Android开发中保存数据的四种方法方法
  19. Read Committed
  20. 蓝桥杯 基础练习 01字串 C/C++/Java/Python描述

热门文章

  1. 如何入门网络安全_网络安全自学
  2. LTIB入门介绍,安装使用方法(一)
  3. 模型压缩与蒸馏!BERT家族的瘦身之路
  4. 何恺明MAE大火之后,想梳理下视觉Transformer?这篇综述帮你梳理了100多个
  5. LaTex笔记:常用转换
  6. 使用UNetbootin制作Ubuntu Live USB
  7. [转]经典爆笑、低调变态的精品语录100条
  8. 全球变暖基础知识小测试程序(Global Warming Facts Quiz)
  9. CSS之Clear属性
  10. html clear的作用,css中clear的作用是什么?