Android ORMデータベースフレームワークの-greenDao(二)


この記事ではgreenDaoの比較的高級な使い方を紹介します.以下の内容は公式サイトを参照してください.
リレーショナル・データベースには、もちろん多くのテーブル関連が欠かせません.SQLiteも例外ではありません.では、greenDaoがテーブル関連をどのように構築するかを見てみましょう.
  • 一対一1:1 entity.addToOne(entity,property)人間と身分証明書を例にとると
  •  /** *     */
            Entity people = schema.addEntity("People");
            people.addStringProperty("name").primaryKey(); //  
            people.addIntProperty("age"); //  
            /** *     */
            Entity idcard = schema.addEntity("IdCard");
            idcard.addStringProperty("idcardnum").primaryKey(); //    
    
            /** *               */
    
            /**        idcard **/
            Property propertyidcardnum = people.addStringProperty("idcardnum").getProperty();
            people.addToOne(idcard, propertyidcardnum);
            /**   idcrad     name ***/
            Property propertyname = idcard.addStringProperty("name").getProperty();
            idcard.addToOne(people, propertyname);

    注意:マルチテーブル関連付けを確立する場合は、idプライマリ・キーを追加しません.ここのプライマリ・キーは他のテーブルの外部キーとして使用すると考えています.私たちはentityを通じてaddToOne(otherEntity,peoperty)は、entityとotherentityがperopertyによって関連付けられる一対一の関連付けを確立し、peopertyはotherentityの中国式プライマリ・キーであり、entityでは外部キーである.こう言ってはだれも覚えられない.コードを見る
    Property propertyidcardnum = people.addStringProperty("idcardnum").getProperty();
            people.addToOne(idcard, propertyidcardnum);

    身分証明書エンティティのプライマリ・キーidcardnumを、外部キーとしてpeopleエンティティに1対1の関係で追加するのは簡単です.
  • 一対多1:n addToMany(entity,property)
  • Entity order = schema.addEntity("Order");
            order.addIntProperty("orderid").primaryKey();
            order.addDoubleProperty("money").notNull();
    
            /** *              */
    //        Property propertypeoplenum=people.addStringProperty("idcardnum").getProperty();
            Property property = order.addStringProperty("name").getProperty();
            order.addToOne(people, property);
            people.addToMany(order,propertyname).setName("orders");

    私はここでショッピングの実体を作りました.一対多の関係を形成する.受注のプライマリ・キーidを複数対1の形式でpeopleに外部キーとして渡します.
  • 多対多m:n
  • Entity course = schema.addEntity("Course");
            course.addStringProperty("courseid").primaryKey();
            course.addStringProperty("coursename").notNull();
    
    
            Property propertyPeopleId = course.addStringProperty("name").getProperty();
            course.addToMany(people,propertyPeopleId);
    
            Property propertyCourseID = people.addStringProperty("courseid").getProperty();
            people.addToMany(course,propertyCourseID);

    ああ、これは上と同じで、私はもうあまりありません.
    注意しなければならないのは、ここの関係が特に迂回していて、うっかり間違えることです.次に、生成されたエンティティクラスの違いを見てみましょう.
    まずPeopleを見て、身分証明書と1対1で、注文が1対多で、授業が多対多であることを覚えています.
    private String name;
        private Integer age;
        private String idcardnum;
        private String courseid;
    
        /** Used to resolve relations */
        private transient DaoSession daoSession;
    
        /** Used for active entity operations. */
        private transient PeopleDao myDao;
    
        private IdCard idCard;
        private String idCard__resolvedKey;
    
        private List<Order> orders;
        private List<Course> courseList;

    見たか、メンバー変数ここにはIdCard(単一)、List、Listがあり、確かに上に書いた関係になっています.
    次に構造関数を見てみましょう
    public People(String name, Integer age, String idcardnum, String courseid) {
            this.name = name;
            this.age = age;
            this.idcardnum = idcardnum;
            this.courseid = courseid;
        }

    コンストラクション関数には、いくつかの関連テーブルのプライマリ・キーしかありません.別におかしくない.では、このクラスの下にはどんな方法があるか見てみましょう.ここにgetCourseListとgetOrderListがあることがわかりました.一つ選んでみましょう.
    public List<Order> getOrders() {
            if (orders == null) {
                if (daoSession == null) {
                    throw new DaoException("Entity is detached from DAO context");
                }
                OrderDao targetDao = daoSession.getOrderDao();
                List<Order> ordersNew = targetDao._queryPeople_Orders(name);
                synchronized (this) {
                    if(orders == null) {
                        orders = ordersNew;
                    }
                }
            }
            return orders;
        }

    ほら、ここでnameで調べます.なぜですか.私たちの名前はOrderテーブルの外部キーだからです.ははは、これでさっぱりして、すべて直接提供方法にあげて、すべて私达が自分でやるのとは违います.うん、確かに爽やかだ.もう一度見てみましょうqueryPeople_Orders()メソッド
    public List<Order> _queryPeople_Orders(String name) {
            synchronized (this) {
                if (people_OrdersQuery == null) {
                    QueryBuilder<Order> queryBuilder = queryBuilder();
                    queryBuilder.where(Properties.Name.eq(null));
                    people_OrdersQuery = queryBuilder.build();
                }
            }
            Query<Order> query = people_OrdersQuery.forCurrentThread();
            query.setParameter(0, name);
            return query.list();
        }

    太くないですが、やはりパッケージしてくれました.なに、この検索方法、読めないの?大丈夫です.後で紹介します.多表関連は私たちが見終わったので、ここでは穴に注意してください.それは関連する2枚の表のメインキーのタイプが必ず同じで、私になぜか聞かないでください.
  • 他の使用法による制約の追加は、プライマリ・キーの非空自己増加の追加などにほかならない.例:
  • order.addIntProperty("orderid").primaryKey();

    マルチスレッドの下
    Query<Order> query = people_OrdersQuery.forCurrentThread();

    複数条件クエリー
       “ ” (      1970 (     1970 ,        10(10 )。
         *   QueryBuilder qb = userDao.queryBuilder();
             qb.where(Properties.FirstName.eq("Joe"),
             qb.or(Properties.YearOfBirth.gt(1970),
             qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
             List youngJoes = qb.list();

    または
    Query query = userDao.queryBuilder().where(
             Properties.FirstName.eq("Joe"), Properties.YearOfBirth.eq(1970))
             .build();
             List joesOf1970 = query.list();

    または
     query.setParameter(0, "Maria");
             query.setParameter(1, 1977);
             List mariasOf1977 = query.list();

    ネストされたクエリー
    Query query = userDao.queryBuilder().where(
                            new StringCondition("_ID IN " +
                            "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();

    リンククエリ
                     admin
         Query query = userDao.queryRawCreate(
                 ", GROUP G WHERE G.NAME=? AND T.GROUP_ID=G._ID", "admin");

    queryのlistのいくつかの方法を見てみましょう
    List()すべてのエンティティがメモリにロードされ、結果はArrayListであり、listLazy()エンティティを使用して必要に応じてロードしやすく、すぐにメモリにロードするクエリーが完了せず、必要に応じてロードされ、リストにキャッシュされ、closeを呼び出してlistLazyUnCached()仮想エンティティセットを閉じる必要があります.どのアクセスもデータベースからロードする必要があります.listIterator()を閉じてロードを容易にする必要があります.データはキャッシュされていません.閉じる必要があります.
    コード混同
    -keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
        public static java.lang.String TABLENAME;
    }
    -keep class **$Properties

    あるいはgithubに行って彼らのdemoがどのように混同しているかを見ます.
  • データベースのアップグレードこんなにいいものだと思っていたデータベースのアップグレードのいくつかの問題もきっとできたに違いない.ああ、結果.余計なことを言って、彼がカプセル化したコードを見てみましょう.
  • DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"persons-db",null);
    public static class DevOpenHelper extends OpenHelper {
            public DevOpenHelper(Context context, String name, CursorFactory factory) {
                super(context, name, factory);
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
                dropAllTables(db, true);
                onCreate(db);
            }
        }
    public static void dropAllTables(SQLiteDatabase db, boolean ifExists) {
            PersonDao.dropTable(db, ifExists);
            PeopleDao.dropTable(db, ifExists);
            IdCardDao.dropTable(db, ifExists);
            OrderDao.dropTable(db, ifExists);
            CourseDao.dropTable(db, ifExists);
        }
    public static void dropTable(SQLiteDatabase db, boolean ifExists) {
            String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"PERSON\"";
            db.execSQL(sql);
        }

    見ましたか.いわゆるデータベースのアップグレードはありません.元のデータベースを削除しました.こする.どうしようかな.焦らないで、私たちはゴミですが、考えはまだあります.どうすればいいですか.まず、エンティティクラスを生成するファイルを生成します.
    schema.enableKeepSectionsByDefault();//   Schema                               ()

    これで私たちが再生成したときに上書きされません.
    2つ目のステップは、接続を提供します.見てください.greenDaoデータベースのアップグレード
    ここまで:参考資料:greenDao公式サイト