ORMLite是一个ORM(对象关系映射)框架。那么ORM是什么呢?网上的定义balabala一堆,完了还是不清楚。个人理解就是:将关系数据库中的一行与一个对象对应起来。
Android中使用的是SQLite数据库,使用上相对也是简单。但是很多情况下要将原生的sql语句写到代码中,并且对于我来说,数据库优化也是一个很大的问题。ORMLite通过注解的方式,为我们做了很多工作,在使用上相当便捷。
废话不多说,下面开始使用ORMLite。
官网上下载ormlite-android-4.48.jar和ormlite-core-4.48.jar两个jar包。并添加到libs文件夹中,并确保module的build.gradle依赖中有这句:compile fileTree(dir: ‘libs’, include: [‘*.jar’])。如下:
这里创建一个实体类:
@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:字段值唯一
使用过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操作。
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都进行了封装,使用的时候查看文档就行。
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…。做如下配置(注意红色箭头所指。):
凡是涉及到数据库操作,都要注意资源回收。使用了helper后,注意要释放资源。Activity的onDestroy方法如下:
@Override
protected void onDestroy() {
super.onDestroy();
if(helper!=null){
OpenHelperManager.releaseHelper();
helper=null;
}
}