Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 【Android】ORM數據庫框架之GreenDao【關聯】關系操作

【Android】ORM數據庫框架之GreenDao【關聯】關系操作

編輯:關於Android編程

上一篇我們介紹了greendao的基本使用方法,如果您還不了解,建議先看下上篇文章再來看這篇會有更好的效果。今天我們來繼續學習greendao的relation部分,即數據表的關聯操作部分,greendao默認支持一對一,一對多的關系操作,多對多目前暫不支持,下面我們來一步步實現greendao的關聯操作;

1.一對一關系

假設我們現在只允許一夫一妻制,好像現在就是啊,哈哈哈哈哈,那麼一個男人可以娶一個老婆,一個老婆也只能有一個男人,下面我們分別創建man表和women表,來演示一對一的關聯操作,greendao中可以用Entity.addToOne方法建立to-one關系。 addToOne方法的第一個參數是另一個實體,第二個參數是本實體的外鍵屬性;
        /**
         * <男人表>
         */
        Entity man = schema.addEntity("Man");
        // 設置表名
        man.setTableName("man");
        // 身份證號
        man.addStringProperty("cardManNum").columnName("cardmannum").primaryKey();
        // 姓名
        man.addStringProperty("name").columnName("name");
        // 年齡
        man.addIntProperty("age").columnName("age");
        // 家庭住址
        man.addStringProperty("address").columnName("address");

        /**
         * <女人表>
         */
        Entity woman = schema.addEntity("Woman");
        // 設置表名
        woman.setTableName("woman");
        // 身份證號
        woman.addStringProperty("cardWomanNum").columnName("cardwomannum").primaryKey();
        // 姓名
        woman.addStringProperty("name").columnName("name");
        // 性別
        woman.addStringProperty("sex").columnName("sex");
        // 年齡
        woman.addIntProperty("age").columnName("age");
        // 家庭住址
        woman.addStringProperty("address").columnName("address");
創建一對一關聯
        /**
         * <一對一映射>
         */
        // 在woman表中插入外鍵(man表的主鍵)進行關聯
        Property cardnum = man.addStringProperty("fkmannum").getProperty();
        man.addToOne(woman, cardnum);
        // 在man表中插入外鍵(woman表的主鍵)進行關聯
        Property womanCardNum = woman.addStringProperty("fkwomannum").getProperty();
        woman.addToOne(man, womanCardNum);
然後我們插入幾條數據:

man表:

這裡寫圖片描述

women表:

這裡寫圖片描述

我們來查詢下張三的媳婦是誰?
        ManDao manDao = DBController.getDaoSession().getManDao();
        Man man = manDao.queryBuilder().where(ManDao.Properties.Name.eq("張三")).list().get(0);

        if (null != man)
        {
            //我們通過man的getWomen()方法可以直接拿到多對應的women對象
            showDbData("張三的媳婦是:"+man.getWoman().getName());
        }

這裡寫圖片描述

2.一對多關系

淘寶為例,一位顧客可以有很多訂單,而一個訂單只能屬於一位顧客,所以這就成了一對多的關系,假設顧客Customer表有customerId(primaryKey)、name兩個屬性,
訂單Order表有orderId(primaryKey)、money兩個屬性。greendao中可以用Entity.addToMany方法建立to-many關系。 下面我們來創建表:
        /**
         * 顧客
         */
        Entity customer = schema.addEntity("Customer");
        // 設置表名
        customer.setTableName("customer");

        // customerId設置為主鍵
        customer.addLongProperty("customerId").primaryKey();

        customer.addStringProperty("name").columnName("name").notNull();

        /**
         * 訂單
         */
        Entity orderinfo = schema.addEntity("OrderInfo");
        // 設置表名
        orderinfo.setTableName("orderinfo");
        // 身份證號碼設置為主鍵
        orderinfo.addLongProperty("orderId").primaryKey();
        orderinfo.addDoubleProperty("money").notNull();
創建一對多關聯
        /**
         * 一對多關聯
         * 
         * 當設置了顧客對訂單一對多關聯後,Order實體(和表)中會多一個屬性為customerId,
         * 所以通過訂單我們可以得到該顧客信息,而Customer實體(和表)中會多一個List集合變量:
         * List orders,表示該顧客的所有訂單,其中orders其實是我們自定義的名字,
         * 在剛剛setName("orders")就是給這個變量設置了“orders“名稱,
         * 而Customer實體中還提供了一個方法getOrders()表示得到該顧客所有訂單
         * 
         */
        Property property = orderinfo.addLongProperty("customerId").getProperty();
        // 一個訂單對應一個顧客
        orderinfo.addToOne(customer, property, "customerfk");
        customer.addToMany(orderinfo, property).setName("orders");
然後我們插入幾條數據:

Customer表:

這裡寫圖片描述

OrderInfo表:

這裡寫圖片描述

我們來查詢下李四的所有訂單號的價格信息:
        CustomerDao customerDao = DBController.getDaoSession().getCustomerDao();
        Customer customer = customerDao.queryBuilder().where(CustomerDao.Properties.Name.eq("李四")).list().get(0);
        if (null != customer)
        {
            StringBuilder builder = new StringBuilder();
            // 通過customer拿到所有訂單信息
            List orderInfos = customer.getOrders();
            for (int i = 0; i < orderInfos.size(); i++)
            {
                builder.append("---" + orderInfos.get(i).getMoney() + "\n");
            }
            showDbData(builder.toString());
        }

這裡寫圖片描述

3.多對多關系

