編輯:關於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 List getTeachStepFromSQL() {
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 {
//查詢所有
List onQuery();
//增
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 List onQuery() {
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後端雲實現朋友圈功能。
.Net程序員玩轉Android開發---(17)Handler用法
在android開發中,如果在一個線程中想更新主界面中控件顯示的數據,直接給主界面控件賦值就會出現異常,android中為了安全起見,是不允許在線程中更新界面控件的數據,
Android 給空白包簽名並上傳審核
前言:之前公司app在騰訊開放平台認領應用時,涉及了一個問題:就是給空白包簽名。然後再上傳上去審核。應用能在Android 系統上安裝必須是經過有私有key的證書數據簽名
Android——ListView與適配器
1.抽屜布局 Drawer 2.
Android Studio 1.2版安裝設置圖文教程
這兩天Google更新了Android Studio 1.2正式版,新版本的設置界面大變面,設置條目較舊版本進行了歸類,不像以前那樣列表長長的了。趁著安裝新版本的機會,把