Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 智能廚房重構-用ActiveAndroid來實現收藏的功能

智能廚房重構-用ActiveAndroid來實現收藏的功能

編輯:關於Android編程

這一篇來記錄一下使用ActiveAndroid關系型數據庫進行本地對象的保存。

1.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 表示數據當前的版本號

這樣我們配置工作就結束了。

2.使用

2.1 定義表規則

@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”) 代表關系表中的列名

從上面還可以看出支持一個表中引用另一個表的對象。

2.2 增

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,所以說大量數據的增加一定要用這個啊。

2.2 刪

調用delete()方法就可以刪除一條記錄,下面的例子中,通過id加載一個Item對象,並且刪除他。

Item item = Item.load(Item.class, 1);
item.delete();
new Delete().from(Item.class).where("Id = ?", 1).execute();

2.3 改

new Update(Person.class).set("age=?," + "name=?", age, name).execute();

2.4 查

如果你想要在你的數據表中隨機獲取一個對象的話

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();
}

3.實戰

還是先說一下需求:再點擊下圖的星星之後,這個美食就被我們收藏到本地。

這裡寫圖片描述

所以首先就是定義表了。下面是我定義的三張表

(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 AccessoriesList; //做菜輔料 public List StepList; //做菜步驟 }

我們定義的表名為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後端雲實現朋友圈功能。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved