Android ORMデータベースフレームワークの-greenDao(二)
この記事ではgreenDaoの比較的高級な使い方を紹介します.以下の内容は公式サイトを参照してください.
リレーショナル・データベースには、もちろん多くのテーブル関連が欠かせません.SQLiteも例外ではありません.では、greenDaoがテーブル関連をどのように構築するかを見てみましょう.一対一1:1 entity.addToOne(entity,property)人間と身分証明書を例にとると
注意:マルチテーブル関連付けを確立する場合は、idプライマリ・キーを追加しません.ここのプライマリ・キーは他のテーブルの外部キーとして使用すると考えています.私たちはentityを通じてaddToOne(otherEntity,peoperty)は、entityとotherentityがperopertyによって関連付けられる一対一の関連付けを確立し、peopertyはotherentityの中国式プライマリ・キーであり、entityでは外部キーである.こう言ってはだれも覚えられない.コードを見る
身分証明書エンティティのプライマリ・キーidcardnumを、外部キーとしてpeopleエンティティに1対1の関係で追加するのは簡単です.一対多1:n addToMany(entity,property)
私はここでショッピングの実体を作りました.一対多の関係を形成する.受注のプライマリ・キーidを複数対1の形式でpeopleに外部キーとして渡します.多対多m:n
ああ、これは上と同じで、私はもうあまりありません.
注意しなければならないのは、ここの関係が特に迂回していて、うっかり間違えることです.次に、生成されたエンティティクラスの違いを見てみましょう.
まずPeopleを見て、身分証明書と1対1で、注文が1対多で、授業が多対多であることを覚えています.
見たか、メンバー変数ここにはIdCard(単一)、List、Listがあり、確かに上に書いた関係になっています.
次に構造関数を見てみましょう
コンストラクション関数には、いくつかの関連テーブルのプライマリ・キーしかありません.別におかしくない.では、このクラスの下にはどんな方法があるか見てみましょう.ここにgetCourseListとgetOrderListがあることがわかりました.一つ選んでみましょう.
ほら、ここでnameで調べます.なぜですか.私たちの名前はOrderテーブルの外部キーだからです.ははは、これでさっぱりして、すべて直接提供方法にあげて、すべて私达が自分でやるのとは违います.うん、確かに爽やかだ.もう一度見てみましょうqueryPeople_Orders()メソッド
太くないですが、やはりパッケージしてくれました.なに、この検索方法、読めないの?大丈夫です.後で紹介します.多表関連は私たちが見終わったので、ここでは穴に注意してください.それは関連する2枚の表のメインキーのタイプが必ず同じで、私になぜか聞かないでください.他の使用法による制約の追加は、プライマリ・キーの非空自己増加の追加などにほかならない.例:
マルチスレッドの下
複数条件クエリー
または
または
ネストされたクエリー
リンククエリ
queryのlistのいくつかの方法を見てみましょう
List()すべてのエンティティがメモリにロードされ、結果はArrayListであり、listLazy()エンティティを使用して必要に応じてロードしやすく、すぐにメモリにロードするクエリーが完了せず、必要に応じてロードされ、リストにキャッシュされ、closeを呼び出してlistLazyUnCached()仮想エンティティセットを閉じる必要があります.どのアクセスもデータベースからロードする必要があります.listIterator()を閉じてロードを容易にする必要があります.データはキャッシュされていません.閉じる必要があります.
コード混同
あるいはgithubに行って彼らのdemoがどのように混同しているかを見ます.データベースのアップグレードこんなにいいものだと思っていたデータベースのアップグレードのいくつかの問題もきっとできたに違いない.ああ、結果.余計なことを言って、彼がカプセル化したコードを見てみましょう.
見ましたか.いわゆるデータベースのアップグレードはありません.元のデータベースを削除しました.こする.どうしようかな.焦らないで、私たちはゴミですが、考えはまだあります.どうすればいいですか.まず、エンティティクラスを生成するファイルを生成します.
これで私たちが再生成したときに上書きされません.
2つ目のステップは、接続を提供します.見てください.greenDaoデータベースのアップグレード
ここまで:参考資料:greenDao公式サイト
リレーショナル・データベースには、もちろん多くのテーブル関連が欠かせません.SQLiteも例外ではありません.では、greenDaoがテーブル関連をどのように構築するかを見てみましょう.
/** * */
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の関係で追加するのは簡単です.
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に外部キーとして渡します.
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
次に構造関数を見てみましょう
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公式サイト