Android Room VS GreenDao


データベース比較{{でーたべーす:ひかく}}
このドキュメントでは、データベース・スキーマGreenDaoとRoomスキーマを比較して、データベース・スキーマの選択を決定します.
データベースの基本操作
エンティティークラス定義
GreenDaoでのエンティティークラスの定義
@Entity
public class User{
   @Id
    private String username;
    private String password;
}

Roomでのエンティティークラスの定義
@Entity
public class User {
    @PrimaryKey
    @NonNull
    private String name;
    private String pwd
}
@Dao
public interface UserDao {
    @Insert
    void insertUsers(User ... users);
}
@Database(entities = {User.class},version = 1)
public abstract class ExternRomDb extends RoomDatabase{
    public abstract UserDao userDao();
}


エンティティクラスを定義するのは注釈方式で、基本形式はあまり差がありません.
Roomデータベースの使用上の注意点:
  • Room定義エンティティクラスは、GetterとSetterを手動で記述する必要があることに注意してください.
  • 複数のコンストラクション関数が同時に存在するのは、1つのコンストラクション関数のみがRoomライブラリによって呼び出され、他のコンストラクション関数は注記@Ignoreを追加する必要があります.
  • プライマリ・キーの値は空でなければなりません.プライマリ・キーがStringなどに設定されている場合は、注記@NonNull
  • を追加する必要があります.
  • エンティティークラスを有効にするには、Databaseに注記する必要があります.
  • Daoオブジェクトは、開発者が各entityに対応するDaoインタフェースまたは抽象クラスを作成し、@Dao注釈で注釈し、インタフェースに必要なメソッド宣言を提供する必要がある.Roomは対応する実装クラスを自動的に生成し、すべてのメソッドを実装します.

  • GreenDaoを使用すると、GreenDaoを使用すると、DaoMaster、DaoSession、XXXEntityDaoの3つのクラスが自動的に生成されます.
    DaoSession daoSession = new DaoMaster(db).newSession();
    UserDao dao = daoSession.getUserDao();
    

    きほんそうさ
    Roomが提供する注釈方法は
    @Insert@Delete@Update@Query@RawQuery   
    

    Room基本操作に基づくパッケージ最適化により,不要な重複コードを低減する.queryに関連するインタフェースは、SQLコマンドで実現する必要があります.入力はSQLの一部として使用できます.
    public interface BaseDao<T> {
        @Insert
        void insert(T ... obj);
        @Delete
        void delete(T ... obj);
        @Update
        void update(T ... obj);
    }
    
    @Dao
    public abstract class UsrDao implements BaseDao<User>{
        @Query("select * from User")
        abstract List<User> loadAll();
        @Query("select * from User where User.name =:name")
            People queryById(Stirng name);
    }
    
    

    GreenDaoがAbstractDaoで提供する基本的な操作は
    public T load(K key) ; public List<T> loadAll(),public long insert(T entity)   
    

    全体的にGreenDaoが提供する操作インタフェースはより豊富です.汎用オブジェクトによる最適化に基づいています.
    public interface IDatabase<M, K>{
        boolean insert(M m);
    
        boolean delete(M m);
    
        boolean deleteByKey(K key);
        ...
    }
    public abstract class AbstractDatabaseManager<M, K> implements IDatabase<M, K>{
           @Override
        public boolean insert(M m) {
            openWritableDb();
            getAbstractDao().insert(m);
            return true;
        }
        public boolean delete(M m){
            openWritableDb();
            getAbstractDao().delete(m);
            return true;
        }
    }
    
    
  • まとめ:
  • GreenDaoとRoomは,エンティティクラスを定義してDaoを取得してデータベースを操作する上で,全体的に差が少なく,その優劣を判断できない.
  • GreenDaoとRoom基本操作では、Roomが提供するインタフェースが少なく、SQLコマンドへの依存度が高く、コンパイル時にSQLコマンドをチェックできる点がありますが、プロジェクトに複数のエンティティクラスがある場合、重複コードが多く発生します.GreenDaoが提供するインタフェースは豊富で、SQL操作をサポートしているが、SQLコマンドを検出することができず、汎用会話操作によって重複コードを減らすことができる.

  • データベースの高度な操作
    完全なクエリ文は次のとおりです.
    select [distinct] heading from tables where predicate group by columns having predicate order by columns limit count , offset;
    

    Roomデータベースの高度な操作には2つの方法があります.
    方式1は,インタフェースあるいは抽象クラスにおいて,Queryを注釈することによって実現する.
    利点:ASフィールドSQL構文チェック、カラム名、テーブル名、キーワードの構文チェックが可能です.
    欠点:入力はSQLに値としてのみ入力でき、カラム名に出入りできません.
    @Query("select * from User where User.pwd >:pwd order by User.name")
    List<People> queryWhere(String pwd);
    

    方法2:@RawQueryで実現する.
    利点:自定化の程度が高い.
    欠点:これはコマンドのつなぎ合わせで、SQL構文のチェックができません.
       @RawQuery
       List<Cheese> queryRaw(SupportSQLiteQuery query);
    
    void test(String pwd,String orderBy){
        String cmd = "select * from User where User.pwd > "+pwd+" order by " +orderBy;
        queryRaw(new SimpleSQLiteQuery(cmd));
    }
    
    

    GreenDaoが提供する操作インタフェースは次のとおりです.
  • SQL order by関連インタフェース、QueryBuilder.orderxx()
  • SQL limit関連インタフェース、QueryBuilder.limit()
  • SQL offsetに関するインタフェース、QueryBuilder.offset()
  • はgroupby,having関連インタフェースを提供していないため、この2つのキーワードを使用するには、オリジナルクエリーを使用する必要があります.
  • 小結
  • 高度な操作では、GreenDaoはインタフェースが豊富で、クエリーキャッシュを提供し、効率を提供していますが、クエリーキャッシュの使用が不適切で、問題も発生しやすいです.Room勝はSQL構文チェックを提供していますが、列名は構文チェック項目として使用されるため、インバウンドとして使用できません.場合によってはインタフェースコードが非常に多くなります.
    データベースの暗号化
    RoomとGreenDao自体はデータベース暗号化をサポートしていません.サードパーティ製ライブラリを導入してデータ暗号化する必要があります.2つのフレームワークは似ています.
    データベースのアップグレード
    Roomデータベースのアップグレードは、Roomコンパイルによって生成されたテーブル名とカラム名がインスタンスに保存されていないため、SQLコマンドでのみデータベースをアップグレードできます.
    static final Migration MIGRATION_1_2 = new Migration(1, 2)
    {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database)
        {
            //        
        }
    };
    Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, DATABASE_NAME)
        .addMigrations(MIGRATION_1_2)
        .build();
    

    SchemaはRoomがデータベース・テーブルを生成することを記述する構造であるため、データベースのアップグレードが要求を満たすかどうかをSchemaで確認できます.
    GreenDaoデータベースのアップグレードは、GreenDaoコンパイルによって生成されたテーブル名とカラム名がインスタンスのDaoConfigに存在するため、統合されたアップグレード方式を作成できます.統計アップグレード方法はMigrationHelperを参照してください.java
    まとめ:
    データベースのアップグレードの面から言えば、GreenDaoの面では、Roomよりはるかに大きい.
    レスポンスプログラミング
    RoomはRxJava,LiveDataの2つの方式の応答式プログラミングをサポートしている.
    GreenDaoはRxjavaをサポート
    その他
    RoomはJetpackのコンポーネントの1つとして,LiveData,pagingのようなJetpackの他のコンポーネントと密接な関係がある.
    まとめ
    RoomデータベースのフレームワークはGreenDaoフレームワークと比較し,RoomとGreenDaoにはそれぞれ勝場がある.現在のところ、プロジェクト自体の状況に応じてデータベースフレームワークを選択することができ、GreenDaoデータフレームワークを使用しているプロジェクトは、Roomデータベースフレームワークに切り替えるのに十分な理由がありません.