編輯:關於Android編程
這一篇來記錄一下使用ActiveAndroid關系型數據庫進行本地對象的保存。
該項目的github地址:https://github.com/pardom/ActiveAndroid
首先配置,我們需要在gradle中添加
public class MyApplication extends SomeLibraryApplication { @Override public void onCreate() { super.onCreate(); ActiveAndroid.initialize(this); } @Override public void onTerminate() { super.onTerminate(); ActiveAndroid.dispose(); } }
AA_DB_NAME 表示數據庫的名稱
AA_DB_VERSION 表示數據當前的版本號
這樣我們配置工作就結束了。
@Table(name = "Categories") public class Category extends Model { @Column(name = "Name") public String name; } @Table(name = "Items") public class Item extends Model { @Column(name = "Name") public String name; @Column(name = "Category") public Category category; }
這是作者給我們提供的兩個實例對象,從這裡可以看出:
首先你必須繼承Model類。
@Table(name = “Categories”) 代表關系表的名字
@Column(name = “Name”) 代表關系表中的列名
從上面還可以看出支持一個表中引用另一個表的對象。
Category restaurants = new Category(); restaurants.name = "Restaurants"; restaurants.save(); Item item = new Item(); item.category = restaurants; item.name = "Outback Steakhouse"; item.save();
簡直簡單到沒朋友,定義好對象後,最後加一個sava就可以了。
使用事務批量增加數據
ActiveAndroid.beginTransaction(); try { for (int i = 0; i < 100; i++) { Item item = new Item(); item.name = "Example " + i; item.save(); } ActiveAndroid.setTransactionSuccessful(); } finally { ActiveAndroid.endTransaction(); }
作者說使用事務花費40ms,不使用花費4s,所以說大量數據的增加一定要用這個啊。
調用delete()方法就可以刪除一條記錄,下面的例子中,通過id加載一個Item對象,並且刪除他。
Item item = Item.load(Item.class, 1); item.delete(); new Delete().from(Item.class).where("Id = ?", 1).execute();
new Update(Person.class).set("age=?," + "name=?", age, name).execute();
如果你想要在你的數據表中隨機獲取一個對象的話
public static Item getRandom(Category category) { return new Select() .from(Item.class) .where("Category = ?", category.getId()) .orderBy("RANDOM()") .executeSingle(); }
查詢所有
public static List- getAll(Category category) { return new Select() .from(Item.class) .where("Category = ?", category.getId()) .orderBy("Name ASC") .execute(); }
還是先說一下需求:再點擊下圖的星星之後,這個美食就被我們收藏到本地。
所以首先就是定義表了。下面是我定義的三張表
(1) 美食介紹表<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
/**
* 作者:GXL on 2016/8/3 0003
* 博客: http://blog.csdn.net/u014316462
* 作用:美食教學的對象類
*/
@Table(name = "FoodDetailTeachItem")
public class FoodDetailTeachItem extends Model {
public String getFoodId() {
return foodId;
}
public void setFoodId(String foodId) {
this.foodId = foodId;
}
@Column(name="foodId")
String foodId;
@Column(name = "FoodTitle")
public String FoodTitle; //美食名稱
@Column(name = "FoodIntroduction")
public String FoodIntroduction; //美食介紹
@Column(name = "FoodImage")
public String FoodImage; //美食圖片
@Column(name = "WriteName")
public String WriteName; //作者名
@Column(name = "WritePhoto")
public String WritePhoto; //作者頭像
@Column(name = "WriteDate")
public String WriteDate; //創作時間
public List
我們定義的表名為FoodDetailTeachItem,裡面的列有foodId(用來唯一標記該美食),FoodTitle,FoodIntroduction,FoodImage,WriteName,WritePhoto,WriteDate。
現在有一個問題:就是一個FoodDetailTeachItem和FoodAccessories、FoodTeachStep存在一對多的關系,
因為Activeandroid中處理一對多,需要做一下特殊處理。我們先把所有的表看完,最後說明一下。
(2) 美食材料表
/** * 作者:GXL on 2016/8/3 0003 * 博客: http://blog.csdn.net/u014316462 * 作用:美食教學的輔料對象 */ @Table(name="FoodAccessories") public class FoodAccessories extends Model { public String getFoodId() { return foodId; } public void setFoodId(String foodId) { this.foodId = foodId; } @Column(name="foodId") String foodId; @Column(name="name") String name; @Column(name="number") String number; }
這張表名為FoodAccessories,裡面的列有foodId為美食唯一標識,name,number。
(3) 美食做法表
** * 作者:GXL on 2016/8/3 0003 * 博客: http://blog.csdn.net/u014316462 * 作用:美食教學的步驟類 */ @Table(name = "FoodTeachStep") public class FoodTeachStep extends Model { @Column(name = "foodId") String foodId; @Column(name = "num") public String num; @Column(name = "imagelink") public String imagelink; @Column(name = "teachtext") public String teachtext; }
這張表名為FoodTeachStep,裡面的列有foodId為美食唯一標識,num,imagelink,teachtext。
好,表定義好了,說一下他們三者的關聯:FoodDetailTeachItem和FoodAccessories、FoodTeachStep存在一對多的關系,就是一個FoodDetailTeachItem對應著多個FoodAccessories和FoodTeachStep。所以,我用了一個foodId作為主鍵,將他們連接在一起,就是一個美食,他們三者的foodId是相同的。
/** * 從數據庫中獲取教學步驟 */ public ListgetTeachStepFromSQL() { return new Select().from(FoodTeachStep.class).where("foodId=?", foodId).execute(); } /** * 從數據庫中獲取美食材料 */ public List getFoodAccessoriesFromSQL() { return new Select().from(FoodAccessories.class).where("foodId=?", foodId).execute(); }
FoodDetailTeachItem獲取教學步驟和美食材料只要調用上面的方法即可。
表定義好了,就來試一試增刪改查把!
定義的Model類接口
/** * 作者:GXL on 2016/8/3 0003 * 博客: http://blog.csdn.net/u014316462 * 作用:收藏美食接口 */ public interface FoodLoveModelImpl { //查詢所有 ListonQuery(); //增 void onInsert(FoodDetailTeachItem item); //刪 void onDelete(FoodDetailTeachItem item); //查詢是否存在 boolean onQuery(FoodDetailTeachItem item); }
Model類的實現。
/** * 作者:GXL on 2016/8/3 0003 * 博客: http://blog.csdn.net/u014316462 * 作用:收藏美食的實現 */ public class FoodLoveModel implements FoodLoveModelImpl { @Override public ListonQuery() { return new Select().from(FoodDetailTeachItem.class).execute(); } @Override public void onInsert(FoodDetailTeachItem item) { String foodId = StringUtils.BuildOrderNum(); item.setFoodId(foodId); item.save(); List AccessoriesList = item.getAccessoriesList(); ActiveAndroid.beginTransaction(); try { for (FoodAccessories accessoriesItem : AccessoriesList ) { accessoriesItem.setFoodId(foodId); accessoriesItem.save(); } ActiveAndroid.setTransactionSuccessful(); } finally { ActiveAndroid.endTransaction(); } List teachStepList = item.getStepList(); ActiveAndroid.beginTransaction(); try { for (FoodTeachStep teachStepItem : teachStepList ) { teachStepItem.setFoodId(foodId); teachStepItem.save(); } ActiveAndroid.setTransactionSuccessful(); } finally { ActiveAndroid.endTransaction(); } } @Override public void onDelete(FoodDetailTeachItem item) { FoodDetailTeachItem sqlItem = new Select().from(FoodDetailTeachItem.class).where("FoodTitle=?", item.FoodTitle).where("FoodImage=?", item.getFoodImage()).executeSingle(); String foodId = sqlItem.getFoodId(); sqlItem.delete(); new Delete().from(FoodAccessories.class).where("foodId=?", foodId).execute(); new Delete().from(FoodTeachStep.class).where("foodId=?", foodId).execute(); } @Override public boolean onQuery(FoodDetailTeachItem item) { FoodDetailTeachItem sqlItem = new Select().from(FoodDetailTeachItem.class).where("FoodTitle=?", item.FoodTitle).where("FoodImage=?", item.getFoodImage()).executeSingle(); if (sqlItem != null) return true; return false; } }
所有的東西都准備好了,看一下我們的用法:
if (mFoodLoveModel.onQuery(item)) { favorite.setBackgroundResource(R.drawable.gray_star_enabled); }
進來的時候先查詢一下當前的是否已經存在,存在變成紅心。
@OnClick({R.id.back, R.id.favorite}) public void onClick(View view) { switch (view.getId()) { case R.id.back: finish(); break; case R.id.favorite: if (mItem != null) { if (mFoodLoveModel.onQuery(mItem)) { favorite.setBackgroundResource(R.drawable.star); mFoodLoveModel.onDelete(mItem); ToastUtils.showShort(FoodTeachActivity.this, "取消成功"); } else { favorite.setBackgroundResource(R.drawable.gray_star_enabled); mFoodLoveModel.onInsert(mItem); ToastUtils.showShort(FoodTeachActivity.this, "收藏成功"); } } break; } }
點擊收藏,判斷已經存在,就取消收藏,沒存在就變成收藏。
看一下效果演示,哈哈,這一章就差不多結束了。快開始你自己的ActiveAndroid的旅程吧!
項目代碼地址:https://github.com/gxl1240779189/ReIntelligentKitchen,如果你覺得不錯,可以star一下,感謝您的支持。下一篇講解用Bmob後端雲實現朋友圈功能。
在android開發中,如果在一個線程中想更新主界面中控件顯示的數據,直接給主界面控件賦值就會出現異常,android中為了安全起見,是不允許在線程中更新界面控件的數據,
前言:之前公司app在騰訊開放平台認領應用時,涉及了一個問題:就是給空白包簽名。然後再上傳上去審核。應用能在Android 系統上安裝必須是經過有私有key的證書數據簽名
1.抽屜布局 Drawer 2.
這兩天Google更新了Android Studio 1.2正式版,新版本的設置界面大變面,設置條目較舊版本進行了歸類,不像以前那樣列表長長的了。趁著安裝新版本的機會,把