• ORMLite学习入门笔记


    ORMLite学习入门笔记

    使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大。所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLite(官网:http://ormlite.com/),以其小巧方便,在Android数据库维护上深受大家的喜爱。

     

    但是ORMLite的文档有比较少,官方老外写的文档又长又乱,我等考不过托福雅思的我也就简单的看了看。把自己写了一个demo,记录一下使用的过程和步骤。

     

    Jar 包的下载地址在:Orm jar包的下载地址

    我们需要下载 core 和 android 两个jar,放在工程中就好

    一、设置建立自己的与数据库表对应的pojo

     

    /**
     * @author zhoushengtao
     * @since 2013-7-16 下午7:39:05
     */
    
    package com.stchou.helloormlite;
    
    import com.j256.ormlite.field.DatabaseField;
    import com.j256.ormlite.table.DatabaseTable;
    /**
     * 数据库对应的pojo类,注意一下三点
     * 1、填写表的名称 @DatabaseTable
     * 2、填写表中持久化项的 @DatabaseField 还可使顺便设置其属性
     * 3、保留一个无参的构造函数
     */
    //表名称
    @DatabaseTable(tableName = "user")
    public class User
    {
        // 主键 id 自增长
        @DatabaseField(generatedId = true)
        private int id;
        // 映射
        @DatabaseField(canBeNull = false)
        private String username;
        // 不为空
        @DatabaseField(canBeNull = false)
        private String password;
        
        @DatabaseField(defaultValue = "")
        private String nickname ;
        
        public User()
        {
            // ORMLite 需要一个无参构造
        }
    
        /**
         * @return the id
         */
        public int getId()
        {
            return this.id;
        }
    
        /**
         * @param id the id to set
         */
        public void setId(int id)
        {
            this.id = id;
        }
    
        /**
         * @return the username
         */
        public String getUsername()
        {
            return this.username;
        }
    
        /**
         * @param username the username to set
         */
        public void setUsername(String username)
        {
            this.username = username;
        }
    
        /**
         * @return the password
         */
        public String getPassword()
        {
            return this.password;
        }
    
        /**
         * @param password the password to set
         */
        public void setPassword(String password)
        {
            this.password = password;
        }
    
      
        @Override
        public String toString()
        {
            String text = "";
    
            text += "
    id = " + id;
            text += "
    username = " + username;
            text += "
    password = " + password;
            return text;
        }
    
    }
    

    @DatabaseField 可以注释一下成员

    columnName

    String

    数据库表中对应的列名称,如果没有设置,系统将自动生成

    dataType

     

    字段的数据类型。通常情况下,数据类型是从java类的成员变量获取的,并不需要进行特殊指出。它相当于是SQL的数据类型。

    defaultValue

    String

    当心插入一条数据时候的默认值,如果没有将为none

    width

    Integer

    字段的宽度,主要用于字符串字段。默认是0,意味着采用默认的数据类型和具体的数据库的默认情况。对于字符串以为在255个字符即使有些数据库并不支持。

    canBeNull

    Boolean

    默认值为true,如果设置为false,insert数据是必须保证该列项必须存在一个值。

    id

    Boolean

    不管这个字段是否是id,默认值都是false。作为数据库中的主键存在一个类中。id、generatedId和generatedIdSequence三者只能同时出现一个

    generatedId

    Boolean

    自增长id,默认值为false。调用Dao.create()时候会增加1。id、generatedId和generatedIdSequence三者只能同时出现一个。

    generatedIdSequence

    String

    序列编号的名字,这个值在生成的时候会被使用。和generatedId相似,但是你能够指定使用的序列名称。默认是没有的。一个class中只有一个成员变量可以设置这个值。这仅仅在数据库需要序列生成id时才需要它。如果你选择使用generatedId代替它,那么代码将自动增加序列名。

    foreign

    Boolean

    默认值为false,相当于数据库中的外键,链接其他类存储在数据库中。这个字段必须存在自己的原始类型,另一个类必须存在一个id字段(id、generatedid、generatedIdSequence中的一个)

    useGetSet

    Boolean

    申明这个字段可以使用Java类中的get、set映射到数据库表中的赋值和获取。默认值为false

    ….

     

     

     


    -------------------------------------------------------

    第一步:

              下载ormlite-android-4.41.jar和ormlite-core-4.41.jar两个jar包,放入工程的libs文件夹内,然后右键 builder path-->add path

    第二步:对你要持久化的类进行注解(记住.提供一个默认无参构造)

    1. @DatabaseTable(tableName="student")  tableName 表明  
    2. public class Student {  
    3.     public static final String ID="student_id";  
    4.     public static final String NAME="student_name";  
    5.     public static final String LASTNAME="student_lastname";  
    6.     public static final String RESOURCE="student_resource";   
    7.     public static final String TEACHER_ID="tacher_id";  
    8.     @DatabaseField(generatedId=true,useGetSet=true,columnName=ID)     
    9.     private int id;  
    10.     @DatabaseField(foreignColumnName=Teacher.ID,foreign=true,foreignAutoCreate=true)  
    11.     private Teacher teacher_id;  
    12.     @DatabaseField(useGetSet=true,columnName=NAME)    
    13.     private String name;  
    14.     @DatabaseField(useGetSet=true,columnName=LASTNAME)  
    15.     private String lastName;  
    16.     @DatabaseField(useGetSet=true,columnName=RESOURCE)  
    17.     private double  resource;  
    18.  一系列的set get 方法...  
    @DatabaseTable(tableName="student")  tableName 表明
    public class Student {
    	public static final String ID="student_id";
    	public static final String NAME="student_name";
    	public static final String LASTNAME="student_lastname";
    	public static final String RESOURCE="student_resource";	
    	public static final String TEACHER_ID="tacher_id";
    	@DatabaseField(generatedId=true,useGetSet=true,columnName=ID)	
    	private int id;
    	@DatabaseField(foreignColumnName=Teacher.ID,foreign=true,foreignAutoCreate=true)
    	private Teacher teacher_id;
    	@DatabaseField(useGetSet=true,columnName=NAME)	
    	private String name;
    	@DatabaseField(useGetSet=true,columnName=LASTNAME)
    	private String lastName;
    	@DatabaseField(useGetSet=true,columnName=RESOURCE)
    	private double	resource;
     一系列的set get 方法...
    

    过一会将详细的列出各种注解的意思,这里只需要知道 @DatabaseTable 指定类对应的表明,@DatabaseField 对应的字段名,

    第二步:

             创建一个database helper类,继承OrmLiteSqliteOpenHelper 实现 onCreate 和 onUpgrade ,这个类类似于 android 的SQLiteOpenHelper方法 ,大家应该知道这个类的作用了,创建删除数据库应该使用TableUtils工具类的方法.一会下面介绍

    第二步:分两种情况,一个直接在Activity中使用OrmLite 创建的dao类

                 (1)这时候,你的Activity类应该实现OrmLiteBaseListActivity, OrmLiteBaseService或者 OrmLiteBaseTabActivity,然后在类中使用getHelper().getDao(Class clazz);创建你的DAO 对象,然后使用其中的方法对数据进行操作.

                 (2)有些人和我一样.不喜欢将DAO层和Activity层放在一起,喜欢讲操作数据库的类单独放在DAO包中,形成DAO层,貌似是web开发留下的..........................习惯

                                这时候,我们需要在自定义的DAO中使用 OrmLiteSqliteOpenHelper helper=OpenHelperManager.getHelper(context,BasicDAO.class);方法来得到helper对象,这个对象需要保持,根据文档上说在销毁对象的时候需要OpenHelperM                                   anager.releaseHelper();使用这个方法来释放掉helper对象,然后使用helper对象的getDao(Student.class);方法得到DAO类,

                                然后我们就可以使用DAO类,完成各种各样的数据库 增删改操作.

                                例如:

    1. public class StudentDAO{  
    2.     Dao<student integer=""> dao=null;  
    3.     private Context context=null;  
    4.     OrmLiteSqliteOpenHelper helper=null;  
    5.         public StudentDAO(Context context) {  
    6.         this.context=context;  
    7.         // TODO Auto-generated constructor stub  
    8.         helper=OpenHelperManager.getHelper(context,BasicDAO.class);  
    9.         try {  
    10.             dao=helper.getDao(Student.class);  
    11.         } catch (SQLException e) {  
    12.             // TODO Auto-generated catch block  
    13.             e.printStackTrace();  
    14.         }  
    15.     }  
    16.         @Override  
    17. <span style="white-space: pre;">    </span>protected void finalize() throws Throwable {  
    18. <span style="white-space: pre;">        </span>// TODO Auto-generated method stub  
    19. <span style="white-space: pre;">        </span>OpenHelperManager.release();//释放掉helper  
    20. <span style="white-space: pre;">        </span>super.finalize();  
    21. <span style="white-space: pre;">    </span>}  
    22. }  
    23.   
    24. </student>  
    public class StudentDAO{
    	Dao dao=null;
    	private Context context=null;
    	OrmLiteSqliteOpenHelper helper=null;
            public StudentDAO(Context context) {
    		this.context=context;
    		// TODO Auto-generated constructor stub
    		helper=OpenHelperManager.getHelper(context,BasicDAO.class);
    		try {
    			dao=helper.getDao(Student.class);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
            @Override
    	protected void finalize() throws Throwable {
    		// TODO Auto-generated method stub
    		OpenHelperManager.release();//释放掉helper
    		super.finalize();
    	}
    }
    
    

    接下来介绍..各种各样的注解

    首先介绍 @DatabaseTable

                                    参数:tableName指定表明,没有将使用类名作为表明

                     @DatabaseField

    cloumnName:指定字段名,不指定则变量名作为字段名  canBeNull:是否可以为null  
    dataType:指定字段的类型 defaultValue:指定默认值  指定长度
     id:指定字段为id generatedId:指定字段为自增长的id,不能id,generatedIdSequence通用 foreign 指定这个字段的对象是一个外键,外键值是这个对象的id
    useGetSet:指定ormlite访问变量使用set,get方法默认使用的是反射机制直接访问变量 throwIfNull,如果空值抛出异常 persisted:指定是否持久化此变量,默认true
    unique:字段值唯一 uniqueCombo整列的值唯一 index:索引
    uniqueIndex 唯一索引 foreignAutoRefresh 外键值,自动刷新 foreignAutoCreate 外键不存在时是否自动添加到外间表中
    foreignColumnName外键字段指定的外键表中的哪个字段    

                     @ForeignCollectionField  表示这个表中的数据在其他表中是外键(其他表的某个字段使用@DatabaseField(foreignColumnName=一个表的id键名,foreign=true)

                                              eager 表示该集合是在初始化这个对象的时候,是否讲对象取出还是在遍历的时候才取出,默认false遍历的时候才取出,size()方法也会引起遍历

                                              这个注解注解的字段只能是ForeignCollection<T> or Collection<T> 对象

    TableUtils

    接下来介绍TableUtils完成对数据中的表进行创建,删除,清空表格,只要看一下它的静态方法.做过程序的应该都会

    Dao<T,V>

    包含两个泛型,第一个泛型表DAO操作的类,第二个表示操作类的主键类型

    主要方法:

                 create:插入一条数据

                 createIfNotExists:如果不存在则插入

                 createOrUpdate:如果指定id则更新

                 queryForId:更具id查找

                 update 查找出数据

                 refresh的解释:If you want to use other elds in the Account, you must call refresh on the accountDao class to get the Account object lled in.

                 delte 删除数据

                 queryBuilder() 创建一个查询生成器:进行复杂查询

                deleteBuilder() 创建一个删除生成器,进程复杂条件删除

                updateBuilder() 创建修条件生成器,进行复杂条件修改

    条件查找器DeleteBuilder,QueryBuilder,UpdateBuilder

                查找器是帮助拼接条件语句的.比如查找器中有 where()方法 and()方法 eq()方法 lt()方法 qt()方法 between方法这些方法很直观..很容易都明了什么意思

                最后使用prepare()方法生成条件使用DAO.query || DAO.delete|| DAO.update 方法执行

               可以使用查找生成器QueryBuilder 的 orderby limit offset 方法进行排序,分页, 

                                                                                                                     

  • 相关阅读:
    396 Rotate Function 旋转函数
    395 Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子串
    394 Decode String 字符串解码
    393 UTF-8 Validation UTF-8 编码验证
    392 Is Subsequence 判断子序列
    391 Perfect Rectangle 完美矩形
    390 Elimination Game 淘汰游戏
    389 Find the Difference 找不同
    388 Longest Absolute File Path 最长的绝对文件路径
    387 First Unique Character in a String 字符串中的第一个唯一字符
  • 原文地址:https://www.cnblogs.com/bigben0123/p/4332359.html
Copyright © 2020-2023  润新知