雖然greendao默認不支持多對多的關系,但是我們可以使用一對一addtoone和一對多addtomany來實現多對多的關系,舉個最常見的例子,通常來說,在建立多對多關聯上,我們都會采用新建一張中間表,利用中間表把多對多這種復雜關系簡單化,在通常的選課系統上,一個學生可以選擇多門課,一門課可以被多個學生選,這就是多對多關系了,假設Student有studentId、name兩個屬性, Course有courseId、courseName兩個屬性,下面我們來創建表:
        // 學生
        Entity student = schema.addEntity("Student");
        student.addLongProperty("studentId").primaryKey();
        student.addStringProperty("name").notNull();

        // 課程
        Entity course = schema.addEntity("Course");
        course.addLongProperty("courseId").primaryKey();
        course.addStringProperty("courseName").notNull();

        // 建立多對多關系,StudentCourse中間表,簡化多對多的關系
        Entity studentCourse = schema.addEntity("StudentCourse");
        studentCourse.addIdProperty().primaryKey();
創建多對多關聯
        Property studentId = studentCourse.addLongProperty("studentId").getProperty();
        Property courseId = studentCourse.addLongProperty("courseId").getProperty();

        // StudentCourse表分別與student和course表建立一對多關系,實現student和course的多對多
        studentCourse.addToOne(student, studentId);
        studentCourse.addToOne(course, courseId);

        student.addToMany(studentCourse, studentId);
        course.addToMany(studentCourse, courseId);
然後我們插入幾條數據:

Student表:

這裡寫圖片描述

Course表:

這裡寫圖片描述

StudentCourse表:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160718/201607181013021236.png" title="\" />

我們來查詢下老王選了什麼課:
        StudentDao studentDao = DBController.getDaoSession().getStudentDao();

        List students = studentDao.queryBuilder().where(StudentDao.Properties.Name.eq("老王")).list();

        StringBuilder builder = new StringBuilder();

        Student student = students.get(0);

        List studentCourses = student.getStudentCourseList();

        for (int i = 0; i < studentCourses.size(); i++)
        {
            StudentCourse studentCourse = studentCourses.get(i);
            Course course = studentCourse.getCourse();
            builder.append("----課程:" + course.getCourseName() + "----課程ID:" + course.getCourseId());
            builder.append("\n");
        }
        showDbData(builder.toString());

這裡寫圖片描述

4.自定義屬性轉換器

伴隨著新接口PropertyConverter的出現,greendao的實體不再局限於原始的類型,如整數,字符串,日期和布爾值。通過實現PropertyConverter接口,可以定義從實體值到數據庫中的值的轉換。這個功能雖然簡單,但是確非常的強大,保證了充分的靈活性。下面我們就來演示一下json字符串和json對象的轉化,我們在數據庫中存儲json字符串,經過轉換後直接查詢出實體類的對象:

添加一個PersonModel實體類測試:
public class PersonModel implements Serializable
{
    private String name;

    private String age;

    public PersonModel(String name, String age)
    {
        super();
        this.name = name;
        this.age = age;
    }

    public PersonModel()
    {
        super();
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getAge()
    {
        return age;
    }

    public void setAge(String age)
    {
        this.age = age;
    }

    @Override
    public String toString()
    {
        return "PersonModel [name=" + name + ", age=" + age + "]";
    }
}
我們實現PropertyConverter接口來處理轉換邏輯:
/**
 * 
 * 自定義數據庫類型
 * 
 * Json
 */
public class JsonPropertyConverter implements PropertyConverter
{
    // 從數據庫取出值後轉為實體類裡的類型
    @Override
    public PersonModel convertToEntityProperty(String databaseValue)
    {
        Gson gson = new Gson();
        PersonModel model = gson.fromJson(databaseValue, PersonModel.class);
        return model;
    }

    // 轉換實體類該字段對應的數據庫所存放的值
    @Override
    public String convertToDatabaseValue(PersonModel entityProperty)
    {
        Gson gson = new Gson();
        return gson.toJson(entityProperty);
    }

}
創建jsontable表:
/**
     * 添加自定義屬性
     * 此處用的gson解析
     * @param schema
     * @see [類、類#方法、類#成員]
     */
    private static void addPropertyConverter(Schema schema)
    {
        Entity item = schema.addEntity("JsonTable");
        item.addIdProperty().primaryKey();
        //第一個參數是我們轉換後的類型的全路徑,第二個是轉化器類的路徑
        item.addStringProperty("model").customType("com.relation.dao.PersonModel", "com.relation.dao.JsonPropertyConverter");
    }
往表裡插入數據:
JsonTableDao jsonTableDao = DBController.getDaoSession().getJsonTableDao();

        JsonTable jsonTable = new JsonTable(); 

        PersonModel model = new PersonModel();
        model.setName("周星馳");
        model.setAge("45");
        jsonTable.setModel(model);

        jsonTableDao.insertInTx(jsonTable);

這裡寫圖片描述

查詢id為1的數據:
        JsonTableDao jsonTableDao = DBController.getDaoSession().getJsonTableDao();
        JsonTable jsonTable = jsonTableDao.queryBuilder().where(JsonTableDao.Properties.Id.eq(1)).unique();
        PersonModel model = jsonTable.getModel();
        showDbData(model.toString());
點擊查詢即可查詢出對應的model類型的數據,可以方便我們直接使用;

這裡寫圖片描述

到此本篇介紹基本完成,有疑問歡迎留言交流討論!


源碼下載

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