1.简介
之前做了一段时间的Java Web开发,对于数据库访问,我们使用Hibernate,用起来相当不错。如今做android开发,在使用Sqlite的时候,不禁也会猜测有没有类似Hibernate的ORM框架。结果Google一搜,比较有名的就是ormlite。下面就简单说一下Android中ormlite的使用。
2.ormlite的下载地址:
http://www.ormlite.com/
3.封装与使用
下面我以一个Java Bean为例,简单的对ormlite进行封装。以下是一个聊天消息的JavaBean 取名为ChatMsgEntity
我们不需要在类的前面添加注解,此时,该类映射的数据库表的名称就是类的名称。我们在需要入库的每一个java bean的Field上添加注解,表示这对应着数据库中的字段。对于自增加的主键,我们使用generatedId = true
定义Dao接口
然后就可以使用msgDao对ChatMsgEntity实体类进行“增删改查”的操作了。
之前做了一段时间的Java Web开发,对于数据库访问,我们使用Hibernate,用起来相当不错。如今做android开发,在使用Sqlite的时候,不禁也会猜测有没有类似Hibernate的ORM框架。结果Google一搜,比较有名的就是ormlite。下面就简单说一下Android中ormlite的使用。
2.ormlite的下载地址:
http://www.ormlite.com/
3.封装与使用
下面我以一个Java Bean为例,简单的对ormlite进行封装。以下是一个聊天消息的JavaBean 取名为ChatMsgEntity
我们不需要在类的前面添加注解,此时,该类映射的数据库表的名称就是类的名称。我们在需要入库的每一个java bean的Field上添加注解,表示这对应着数据库中的字段。对于自增加的主键,我们使用generatedId = true
package edu.njupt.zhb.model;
import com.j256.ormlite.field.DatabaseField;
/**
* 一个聊天消息的JavaBean
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*mail: zhb931706659@126.com
*2013-12-23 Nanjing,njupt,China
*/
public class ChatMsgEntity {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private String nickName;//群组的昵称
@DatabaseField
private String name;// 消息来自
@DatabaseField
private String date;// 消息日期
@DatabaseField
private String message;// 消息内容
@DatabaseField
private int msgType;// 消息类型
@DatabaseField
private boolean recv = true;// 是否为收到的消息
public int getMsgType() {
return msgType;
}
public ChatMsgEntity() {
}
public ChatMsgEntity(String name, String date, String message, int msgType,
boolean recv) {
super();
this.name = name;
this.date = date;
this.message = message;
this.msgType = msgType;
this.recv = recv;
}
public boolean isRecv() {
return recv;
}
public void setRecv(boolean recv) {
this.recv = recv;
}
public void setMsgType(int msgType) {
this.msgType = msgType;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
实现自己的OrmLiteSqliteOpenHelper
package edu.njupt.zhb.dao;
import java.sql.SQLException;
import java.util.concurrent.atomic.AtomicInteger;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import edu.njupt.zhb.model.ChatMsgEntity;
/**
* Database helper class used to manage the creation and upgrading of your database. This class also usually provides
* the DAOs used by the other classes.
*/
public class MsgDatabaseHelper extends OrmLiteSqliteOpenHelper {
// name of the database file for your application -- change to something appropriate for your app
private static final String DATABASE_NAME = "chatmsg.db";
// any time you make changes to your database objects, you may have to increase the database version
private static final int DATABASE_VERSION = 3;
// the DAO object we use to access the ChatMsgEntity table
private Dao<ChatMsgEntity, Integer> simpleDao = null;
private static final AtomicInteger usageCounter = new AtomicInteger(0);
// we do this so there is only one helper
private static MsgDatabaseHelper helper = null;
private MsgDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/**
* Get the helper, possibly constructing it if necessary. For each call to this method, there should be 1 and only 1
* call to {@link #close()}.
*/
public static synchronized MsgDatabaseHelper getHelper(Context context) {
if (helper == null) {
helper = new MsgDatabaseHelper(context);
}
usageCounter.incrementAndGet();
return helper;
}
/**
* This is called when the database is first created. Usually you should call createTable statements here to create
* the tables that will store your data.
*/
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
try {
Log.i(MsgDatabaseHelper.class.getName(), "onCreate");
TableUtils.createTable(connectionSource, ChatMsgEntity.class);
} catch (SQLException e) {
Log.e(MsgDatabaseHelper.class.getName(), "Can't create database", e);
throw new RuntimeException(e);
}
}
/**
* This is called when your application is upgraded and it has a higher version number. This allows you to adjust
* the various data to match the new version number.
*/
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
try {
Log.i(MsgDatabaseHelper.class.getName(), "onUpgrade");
TableUtils.dropTable(connectionSource, ChatMsgEntity.class, true);
// after we drop the old databases, we create the new ones
onCreate(db, connectionSource);
} catch (SQLException e) {
Log.e(MsgDatabaseHelper.class.getName(), "Can't drop databases", e);
throw new RuntimeException(e);
}
}
/**
* Returns the Database Access Object (DAO) for our ChatMsgEntity class. It will create it or just give the cached
* value.
*/
public Dao<ChatMsgEntity, Integer> getChatMsgEntityDao() throws SQLException {
if (simpleDao == null) {
simpleDao = getDao(ChatMsgEntity.class);
}
return simpleDao;
}
/**
* Close the database connections and clear any cached DAOs. For each call to {@link #getHelper(Context)}, there
* should be 1 and only 1 call to this method. If there were 3 calls to {@link #getHelper(Context)} then on the 3rd
* call to this method, the helper and the underlying database connections will be closed.
*/
@Override
public void close() {
if (usageCounter.decrementAndGet() == 0) {
super.close();
simpleDao = null;
helper = null;
}
}
}
定义Dao接口
/*
* $filename: OrmSqliteDao.java,v $
* $Date: 2013-12-25 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb.dao;
import java.util.List;
import android.R.bool;
/*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*mail: zhb931706659@126.com
*2013-12-25 Nanjing,njupt,China
*/
public interface OrmSqliteDao<T>{
public boolean save(T object);
public boolean saveOrUpdate(T object);
public List<T> find();
public boolean update(T object);
public boolean delete(T object);
public boolean deleteAll();
public boolean executeSql(String sql);
public T findById();
}
实现OrmLiteDao的封装
/*
* $filename: ChatMsgEntityDao.java,v $
* $Date: 2013-12-25 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb.dao;
import java.sql.SQLException;
import java.util.List;
import android.content.Context;
import com.j256.ormlite.dao.Dao;
import edu.njupt.zhb.model.ChatMsgEntity;
/*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*mail: zhb931706659@126.com
*2013-12-25 Nanjing,njupt,China
*/
public class ChatMsgEntityDao implements OrmSqliteDao<ChatMsgEntity> {
private Dao<ChatMsgEntity, Integer> simpleDao = null;
public ChatMsgEntityDao(Context context) {
// TODO Auto-generated constructor stub
try {
simpleDao = MsgDatabaseHelper.getHelper(context).getChatMsgEntityDao();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean save(ChatMsgEntity object) {
// TODO Auto-generated method stub
try {
simpleDao.create(object);
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
public List<ChatMsgEntity> find() {
// TODO Auto-generated method stub
try {
List<ChatMsgEntity> result = simpleDao.queryForAll();
return result;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public boolean update(ChatMsgEntity object) {
// TODO Auto-generated method stub
try {
simpleDao.update(object);
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
public boolean delete(ChatMsgEntity object) {
// TODO Auto-generated method stub
try {
simpleDao.delete(object);
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
public ChatMsgEntity findById() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean deleteAll() {
// TODO Auto-generated method stub
try {
List<ChatMsgEntity> list = simpleDao.queryForAll();
for(ChatMsgEntity msg:list){
delete(msg);
}
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
public boolean saveOrUpdate(ChatMsgEntity object) {
// TODO Auto-generated method stub
try {
simpleDao.createOrUpdate(object);
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
public boolean executeSql(String sql) {
// TODO Auto-generated method stub
try {
simpleDao.executeRaw(sql);
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}
在Activity中使用Dao对象
OrmSqliteDao<ChatMsgEntity> msgDao = new ChatMsgEntityDao(this);
然后就可以使用msgDao对ChatMsgEntity实体类进行“增删改查”的操作了。
使用心得:
使用起来和Hibernate一样方便。同时,也可以执行原生态的sql语句。
最后,希望大家能够为我投票!2013博客之星投票
http://vote.blog.csdn.net/blogstaritem/blogstar2013/NUPTboyZHB