zoukankan      html  css  js  c++  java
  • android开源ORM框架OrmLite使用教程

    OrmLite是一个轻量级的对象关系映射包,由Java语言开发。Github上有ormlite-coreormlite-androidormlite-examples,分别是主要库,android依赖和一些教程。

    一、准备

    为了在android上使用OrmLite,我们需要下载ormlite-core.jar和ormlite-android.jar放到项目目录下,然后:

    1、创建一个类继承OrmLiteSqliteOpenHelper,实现两个抽象方法onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) 和 onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion),查看源码可以知道OrmLiteSqliteOpenHelper是继承了android里自带的SqliteOpenHelper类,以上两个抽象方法也是扩展自SqliteOpenHelper里面的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);

    public class DBHelper extends OrmLiteSqliteOpenHelper{
      public DBHelper(Context context){
       //用于通过注解+反射创建数据库表
            super(context, DB_NAME, null, VERSION_100);
       //用于通过读取配置文件创建数据库表
       //super(context, DB_NAME, null, VERSION_101,R.raw.config);
        }
    
        @Override
        public void onCreate(SQLiteDatabase database,
                ConnectionSource connectionSource) {
            try {
                TableUtils.createTableIfNotExists(connectionSource, Account.class);            
            } catch (SQLException e) {
                LogFactory.e(e);
            }
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase database,
                ConnectionSource connectionSource, int oldVersion, int newVersion) {
            if(oldVersion<VERSION_101){
                fixVersion101() ;
            }
            if(oldVersion<VERSION_200){
                fixVersion200() ;
            }
        }
    }

    需要说的是在onUpgrade中如果对数据库表有修改,则只能通过sql语句来进行,TableUtils在此时不能发挥作用。例:

    void fixVersion200(){
            try {
                String sql = "ALTER TABLE '"+TAB_ACCOUNT+"' ADD COLUMN "+DATE_ID+" INTEGER ;" ;
                getDao(Account.class).executeRaw(sql) ;
            } catch (SQLException e) {
                LogFactory.e(e);
            }
        }

    2、OrmLiteSqliteOpenHelper中保存着数据库的链接,因此没必要创建太多的OrmLiteSqliteOpenHelper实例,官方建议使用OpenHelperManager来对OrmLiteSqliteOpenHelper进行操作,通过OpenHelperManager.getHelper(Context context, Class<T> openHelperClass)则可以返回OrmLiteSqliteOpenHelper实例;或者通过setOpenHelperClass()然后再getHelper();再或者在res-string下面定义一个open_helper_classname,里面制定类名,OrmLite框架会通过反射将其实例化;

    3、最简单的使用OpenHelperManager的方法是继承OrmLiteBaseActivity,另外也提供了OrmLiteBaseListActivity, OrmLiteBaseService, and OrmLiteBaseTabActivity,这些类里面会自动管理OrmLiteSqliteOpenHelper.通过getHelper()则可以获取;

    4、如果不想使用官方提供的方法,那么可以在自己的Activity里面管理OrmLiteSqliteOpenHelper,一般是在onCreate()里面创建,在onDestroy()里面释放掉;OpenHelperManager.getHelper()和releaseHelper()必须成对出现,不然可能出现意想不到的情况;

    二、数据库表配置

    OrmLite提供了两种方法配置表,一是通过注解,如果通过注解,因为OrmLite的注解是运行时的(Runtime),在反射的时候Method.equals()会消耗很多资源导致初始化数据变的很慢。因此才有了第二种方法--通过注解生成的配置文件。

    1、通过注解

    @DatabaseTable(tableName = "accounts")
    public class Account {
        
        @DatabaseField(id = true)
        private String name;
        @DatabaseField
        private String password;
        
        public Account() {
            // ORMLite needs a no-arg constructor 
        }
        public Account(String name, String password) {
            this.name = name;
            this.password = password;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }

    其中"@DatabaseTable"是配置数据表的,只有两个属性"tableName"(表名,默认为类名小写)和"daoClass"(Dao管理类)。

    "@DatabaseField"是配置表中的column的,属性比较多,见官方文档

    创建数据库表则在继承的OrmLiteSqliteOpenHelper的onCreate()中调用如下:

    public void onCreate(SQLiteDatabase database,
                ConnectionSource connectionSource) {
            try {
                TableUtils.createTableIfNotExists(connectionSource, Account.class);
            } catch (SQLException e) {
                LogFactory.e(e);
            }
        }

    2、通过注解加配置文件

    注解部分如上。配置文件的生成需要Java工程中继承OrmLiteConfigUtil

    public class DatabaseConfigUtil extends OrmLiteConfigUtil {
      public static void main(String[] args) throws Exception {
        writeConfigFile("ormlite_config.txt");
      }
    }

    默认只查找当前目录下使用了注解的.java文件,也可以手动设置

    public class DatabaseConfigUtil extends OrmLiteConfigUtil {
      private static final Class<?>[] classes = new Class[] {
        Account.class,
      };
      public static void main(String[] args) throws Exception {
        writeConfigFile("ormlite_config.txt", classes);
      }
    }

    然后将生产的ormlite_config.txt文件放到android工程的res-raw目录下,实例化OrmLiteSqliteOpenHelper时则需要传入raw资源id,

    OrmLiteSqliteOpenHelper(Context context, String databaseName, CursorFactory factory, int databaseVersion,int configFileId)

    那么在创建数据表的时候OrmLite框架则会读取配置文件而不会通过注解。以上生成配置文件时可以把用到的model类放入到java工程中,然后在android工程里面依赖java工程,如此可以只保存一份modle类代码,修改时很方便。

    三、数据库增删改查

    对数据库表的增删改查则通过OrmLiteSqliteOpenHelper.getDao(Class<T> clazz)获取到不同的对象的Dao之后进行操作,具体见API文档。OrmLiteSqliteOpenHelper里面通过DaoManager对所有的Dao进行了缓存,不必在别处保存Dao了。

    1、增

    //保存数据
    create(T data)
    //当不存在时保存数据
    createIfNotExists(T data)
    //保存或者更新数据
    createOrUpdate(T data)

    2、删

    //删除数据
    delete(T data)
    //根据ID删除数据
    deleteById(ID id)
    //自定义的删除请求,通过构建DeleteBuilder<T,ID>实现复杂的删除
    deleteBuilder() 

    3、改

    //更新对象
    update(T data)
    //更新对象ID
    updateId(T data, ID newId)
    //返回UpdateBuilder<T,ID>实现复杂更新需求
    updateBuilder()

    4、查

    //根据ID查询
    queryForId(ID id)
    //查询所有数据
    queryForAll()
    //返回QueryBuilder<T,ID>自定义复杂的查询需求
    queryBuilder()

    以上DeleteBuilder, QueryBuilder, UpdateBuilder全部集成于StatementBuilder,因此得到XXBuilder之后可以通过where()设置条件,如下

    QueryBuilder<Account, String> qb = accountDao.queryBuilder();
     Where where = qb.where();
     // the name field must be equal to "foo"
     where.eq(Account.NAME_FIELD_NAME, "foo");
     // and
     where.and();
     // the password field must be equal to "_secret"
     where.eq(Account.PASSWORD_FIELD_NAME, "_secret");
     PreparedQuery<Account, String> preparedQuery = qb.prepareQuery();

    只是对于不同的XXBuilder需要调用不同的方法罢了,如delete()、query()、update()。更多详情见API文档

  • 相关阅读:
    java volatile关键字解惑
    Java 反射
    拷贝源实体类到目标实体类中
    Bean和Map之间的转换
    DateUtils时间的封装
    HttpClient的代码封装,便于直接调用
    HttpClient语法
    LinkedHashMap+ConcurrentHashMap+hashMap的区别
    1006 Tick and Tick
    Event Flow
  • 原文地址:https://www.cnblogs.com/alexthecoder/p/4277758.html
Copyright © 2011-2022 走看看