Android ORM-greenDAO 3のProperties、QueryBuilderとデータベースの添削改査の基本文法応用(二)


引用する
Android ORM--greenDAO 3とgreenDAO 3を使う前に身につけなければならないいくつかの知識点greenDAOの構成手順といくつかの重要な知識点、および重要な役割の機能と連絡を紹介し、この編は正式にポイントソースコードを結合してgreenDAOを応用する方面から総括します.greenDAOを使用する前に、greenDAOはORMフレームワークであることを明確にしなければなりません.簡単に言えば、データベースエンティティテーブルを対応するJavaBeanにマッピングし、JavaBeanを操作することはデータテーブルを操作し、完全にオブジェクト向けの考えです.
一、PropertyとProperties、QueryとQueryBuilder
1、PropertyとProperties
Propertyソースコードでは、データベース列にマッピングされた属性のメタデータ、クエリー・ビルダーの作成に使用されるWhereConditionオブジェクト(Meta data describing a property mapped to a database column;used to create WhereCondition object used by the query builder)は、JavaBean形式でデータ列が表示されていることを簡単に理解します.それ以外にも、Where条件句を構築する重要な機能があります(多くの条件句がカプセル化されている)すべてはオブジェクトに基づいているが,Propertiesはデータテーブルの構造であり,1つのPropertiesがデータテーブルの列に対応していると見なすことができる.
Propertyのメソッド名の一部
説明
WhereCondition eq(Object value)
Where文の後に「=」valueを付ける
WhereCondition notEq(Object value)
Where文の後に「!=」valueを付ける
WhereCondition like(String value)
Where文の後に「like」valueファジイクエリを付ける
WhereCondition between(Object a, Object b)
Where文の後に「between a and b」valueを付ける
2、QueryとQueryBuilder
よく知られているクエリは、特定の条件を満たすエンティティデータを得るために使用されます.greenDAOには、元のSQLを使用してクエリを作成するQueryと、クエリを作成するQueryと、クエリを作成するQueryと、クエリを作成するQueryと、クエリを作成するQueryと、クエリを作成するQuery元のSQL文を記述せずにQueryBuilderパッケージを呼び出す対応するAPI(優先的に考えると、QueryBuilderは対応するインタフェースメソッドをカプセル化して異なるタイプのSQL文を生成しているため、使用時にQueryBuilderでカスタムクエリーWithout SQLを作成することができる.)簡単に言えばgreeDAOは元のSQLを多くの部分に分け、それぞれ対応するAPIメソッドにカプセル化している.例えば、GreenDAOApplication.getDaoSessionins().getUserDao().QueryBuilder()は、Select*from tableに相当する役割を果たし、主文であり、その他の条件句、並べ替え、重み付けなどの句の構造(データの削除・変更を実行することを含む)は、対応する方法にカプセル化され、呼び出された後に自動的に主文に追加され、最終的に完全なSQL文を形成してデータ操作を完了する.
QueryBuilderセクションメソッド名
説明
protected QueryBuilder(AbstractDao dao)
構築方法は保護されており、その構築方法でオブジェクトを取得することはできません.
QueryBuilder distinct()
再検索すると、SQL文にdistinctが追加されます.
QueryBuilder where(WhereCondition cond, WhereCondition… condMore)
条件句、SQLのWhereに相当
QueryBuilder whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition… condMore)
または条件クエリー
WhereCondition and(WhereCondition cond1, WhereCondition cond2, WhereCondition… condMore)
かつ条件
QueryBuilder orderAsc(Property… properties)
Order句
QueryBuilder limit(int limit)
ページングクエリ
DeleteQuery buildDelete()
削除
List list()
Queryを実行して戻りセットを実行し、entityはメモリにロードされます.返される結果は通常ArrayListです.
LazyList listLazy()
Entityはオンデマンドでメモリにロードされ、listのelementに初めてアクセスするとロードされキャッシュされます.
LazyList listLazyUncached()
結果セットにアクセスするたびに、キャッシュを使用せずにデータベースからロードされます.
LazyList listIterator()
結果セットに反復器でアクセスし、lazy-loadingを使用すると結果はキャッシュされません.
T unique()
一意のデータを返す
QueryBuilderはすでに強力ですが、まだあなたのニーズを満たすことができない場合は、greeDAOは元のSQL文をサポートしています.主に2つの方法があります.
  • QueryBuilder,WhereConditon,StringCondition結合
  • //     ,userDao.queryBuilder()             Select * from User
    Query query = userDao.queryBuilder().where(
    new StringCondition("_ID IN " +
    "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();
  • queryRawまたはqueryRawCreateメソッドを使用して元のSQLが入力され、SELECTおよびcolumnsの後に追加されます.これにより、WhereとOrder byを使用してentitiesを選択できます.この外観には別名「T」も使用できます.
  • Query<User> query = userDao.queryRawCreate(
      ", GROUP G WHERE G.NAME=? AND T.GROUP_ID=G._ID", "admin"
    );

    Queryメソッド名
    説明
    Query setParameter(int index, Object parameter)
    パラメータの設定
    List list()
    Queryを実行して戻りセットを実行し、entityはメモリにロードされます.返される結果は通常ArrayListです.
    LazyList listLazy()
    Entityはオンデマンドでメモリにロードされ、listのelementに初めてアクセスするとロードされキャッシュされます.
    LazyList listLazyUncached()
    結果セットにアクセスするたびに、キャッシュを使用せずにデータベースからロードされます.
    LazyList listIterator()
    結果セットに反復器でアクセスし、lazy-loadingを使用すると結果はキャッシュされません.
    T unique()
    GreenDaoは、一意の結果(0 or 1結果)と結果セットをサポートします.一意の結果またはnullが返されます.
    T uniqueOrThrow()
    一意の結果が返されnullは返されません
    またlistLazy,listLazyUncached,listIteratorはgreenDaoのLazyListクラスを採用しており、実際にデータを使用している間にロード(on-demand)され、database cursorリファレンスも保持されます.(これはcloseメソッドを呼び出してlazy listsとiterators(通常try/finallyブロック内)を閉じる必要がある理由です).すべてのelementがアクセスされるとlistLazy()とlistIterator()は自動的にcursorを閉じますが、listが事前に処理が完了すると、close()を呼び出さなければなりません.QueryとQueryBuilderは、SQLを構築してSQLを実行するために使用できますが、QueryBuilderは条件や並べ替え句をサポートする構造ではありません.QueryはQueryBuilderに全く依存せず、すべて元のSQLで代用することができます.また、プライマリ文(つまりSelect*from tableのセグメントはQueryBuilder)の後ろのサブ文は元のSQLで実行することもできます.両方ともクエリーをサポートし、コレクションを返します.
    二、ApplicationでgreenDAOを初期化し、データベースの構築を完了する
    public class GreenDAOApplication extends Application {
        private final static String DBNAME="REBOT_DB" ;
        public static DaoSession daoSession=null;
    
        @Override
        public void onCreate() {
            super.onCreate();
            initGreenDAO(this);
        }
    
        /**
         *              
         */
        private void initGreenDAO(Context context){
            DaoMaster.DevOpenHelper openHelper=new DaoMaster.DevOpenHelper(context,DBNAME);
            Database database=openHelper.getWritableDb();
            DaoMaster daoMaster=new DaoMaster(database);
            daoSession=daoMaster.newSession();
        }
    
        public static DaoSession getDaoSessionins(){
            return daoSession;
        }
    }

    三、増insert(T t)
    前述のEntityインスタンスは、データテーブルの1行のデータに対応しているので、新規のデータを挿入する場合は、インスタンス化されたEntityオブジェクトをinsert系メソッドに渡し、AbstractDaoのサブクラスオブジェクトを介して呼び出すだけでよい.insertは1つ挿入され、InsertInTxは複数挿入されています(「Tx」は、プロセス全体を1つのトランザクションで制御することを意味します(効率化).insertOrReplaceは挿入または置換です.
    /*      */
    User user=new User(1,name,"/sdcard/avtar/"+(name+1)+".png");//greenDAO    Long ,    null, GreenDao          
    try{
        GreenDAOApplication.getDaoSessionins().getUserDao().insert(user);
    }catch(Exception e){}

    四、削除
    1、deleteBykey(Long id):プライマリ・キーに基づいて対応するレコードを削除する
    try{
        GreenDAOApplication.getDaoSessionins().getUserDao().deleteByKey(id);
    }catch(Exception e){}

    2、エンティティークラスからレコードを削除する
    エンティティ・クラスに基づいてレコードを削除するには、delete(Entity)を直接呼び出し、クエリーしてQueryBuilderを介します.
    User user = new User((long)1, "crazymo","",false);
    try{
        GreenDAOApplication.getDaoSessionins().getUserDao().delete(user);
    }catch(Exception e){}
    
     List list = getUserList();
     GreenDAOApplication.getDaoSessionins().getUserDao().deleteInTx(list);

    3、一括削除するには、QueryBuilderを作成してbuildDeleteメソッドを呼び出し、DeleteQueryを実行する必要があります.開発では一般的にクエリーと組み合わせて,レコードをクエリーしてから対応するローデータを削除する.
    public void deleteUserInfo(int userId){
         QueryBuilder qb = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder();
         DeleteQuery bd = qb.where(Properties._id.eq(userId)).buildDelete();
         bd.executeDeleteWithoutDetachingEntities();
    }

    3、deleteAll():クリア
    try{
        GreenDAOApplication.getDaoSessionins().getUserDao().deleteAll();
    }catch(Exception e){}

    五、update(T t)を変更する
    例えばupdate USER SET age=20 WHERE name="CrazyMo_"このような文はgreenDaoの中でどのように実行して、ずっと1つの言叶を覚えて、greenDaoはオブジェクトの増加に対して、削除して、変更して、検索はデータベースの増加に対して、削除して、変更して、検索して、検索されたオブジェクトは修正されて、もとの自分のオブジェクトを交换することができます
    User user=new User(1,name,"/sdcard/avtar/"+(name+1)+".png");
    try{
        GreenDAOApplication.getDaoSessionins().getUserDao().update(user);
    }catch(Exception e){}
    String updateName = content.getText().toString().trim();
    QueryBuilder qb2 = userDao.queryBuilder();
    qb2.where(Properties.Name.eq("CrazyMo_"));
    List update = qb2.list();
    String newName = content.getText().toString().trim();
    for (User user : update) {
         user.setAge(20);
         userDao.insertOrReplaceInTx(user);
    }

    五、調べる
    データベースの4つの基本的な操作の中でクエリーは複雑で、優先的にQueryBuilder APIを使用し、より簡単な面で不活性なロードをサポートします(大きな結果セットを処理するとlazy-loading(怠惰なロードモード)はメモリを節約してパフォーマンスを向上させることができます)、より複雑なクエリーの場合、元のSQLクエリーもサポートされます.
    1、QueryBuilderの最も基本的な使用文法
  • DAOのqueryBuilderメソッドによりQueryBuilderインスタンスを取得し、クエリ主文(すなわちSelect句部分)
  • を取得する.
  • QueryBuilderを呼び出すメンバーメソッドは、必要に応じてWhere条件句、Join句、Order句など
  • をそれぞれ構築する.
  • QueryBuilderを呼び出す取得データセットメソッドlist系は、完全なSQL文を実行することに相当する戻りデータセットを得る.
  • //     FirstName CrazyMo_        ,   Select * from User where FirstName=“Mo” order by LastName asc
    QueryBuilder qb = userDao.queryBuilder(); //  QueryBuilder  
    qb.where(Properties.FirstName.eq("Mo"))  //  Where      
    .orderAsc(Properties.LastName)            //      
    .list();            //      
    Query query = userDao.queryBuilder()
                    .where(new WhereCondition.StringCondition("_ID IN (SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)"))
                    .build();
    query.list();

    1、クエリーテーブルに指定Idが含まれているかどうか
    public boolean isSaved(int _id){
        QueryBuilder qb = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder();
        qb.where(Properties.Id.eq(_id));
        qb.buildCount().count();
        return qb.buildCount().count() > 0 ? true : false;
    }

    2、テーブル全体のデータセットを取得して集合に転換する
    public List getAllUser(){
         return QueryBuilder qb = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder().list();
         /* try {
                GreenDAOApplication.getDaoSession().getUserDao().queryBuilder().listLazy();
            }catch (Exception e){
                。。。
            }*/
     }

    3、複数回にわたってQueryインスタンスを呼び出してクエリーを繰り返す
    返されるQueryオブジェクトは複数回クエリーを繰り返すことができ、クエリー条件が変更されていない場合は直接もう一度呼び出せばよいが、条件が更新された場合はsetParameter()メソッドを呼び出すことでパラメータを更新して再フィルタリングを完了することができ、Queryオブジェクトの複数回の構築を回避することができる.
    /*   Select * from User where FirstName=“Mo” and YearOfBirth=1999*/
    
    Query query = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder().where(
    Properties.FirstName.eq("Mo"), Properties.YearOfBirth.eq(1999))
    .build();
    List list= query.list();

    クエリーFirstNameはCrazy、YearOfBirthは199人
    query.setParameter(0, "Crazy");//  0       ,             。
    query.setParameter(1, 2000);
    List list= query.list();