在Android中使用ORMLite

在Android中使用ORMLite

ORMLite是一个ORM(对象关系映射)框架。那么ORM是什么呢?网上的定义balabala一堆,完了还是不清楚。个人理解就是:将关系数据库中的一行与一个对象对应起来。
Android中使用的是SQLite数据库,使用上相对也是简单。但是很多情况下要将原生的sql语句写到代码中,并且对于我来说,数据库优化也是一个很大的问题。ORMLite通过注解的方式,为我们做了很多工作,在使用上相当便捷。
废话不多说,下面开始使用ORMLite。

1、首先将jar包加入工程

官网上下载ormlite-android-4.48.jar和ormlite-core-4.48.jar两个jar包。并添加到libs文件夹中,并确保module的build.gradle依赖中有这句:compile fileTree(dir: ‘libs’, include: [‘*.jar’])。如下:
这里写图片描述

2、接下来就可以创建实体类了

这里创建一个实体类:

@DatabaseTable(tableName = "user")//表示表名为user
public class User {
    //一定要有空的构造方法
    public User(){}

    //generatedId表示自动生成id,如果属性为private的,useGetSet就需要设置为true,表示使用get和set方法。
    @DatabaseField(generatedId = true,useGetSet = true)
    private int id;
    //columnName指定列名
    @DatabaseField(columnName = "name",useGetSet = true)
    private String name;
    @DatabaseField(columnName = "number",useGetSet = true)
    private String number;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}

下面列举一些常用的属性:
• cloumnName:指定字段名,不指定则变量名作为字段名
• canBeNull:是否可以为null
• dataType:指定字段的类型
• generatedId:指定字段为自增长的id,不能id,generatedIdSequence通用
• id:指定字段为id
• index:索引
• useGetSet:指定ormlite访问变量使用set,get方法默认使用的是反射机制直接访问变量
• unique:字段值唯一

3、创建数据库,打造Helper

使用过SQLite的都知道,要继承SQLiteOpenHelper才能创建出数据库。ORMLite中也一样需要创建出Helper,不过其继承OrmLiteSqliteOpenHelper。

public class SQLHelper extends OrmLiteSqliteOpenHelper {
    //表名
    private static final String TABLE_NAME="sl.db";
    private Map daos=new HashMap();

    private SQLHelper(Context context){
        super(context,TABLE_NAME,null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        try {
            //创建表
            TableUtils.createTable(connectionSource,User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {

        try {
            //删除表
            TableUtils.dropTable(connectionSource,User.class,true);
            onCreate(sqLiteDatabase,connectionSource);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static SQLHelper instance;

    //单例模式,获取helper。
    public static synchronized SQLHelper getHelper(Context context){
        if(instance==null){
            synchronized (SQLHelper.class){
                if(instance==null){
                    instance=new SQLHelper(context);
                }
            }
        }
        return instance;
    }

    //获取dao
    public synchronized Dao getDao(Class clazz) throws SQLException{
        Dao dao=null;
        String className=clazz.getSimpleName();
        if(daos.containsKey(className)){
            dao=daos.get(className);
        }
        if(dao==null){
            dao=super.getDao(clazz);
            daos.put(className,dao);
        }
        return dao;
    }

    public void close(){
        super.close();
        for(String key:daos.keySet()){
            Dao dao=daos.get(key);
            dao=null;
        }
    }
}

onCreate在第一次运行程序时执行,用于生成表。onUpdate在更新数据库版本时执行。为了能在其他类中操作数据库,提供了getHelper和getDao方法。getHelper使用单例模式,保证整个程序中只有一个SQLHelper实例,节省资源。getDao方法获取到Dao的实例,用于CRUD操作。

4、使用ORMlite操作数据

ORMLite操作数据都是先获取到Dao再操作的。Dao这个类中有CRUD的所有方法。以下是查询操作:

//将数据库中的数据填充到userlist中
private void getData(){
    //获取到helper
    helper= SQLHelper.getHelper(MainActivity.this);
    Dao dao= null;
    try {
        dao = helper.getDao(User.class);//获取dao
        userList=dao.queryForAll();//查询所有数据
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

userList是一个List。dao.queryForAll()相当于sql语句:”select * from table”。以下是添加一条数据:

private void setData(String name,String number){
    helper= SQLHelper.getHelper(AddUserActivity.this);
    Dao dao=null;
    try {
        dao = helper.getDao(User.class);
        User user=new User();
        user.setName(name);
        user.setNumber(number);
        dao.create(user);//插入一条数据
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

可见,ORMLite操作数据库非常简单,crud都进行了封装,使用的时候查看文档就行。

5、生成配置文件

ORMLite大量使用了反射,其速度相当慢。为了提高操作数据库速度,ORMLite官网中提出要生成配置文件。
第一步,在res目录下新建raw文件夹,然后再raw文件夹中新建文件:ormlite_config.txt。
第二步,继承OrmLiteConfigUtil类。

public class DatabaseConfigUtil extends OrmLiteConfigUtil {

    //将自己实体类添加到数组中。本项目只有User一个实体类
    private static final Class[] classes=new Class[]{User.class};

    public static void main(String[] args) throws IOException, SQLException {
        writeConfigFile("ormlite_config.txt",classes); 
    }
}

第三步,运行DatabaseConfigUtil。
在DatabaseConfigUtil中右键——>Run’DatabaseConfig…main()’。如果ormlite_config.txt生成了如下内容:

#
# generated on 2016/05/02 02:15:19
#
# --table-start--
dataClass=com.chong.bin.ormdemo.bean.User
tableName=user
# --table-fields-start--
# --field-start--
fieldName=id
generatedId=true
useGetSet=true
# --field-end--
# --field-start--
fieldName=name
columnName=name
useGetSet=true
# --field-end--
# --field-start--
fieldName=number
columnName=number
useGetSet=true
# --field-end--
# --table-fields-end--
# --table-end--
#################################

表示运行成功。否则失败。可能配置出了问题。在app下来框中点击Edit Configurations…。做如下配置(注意红色箭头所指。):
在Android中使用ORMLite_第1张图片

6、注意事项

凡是涉及到数据库操作,都要注意资源回收。使用了helper后,注意要释放资源。Activity的onDestroy方法如下:

@Override
protected void onDestroy() {
    super.onDestroy();
    if(helper!=null){
        OpenHelperManager.releaseHelper();
        helper=null;
    }
}

这里有源码:http://download.csdn.net/detail/wen_wu_shuang_quan/9508089

你可能感兴趣的:(Android,ORMLite,android,数据库,RecyclerVi)