首先说明一下,本人已经使用ormlite-android做过两个大型的项目开发,很久以来就想对此数据库做一些总结,正好今天有空就写出来:
1. 首先去官网http://ormlite.com/看官方说明,也可以去http://ormlite.com/releases/下载两个包:一个是ormlite-core-4.24.jar,另一个是ormlite-android-4.24.jar
2. 下载完2个jar包后导入项目中,在此不多说,大家都懂的
3.前奏工作完成,下面就是怎么去搭建框架使用了,首先说明本人做过一段时间的web开发,所以喜欢用mvc模式,下面将通过代码来说明:
1).建立自己的DatabaseHelper类
public class DatabaseHelper extends OrmLiteSqliteOpenHelper { // name of the database file for your application -- change to something // appropriate for your app private static final String DATABASE_NAME = "CHENGYIJI.db"; // any time you make changes to your database objects, you may have to // increase the database version private static final int DATABASE_VERSION = 1; // the DAO object we use to access the SimpleData table //数据库默认路径SDCard
private static String DATABASE_PATH = Environment.getExternalStorageDirectory() + "/CHENGYIJI.db"; private Context mContext;
//数据库配置文件默认路径SDCard
private static String DATABASE_PATH_JOURN = Environment.getExternalStorageDirectory() + "/CHEYIJI.db-journal"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); mContext = context; initDtaBasePath(); try { File f = new File(DATABASE_PATH); if (!f.exists()) { SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DATABASE_PATH, null); onCreate(db); db.close(); } } catch (Exception e) { } }
//如果没有SDCard 默认存储在项目文件目录下
private void initDtaBasePath() { if (!Utils.ExistSDCard()) { DATABASE_PATH = mContext.getFilesDir().getAbsolutePath() + "/CHENGYIJI.db"; DATABASE_PATH_JOURN = mContext.getFilesDir().getAbsolutePath() + "/CHEYIJI.db-journal"; } } @Override public synchronized SQLiteDatabase getWritableDatabase() { return SQLiteDatabase.openDatabase(DATABASE_PATH, null, SQLiteDatabase.OPEN_READWRITE); } public synchronized SQLiteDatabase getReadableDatabase() { return SQLiteDatabase.openDatabase(DATABASE_PATH, null, SQLiteDatabase.OPEN_READONLY); } /** * 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) { LogTool.i(DatabaseHelper.class.getName(), "onCreate"); try { TableUtils.createTable(connectionSource, UserInfo.class); } catch (java.sql.SQLException e) { LogTool.e(DatabaseHelper.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) { LogTool.i(DatabaseHelper.class.getName(), "onUpgrade"); try { TableUtils.dropTable(connectionSource, UserInfo.class, true); onCreate(db, connectionSource); } catch (java.sql.SQLException e) { LogTool.e(DatabaseHelper.class.getName(), "Can‘t drop databases", e); throw new RuntimeException(e); } } public void deleteDB() { if (mContext != null) { File f = mContext.getDatabasePath(DATABASE_NAME); if (f.exists()) { // mContext.deleteDatabase(DATABASE_NAME); LogTool.e("DB", "---delete SDCard DB---"); f.delete(); } else { LogTool.e("DB", "---delete App DB---"); mContext.deleteDatabase(DATABASE_NAME); } File file = mContext.getDatabasePath(DATABASE_PATH); if (file.exists()) { LogTool.e("DB", "---delete SDCard DB 222---"); file.delete(); } File file2 = mContext.getDatabasePath(DATABASE_PATH_JOURN); if (file2.exists()) { LogTool.e("DB", "---delete SDCard DB 333---"); file2.delete(); } } } /** * Close the database connections and clear any cached DAOs. */ @Override public void close() { super.close(); } }
2)创建自己的数据库操作Dao层】
public abstract class BaseDao<T, Integer> { protected DatabaseHelper mDatabaseHelper; protected Context mContext; public BaseDao(Context context) { mContext = context; getHelper(); } public DatabaseHelper getHelper() { if (mDatabaseHelper == null) { mDatabaseHelper = OpenHelperManager.getHelper(mContext, DatabaseHelper.class); } return mDatabaseHelper; } public abstract Dao<T, Integer> getDao() throws SQLException; public int save(T t) throws SQLException { return getDao().create(t); } public List<T> query(PreparedQuery<T> preparedQuery) throws SQLException { Dao<T, Integer> dao = getDao(); return dao.query(preparedQuery); } public List<T> query(String attributeName, String attributeValue) throws SQLException { QueryBuilder<T, Integer> queryBuilder = getDao().queryBuilder(); queryBuilder.where().eq(attributeName, attributeValue); PreparedQuery<T> preparedQuery = queryBuilder.prepare(); return query(preparedQuery); } public List<T> query(String[] attributeNames, String[] attributeValues) throws SQLException, InvalidParamsException { if (attributeNames.length != attributeValues.length) { throw new InvalidParamsException("params size is not equal"); } QueryBuilder<T, Integer> queryBuilder = getDao().queryBuilder(); Where<T, Integer> wheres = queryBuilder.where(); for (int i = 0; i < attributeNames.length; i++) { wheres.eq(attributeNames[i], attributeValues[i]); } PreparedQuery<T> preparedQuery = queryBuilder.prepare(); return query(preparedQuery); } public List<T> queryAll() throws SQLException { // QueryBuilder<T, Integer> queryBuilder = getDao().queryBuilder(); // PreparedQuery<T> preparedQuery = queryBuilder.prepare(); // return query(preparedQuery); Dao<T, Integer> dao = getDao(); return dao.queryForAll(); } public T queryById(String idName, String idValue) throws SQLException { List<T> lst = query(idName, idValue); if (null != lst && !lst.isEmpty()) { return lst.get(0); } else { return null; } } public int delete(PreparedDelete<T> preparedDelete) throws SQLException { Dao<T, Integer> dao = getDao(); return dao.delete(preparedDelete); } public int delete(T t) throws SQLException { Dao<T, Integer> dao = getDao(); return dao.delete(t); } public int delete(List<T> lst) throws SQLException { Dao<T, Integer> dao = getDao(); return dao.delete(lst); } public int delete(String[] attributeNames, String[] attributeValues) throws SQLException, InvalidParamsException { List<T> lst = query(attributeNames, attributeValues); if (null != lst && !lst.isEmpty()) { return delete(lst); } return 0; } public int deleteById(String idName, String idValue) throws SQLException, InvalidParamsException { T t = queryById(idName, idValue); if (null != t) { return delete(t); } return 0; } public int update(T t) throws SQLException { Dao<T, Integer> dao = getDao(); return dao.update(t); } public boolean isTableExsits() throws SQLException { return getDao().isTableExists(); } public long countOf() throws SQLException { return getDao().countOf(); } public List<T> query(Map<String, Object> map) throws SQLException { QueryBuilder<T, Integer> queryBuilder = getDao().queryBuilder(); if (!map.isEmpty()) { Where<T, Integer> wheres = queryBuilder.where(); Set<String> keys = map.keySet(); ArrayList<String> keyss = new ArrayList<String>(); keyss.addAll(keys); for (int i = 0; i < keyss.size(); i++) { if (i == 0) { wheres.eq(keyss.get(i), map.get(keyss.get(i))); } else { wheres.and().eq(keyss.get(i), map.get(keyss.get(i))); } } } PreparedQuery<T> preparedQuery = queryBuilder.prepare(); return query(preparedQuery); } public List<T> query(Map<String, Object> map, Map<String, Object> lowMap, Map<String, Object> highMap) throws SQLException { QueryBuilder<T, Integer> queryBuilder = getDao().queryBuilder(); Where<T, Integer> wheres = queryBuilder.where(); if (!map.isEmpty()) { Set<String> keys = map.keySet(); ArrayList<String> keyss = new ArrayList<String>(); keyss.addAll(keys); for (int i = 0; i < keyss.size(); i++) { if (i == 0) { wheres.eq(keyss.get(i), map.get(keyss.get(i))); } else { wheres.and().eq(keyss.get(i), map.get(keyss.get(i))); } } } if (!lowMap.isEmpty()) { Set<String> keys = lowMap.keySet(); ArrayList<String> keyss = new ArrayList<String>(); keyss.addAll(keys); for (int i = 0; i < keyss.size(); i++) { if(map.isEmpty()){ wheres.gt(keyss.get(i), lowMap.get(keyss.get(i))); }else{ wheres.and().gt(keyss.get(i), lowMap.get(keyss.get(i))); } } } if (!highMap.isEmpty()) { Set<String> keys = highMap.keySet(); ArrayList<String> keyss = new ArrayList<String>(); keyss.addAll(keys); for (int i = 0; i < keyss.size(); i++) { wheres.and().lt(keyss.get(i), highMap.get(keyss.get(i))); } } PreparedQuery<T> preparedQuery = queryBuilder.prepare(); return query(preparedQuery); } }
3)怎么应用首先有一个model对象public class CashFlow implements ICashFlowRecorder, Serializable { /** * */ private static final long serialVersionUID = 1L;
// 流水号ID @DatabaseField(generatedId = true, columnName = "cash_flow_id") private long cashFlowId;
// 类型:0收,1支 @DatabaseField(canBeNull = false, columnName = "type") private int type;
// 资金类型 - 0 贷款,1借款,2货款,3其他 @DatabaseField(canBeNull = false, columnName = "cash_type") private int cashType;
// 资金类型为其他是的 描述 @DatabaseField(columnName = "other_type_desc") private String otherTypeDesc;
// 是否参与核销:0否,1是 @DatabaseField(canBeNull = false, columnName = "write_off_flag") private int writeOffFlag;
// 关联用户ID // private long referUserId; @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "phone_book_id") private PhoneBook referUser;
// 资金 @DatabaseField(canBeNull = false, columnName = "amount") private double amount;
// 登记日期 @DatabaseField(canBeNull = false, columnName = "reg_date") private long regDate;
// 创建时间 @DatabaseField(canBeNull = false, columnName = "create_date") private long createDate;
// 修改时间 @DatabaseField(canBeNull = false, columnName = "update_date") private long updateDate;
// 关联账单ID @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "bill_id") private Bill referBill;
public long getCashFlowId() { return cashFlowId; }
public void setCashFlowId(long cashFlowId) { this.cashFlowId = cashFlowId; }
public int getType() { return type; }
public void setType(int type) { this.type = type; }
public int getCashType() { return cashType; }
public void setCashType(int cashType) { this.cashType = cashType; }
public String getOtherTypeDesc() { return otherTypeDesc; }
public void setOtherTypeDesc(String otherTypeDesc) { this.otherTypeDesc = otherTypeDesc; }
public int getWriteOffFlag() { return writeOffFlag; }
public void setWriteOffFlag(int writeOffFlag) { this.writeOffFlag = writeOffFlag; }
public PhoneBook getReferUser() { return referUser; }
public void setReferUser(PhoneBook referUser) { this.referUser = referUser; }
public double getAmount() { return amount; }
public void setAmount(double amount) { this.amount = amount; }
public long getRegDate() { return regDate; }
public void setRegDate(long regDate) { this.regDate = regDate; }
public long getCreateDate() { return createDate; }
public void setCreateDate(long createDate) { this.createDate = createDate; }
public long getUpdateDate() { return updateDate; }
public void setUpdateDate(long updateDate) { this.updateDate = updateDate; }
public Bill getReferBill() { return referBill; }
public void setReferBill(Bill referBill) { this.referBill = referBill; }
}
然后建立自己的daopublic class CashFlowDao extends BaseDao<CashFlow, Integer> {
public CashFlowDao(Context context) { super(context); }
@Override public Dao<CashFlow, Integer> getDao() throws SQLException { return getHelper().getDao(CashFlow.class); }
}
最后应用dao,查询某一段时间内的CashFlow@SuppressWarnings("deprecation") private void queCashFlow(int msgType, long lowTime, long highTime) { try { CashFlowDao cashFlowDao = new CashFlowDao(this); Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> lowMap = new HashMap<String, Object>(); lowMap.put("create_date", lowTime); Map<String, Object> highMap = new HashMap<String, Object>(); highMap.put("create_date", highTime); ArrayList<CashFlow> cashFlows = (ArrayList<CashFlow>)cashFlowDao.query(map, lowMap, highMap); if (cashFlows != null && cashFlows.size() > 0) { Message message = new Message(); message.what = msgType; message.obj = cashFlows; handler.sendMessage(message); } else { handler.sendEmptyMessage(4); } } catch (SQLException e) { handler.sendEmptyMessage(4); } }