安卓資料庫ORMLite架構總結

來源:互聯網
上載者:User

標籤:

/*----------------------------------------
*-描述--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.
* 定義Data Access Objects,對指定的表進行增刪改查操作
*
*/
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()+"");
}

安卓資料庫ORMLite架構總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.