/*----------------------------------------
*-描述--ORMLite框架使用總結.
*-描述--S1.相關理論描述
* >>ORMlite經過Java註解的方式來創建起與數據庫的映射關係,在Android面向數據庫開發中,是一個比較
* 流行的開源框架,方便操做並且功能強大
* >>ORMLite的優缺點
* 優勢:輕量級、使用簡單、封裝完善、文檔全面
* 缺點:基於反射,效率較低,缺乏中文翻譯文檔
* >>
*-描述--S2.添加到項目
* >>添加庫文件到項目libs下,添加爲庫
* ormlite-android-5.0.jar、ormlite-android-5.0-sources.jar
* ormlite-core-5.0、ormlite-core-5.0-sources.jar
* >>繼承OrmLiteSqliteOpenHelper類定義數據庫幫助類(XXXHelper)
* 能夠在程序被安裝時建立或者升級數據庫
* onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource)
* onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)
* >>定義實體類Bean,表明一張表(XXXModel)
* @DatabaseTable:表示定義了一個數據表,若是不指定名字,在Android中會以類名做爲表名,
* 如packageInfo就是SQLite數據庫中的表名,咱們也能夠指定表名,@DatabaseTable(tableName =
* "tb_package")
* @DatabaseField:表示定義了數據中的一個字段,id表示數據中的一個主鍵,若是指定爲generatedId,
* 表示自動增加id,咱們不須要給它賦值。其餘字段,可使用columnName來指定字段名,canBeNull表
* 示是否爲空,這些賦值能夠按照如下來指定-(id = true, canBeNull = false)(columnName = "name")
* @DatabaseField 經常使用註解:
* columnName 指定字段名,不指定則變量名做爲字段名
* canBeNull 字段是否能被分配null值。默認是true。若是你設置成false,那麼你每次在數據庫中
* 插入數據是都必須爲這個字段提供值。
* dataType 指定字段的類型
* defaultValue 當咱們在表中建立新的記錄時的一個字段的默認值。默認狀況下是沒有這個值的
* width 字段的寬度,主要用於字符串字段。默認是0
* id 這個字段是不是id,默認是false。在一個class中只有一個成變量能夠有這個值。id字段是一條
* 記錄的惟一標識並且是必需的,只能在generatedId和 generatedIdSequence其中選一個。
* generatedId 字段是否自動增長。默認爲false。類中的一個成員變量設置了這個值,它告訴數據庫
* 每添加一條新記錄都自動增長id。當一個有generatedid的對象被建立時使用Dao.create()方法
* ,數據庫將爲記錄生成一個id,它會被返回而且被create方法設置進對象。
* generatedIdSequence 序列編號的名字,這個值在生成的時候會被使用。和generatedId類似,可是
* 你可以指定使用的序列名稱。默認是沒有的。
* foreign 指定這個字段的對象是一個外鍵,外鍵值是這個對象的id
* persisted 指定是否持久化此變量,默認true
* foreignAutoCreate 外鍵不存在時是否自動添加到外間表中
* foreignColumnName 外鍵字段指定的外鍵表中的哪一個字段
* @ForeignCollectionField經常使用註解
* eager 表示該集合是在初始化這個對象的時候,是否講對象取出仍是在遍歷的時候才取出,默認false
* 遍歷的時候才取出,size()方法也會引發遍歷
* columnName
* orderColumnName
* foreignFieldName
* >>數據庫的增刪查改(XXXDao)
* 插入操做
* create:插入一條數據
* createIfNotExists:若是不存在則插入
* createOrUpdate:若是存在則更新
* 查詢操做
* 首先調用xxxDao.queryBuilder();得到該Dao下的QueryBuilder對象
* 接下來設置QueryBuilder的查詢條件
* 最後經過QueryBuilder的query方法得到List對象
* 刪除和更改操做
* 與查詢操做相似,ORMLite一樣爲咱們提供了一系列的方法,同時也提供了複雜刪除,複雜更
* 改的DeleteBuilder和UpdateBuilder,其用法與QueryBuilder類似
* 主要方法
* create 插入一條數據
* createIfNotExists 若是不存在則插入
* createOrUpdate 若是指定id則更新
* queryForId 更具id查找
* update 查找出數據
* delete 刪除數據
* queryBuilder() 建立一個查詢生成器:進行復雜查詢
* deleteBuilder() 建立一個刪除生成器,進程複雜條件刪除
* updateBuilder() 建立修條件生成器,進行復雜條件修改
* 參考:https://www.zybuluo.com/flyouting/note/6996
*-描述--深刻部分
* ORMLite外鍵引用
* 關聯一個集合
* 參考:
* http://blog.csdn.net/lmj623565791/article/details/39122981
* http://www.jianshu.com/p/05782b598cf0
* https://bng86.gitbooks.io/android-third-party-/content/ormlite.html
*-描述--B1.None.
* 官方網站:
* http://ormlite.com/
* http://ormlite.com/releases/
* https://github.com/j256/ormlite-android
* 參考文檔:
* http://blog.csdn.net/lmj623565791/article/details/39121377
* http://blog.csdn.net/lmj623565791/article/details/39122981
* http://www.jianshu.com/p/05782b598cf0
* https://bng86.gitbooks.io/android-third-party-/content/ormlite.html
*---------------------------------------------------------------------------*/
/**
* Created by envy15 on 2016/8/2.
* 建立數據庫表項
* 對於類中的每一個須要存儲的成員變量,都須要添加@DatabaseField註解
*/
//tableName表示建立該表的表名,不帶該配置表示使用類名做爲表名
@DatabaseTable(tableName = "model_table")
public class TestModel implements Serializable {
//private final String TEST_MODEL_ID = "id";
private final String TEST_MODEL_TITLE = "modelTitle";
private final String TEST_MODEL_URL = "modelUrl";
private final String TEST_MODEL_DETAIL = "modelDetail";
private final String TEST_MODEL_COUNT = "modelCount";
private final String TEST_MODEL_STATE = "modelStatus";
private final String TEST_MODEL_ITEM = "modelItem";
//id = true 配置爲主鍵,generatedId = true 主鍵自動增加
@DatabaseField(generatedId = true)
public int id;
//存儲的成員變量添加@DatabaseField註解
@DatabaseField(columnName = TEST_MODEL_TITLE)
public String modelTitle;
@DatabaseField(columnName = TEST_MODEL_URL)
public String modelUrl;
@DatabaseField(columnName = TEST_MODEL_DETAIL)
public String modelDetail;
@DatabaseField(columnName = TEST_MODEL_COUNT)
public int modelCount;
@DatabaseField(columnName = TEST_MODEL_STATE,defaultValue = "0")
public int modelStatus;
//canBeNull -表示不能爲null;foreign=true表示是一個外鍵;columnName 列名
// @DatabaseField(canBeNull = true, foreign = true, columnName = TEST_MODEL_ITEM)
private TestItem testItem;
//如下注釋未調試
// //@ForeignCollectionField 表示這個表中的數據在其餘表中是外鍵
// //成員變量items的類型必需要麼是ForeignCollection<T>要麼是Collection<T>
// @ForeignCollectionField(eager = false)
// public ForeignCollection<TestItem> items;
// // 外部對象字段
// @DatabaseField(foreign = true, foreignAutoRefresh = true)
// public PackageInfo mPackage;
//
// @DatabaseField(foreign = true, foreignAutoRefresh = true)
// public Photographer photographer;
// /**
// * 這裏須要注意的是:屬性類型只能是ForeignCollection<T>或者Collection<T>
// * 若是須要懶加載(延遲加載)能夠在@ForeignCollectionField加上參數eager=false
// * 這個屬性也就說明一個部門對應着多個用戶
// */
// @ForeignCollectionField(eager = true)
// public ForeignCollection<Img> imgs;
public TestModel() {
}
public TestModel(String modelTitle, String modelDetail) {
this.modelTitle = modelTitle;
this.modelDetail = modelDetail;
}
public TestModel(String modelTitle, String modelDetail, int modelStatus) {
this.modelTitle = modelTitle;
this.modelDetail = modelDetail;
this.modelStatus = modelStatus;
}
public int getModelId() {
return id;
}
public void setModelId(int modelId) {
this.id = modelId;
}
public String getModelTitle() {
return modelTitle;
}
public void setModelTitle(String modelTitle) {
this.modelTitle = modelTitle;
}
public String getModelUrl() {
return modelUrl;
}
public void setModelUrl(String modelUrl) {
this.modelUrl = modelUrl;
}
public String getModelDetail() {
return modelDetail;
}
public void setModelDetail(String modelDetail) {
this.modelDetail = modelDetail;
}
public int getModelCount() {
return modelCount;
}
public void setModelCount(int modelCount) {
this.modelCount = modelCount;
}
public int getModelStatus() {
return modelStatus;
}
public void setModelStatus(int modelStatus) {
this.modelStatus = modelStatus;
}
public TestItem getTestItem() {
return testItem;
}
public void setTestItem(TestItem testItem) {
this.testItem = testItem;
}
@Override
public String toString() {
return "TestModel{" +
"id=" + id +
", modelTitle='" + modelTitle + '\'' +
", modelUrl='" + modelUrl + '\'' +
", modelDetail='" + modelDetail + '\'' +
", modelCount=" + modelCount +
", modelStatus=" + modelStatus +
'}';
}
}
/**
* Created by envy15 on 2016/8/2.
* 定義數據訪問對象,對指定的表進行增刪改查操做
*
*/
public class ModelDao {
private Dao<TestModel, Integer> modelDao;
private DBHelper dbHelper;
/**
* 構造方法
* 得到數據庫幫助類實例,經過傳入Class對象獲得相應的Dao
* @param context
*/
public ModelDao(Context context) {
try {
dbHelper = DBHelper.getHelper(context);
modelDao = dbHelper.getDao(TestModel.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 添加一條記錄
* @param model
*/
public void add(TestModel model) {
try {
//LogUtil.infoE(this,"model:"+(model==null)+" modelDao:"+(modelDao==null));
modelDao.create(model);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 刪除一條記錄
* @param model
*/
public void delete(TestModel model) {
try {
modelDao.delete(model);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 更新一條記錄
* @param model
*/
public void update(TestModel model) {
try {
modelDao.update(model);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 查詢一條記錄
* @param id
* @return
*/
public TestModel queryForId(int id) {
TestModel model = null;
try {
model = modelDao.queryForId(id);
} catch (SQLException e) {
e.printStackTrace();
}
return model;
}
/**
* 根據模型查詢匹配的記錄
* @param model
* @return
*/
public List<TestModel> queryForModel(TestModel model) {
List<TestModel> mModel = null;
try {
mModel = modelDao.queryForMatching(model);
//queryForMatching/queryForMatchingArgs查詢結果同樣
//mModel = modelDao.queryForMatchingArgs(model);
} catch (SQLException e) {
e.printStackTrace();
}
return mModel;
}
/**
* 根據模型Key-Value查詢匹配的記錄
* @param var1 key
* @param var2 value
* @return
*/
public List<TestModel> queryForKey(String var1, Object var2) {
List<TestModel> mModel = null;
try {
mModel = modelDao.queryForEq(var1,var2);
} catch (SQLException e) {
e.printStackTrace();
}
return mModel;
}
/**
* 其餘查詢測試
* @param model
* @return
* 參考:
* http://blog.csdn.net/quanjin24k/article/details/11620803
* http://www.cnblogs.com/vanezkw/archive/2012/08/15/2640290.html
* http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Class-Setup
* http://www.ithao123.cn/content-8115868.html
*/
//public List<TestModel> queryForModel1(Map<String, Object> mMap) {
public List<TestModel> queryForModel1(TestModel model) {
List<TestModel> mModel = null;
try {
//根據Model查詢
//mModel = modelDao.queryForMatching(model);
//經過Key-Value查詢
//mModel = modelDao.queryForEq("modelTitle","setModelTitle");
//mModel = modelDao.queryForEq("modelStatus",3);
// //根據多個key-value參數查詢(Map集合)
// Map<String, Object> mMap = new HashMap<String, Object>();
// mMap.put("modelStatus",3);
// mMap.put("modelTitle","setModelTitle");
// mModel = modelDao.queryForFieldValues(mMap);
// mModel = modelDao.queryForFieldValuesArgs(mMap);
//帶排序的查詢
mModel = modelDao.queryBuilder().orderBy("id",false).where().eq("modelStatus",3)
.and().eq("modelTitle","setModelTitle").query();
// //經過SQL語句排序查詢結果
// mModel = modelDao.queryBuilder().orderByRaw("sql-statement").where().eq("modelStatus",3)
// .and().eq("modelTitle","setModelTitle").query();
//SQL語句查詢
//modelDao.queryRaw("select * from data where id = 2");
} catch (SQLException e) {
e.printStackTrace();
}
return mModel;
}
/**
* 查詢全部記錄
* @return
*/
public List<TestModel> queryForAll() {
List<TestModel> models = new ArrayList<TestModel>();
try {
models = modelDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return models;
}
}
/**
* Created by envy15 on 2016/8/2.
* 能夠在程序被安裝時建立或者升級數據庫
* 須要實現:一個用於生成數據庫,一個用於升級數據庫
* onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource)
* onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)
*/
public class DBHelper extends OrmLiteSqliteOpenHelper {
/**
* 數據庫名字
*/
private static final String DB_NAME = "testModel.db";
/**
* 數據庫版本
*/
private static final int DB_VERSION = 1;
/**
* 用來存放Dao的地圖
*/
private Map<String, Dao> daos = new HashMap<>();
private static DBHelper instance;
/**
* 構造方法
* @param context
*/
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 這裏建立表
*/
@Override
public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) {
// 建立表
try {
TableUtils.createTable(connectionSource, TestModel.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 這裏進行更新表操做
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource,
int oldVersion, int newVersion) {
try
{
TableUtils.dropTable(connectionSource, TestModel.class, true);
onCreate(sqLiteDatabase, connectionSource);
} catch (SQLException e)
{
e.printStackTrace();
}
}
/**
* 獲取單例
* @param context
* @return
*/
public static synchronized DBHelper getHelper(Context context) {
context = context.getApplicationContext();
if (instance == null) {
synchronized (DBHelper.class) {
if (instance == null) {
instance = new DBHelper(context);
}
}
}
return instance;
}
/**
* 獲取單例-數據庫存貯SD目錄下
* @param context
* @return
*/
public static synchronized DBHelper getHelper(Context context,String path) {
context = new DatabaseContext(context, path);
if (instance == null) {
synchronized (DBHelper.class) {
if (instance == null) {
instance = new DBHelper(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;
}
/**
* 釋放資源
*/
@Override
public void close() {
super.close();
for (String key : daos.keySet()) {
Dao dao = daos.get(key);
dao = null;
}
}
}
public void initDatas() { //測試程序 LogUtil.infoD(this, "initViews"); LogUtil.infoE(this, "OrmLiteStartTime:"+System.currentTimeMillis()+""); TestModel testModel1 = new TestModel("setModelTitle","setModelDetail1",1); TestModel testModel2 = new TestModel("setModelTitle","setModelDetail2",2); TestModel testModel3 = new TestModel("setModelTitle","setModelDetail3",3); TestModel testModel4 = new TestModel("setModelTitle","setModelDetail4",4); TestModel testModel5 = new TestModel("setModelTitle","setModelDetail5",5); ModelDao modelDao = new ModelDao(this); //LogUtil.infoE(this,"testModel:"+(testModel==null)+" modelDao:"+(modelDao==null)); //數據庫的插入操做測試 modelDao.add(testModel1); modelDao.add(testModel2); modelDao.add(testModel3); modelDao.add(testModel4); modelDao.add(testModel5); //先查詢一條記錄(根據ID),更改後存貯到數據庫 testModel = modelDao.queryForId(5); testModel.setModelStatus(8); modelDao.update(testModel); //刪除操做,刪除是經過testModel ID刪除 testModel.setModelId(6); modelDao.delete(testModel); //數據庫的查詢操做測試 List<TestModel> testModelList = modelDao.queryForAll(); for(int i=0;i<testModelList.size();i++) { LogUtil.infoE(this, testModelList.get(i).toString()); } //條件查詢,根據TestModel參數匹配,TestModel設置幾個參數匹配幾個參數 TestModel testModel6 = new TestModel(); testModel6.setModelTitle("setModelTitle"); List<TestModel> testModelList1 = modelDao.queryForModel1(testModel6); for(int i=0;i<testModelList1.size();i++) { LogUtil.infoE(this, "條件查詢"+testModelList1.get(i).toString()); } LogUtil.infoE(this, "OrmLiteStartEnd:"+System.currentTimeMillis()+"");}