GreenDao使用の詳細、パッケージング、最適化のアップグレード

39516 ワード

GreenDao
http://greenrobot.org/greendao/documentation/公式サイト
Androidはデータベースのサードパーティフレームワークを開発し、効率は高いと言われていますが、オリジナルのアップグレードよりずっと便利です.自分に書いて後で便利に見て、みんなに一緒に勉強して使うように共有します.
1、工事build.gradleの下
buildscript {

    repositories {
        maven { url 'https://maven.google.com' }
        jcenter()
        google()
        mavenCentral()//***GreenDao    
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'//***GreenDao    
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

2、moudleのbuild.gradle
android {
	..............
    // In your app projects build.gradle file:
    apply plugin: 'com.android.application'
    apply plugin: 'org.greenrobot.greendao'
    greendao {
        schemaVersion 1  //   
        daoPackage 'com.study.test.testapplication.db'  //  +dbName
        targetGenDir 'src/main/java'  //db  
    }
}
dependencies {
         ......
	implementation 'org.greenrobot:greendao:3.2.2'
}

3、プロジェクトの同期の下で、もう一度BUILDをやり直す
4、MyApplication初期化
public class MyApplication extends Application {

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    public static MyApplication instances;

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        setDatabase();
    }

    /**
     *     
     *
     * @return
     */
    public static MyApplication getInstances() {
        return instances;
    }
    /**
     *   greenDao
     */
    private void setDatabase() {
        //    DaoMaster      DevOpenHelper,           SQLiteOpenHelper   。
        //          ,        「CREATE TABLE」    SQL   ,   greenDAO       。
        //   :    DaoMaster.DevOpenHelper         ,      ,            。
        //   ,       ,         ,           。
        mHelper = new DaoMaster.DevOpenHelper(this, "test-db", null);
        db = mHelper.getWritableDatabase();
        //   :         DaoMaster,     Session            。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public  DaoSession getDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }

}

5、Userテーブルエンティティークラスを作成する:
@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;

    @NotNull
    private String name;
    private String sex;
    private String age;
    private String email;

    .....     build     ...
}

6.SQLUtilsの作成
public class SQLiteUtils {
    private static SQLiteUtils instance;
    private UserDao userEntityDao;
    private DaoSession daoSession;
    private DaoMaster.DevOpenHelper helper;

    private SQLiteUtils() {
        daoSession = MyApplication.getInstances().getDaoSession();
        userEntityDao = daoSession.getUserDao();
        QueryBuilder.LOG_VALUES=true;
        QueryBuilder.LOG_SQL=true;
    }

    public static SQLiteUtils getInstance() {
        if (instance == null) {
            synchronized (SQLiteUtils.class) {
                if (instance == null) {
                    instance = new SQLiteUtils();
                }
            }
        }
        return instance;
    }

    //  
    public void addUser(User testBean) {
        userEntityDao.insert(testBean);
    }

    //  
    public void deleteUser(User testBean) {
        userEntityDao.delete(testBean);
    }

    //  
    public void updateUser(User testBean) {
        userEntityDao.update(testBean);
    }

 /**
     *     ,    
     * @param age
     * @param user
     */
    public void updateWhereAgeUser(String age,User user){
        daoSession.getDatabase().execSQL("update user set age=? where age=?and email=?",new Object[]{age,user.getAge(),user.getEmail()});
    }

    //    
    public List<User> selectAllUser() {
        userEntityDao.detachAll();//    
        List<User> list1 = userEntityDao.loadAll();
        return list1 == null ? new ArrayList<User>() : list1;
    }

    //    
    public List<User> selectWhereAge(String age) {
        QueryBuilder<User> queryBuilder = userEntityDao.queryBuilder().where(UserDao.Properties.Age.eq(age));
        return queryBuilder.list();
    }

    //      
    public void deleteAllUser() {
        userEntityDao.deleteAll();
    }

   /**
     *         
     * @param age [  ]
     */
    public void deletewhereAge(String age) {
        daoSession.getDatabase().execSQL("delete from user where age=?",new Object[]{age});
    }

    /**
     *        
     *  :       ,         
     */
    public void closeConnection() {
        closeHelper();
        closeDaoSession();
    }

    private void closeHelper() {
        if (helper != null) {
            helper.close();
            helper = null;
        }
    }

    private void closeDaoSession() {
        if (daoSession != null) {
            daoSession.clear();
            daoSession = null;
        }
    }
}


7.SQLUtilsを使用してGreenDaoを操作する
  • 挿入データ
  • SQLiteUtils.getInstance().addUser(new User(null, "name", "sex", "10", "email"));
    
  • クエリーデータ
  • //      
    SQLiteUtils.getInstance().selectAllUser();
    
    //    
    SQLiteUtils.getInstance().selectWhereAge(10);
    
    
  • 修正データ
  • 
    SQLiteUtils.getInstance().updateWhereAgeUser("10",new User(null, "name1221", "sex", "22", "email"));
    
    
  • 削除データ
  • //    ,  id  
    SQLiteUtils.getInstance().deletewhereAge(new User());
    
    //    
    SQLiteUtils.getInstance().deletewhereAge("1000");
    

    GreenDaoパッケージによるアップグレード・データベースの元のデータ損失の解決
    1、Github上のフレーム【1】依存を追加し、GreenDaoのバージョンに従って依存バージョンを選択する
    1、パッケージMyOpenHelper
    public class MyOpenHelper extends DaoMaster.DevOpenHelper {
    
        public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
            super(context, name, factory);
        }
    
        @Override
        public void onUpgrade(Database db, int oldVersion, int newVersion) {
    //        super.onUpgrade(db, oldVersion, newVersion);  //     !!!
    
            if (oldVersion < newVersion) {
                Log.i("version", oldVersion + "---          ---" + newVersion);
            }
    
            MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
                @Override
                public void onCreateAllTables(Database db, boolean ifNotExists) {
                    Log.e("chenxh","ifNotExists:"+ifNotExists);
                    DaoMaster.createAllTables(db, ifNotExists);
                }
                @Override
                public void onDropAllTables(Database db, boolean ifExists) {
                    Log.e("chenxh","ifExists:"+ifExists);
                    DaoMaster.dropAllTables(db, true);
                }
            },UserDao.class);//     ,  ,   
        }
    }
    
    

    3、Myapplicationでデータベースを作成する:
    public class MyApplication extends Application {
    
        private MyOpenHelper mHelper;
        private SQLiteDatabase db;
        private DaoMaster mDaoMaster;
        private DaoSession mDaoSession;
    
        public static MyApplication instances;
    
        @Override
        public void onCreate() {
            super.onCreate();
            instances = this;
            setDatabase();
        }
    
        /**
         *     
         *
         * @return
         */
        public static MyApplication getInstances() {
            return instances;
        }
    
        /**
         *   greenDao
         */
        private void setDatabase() {
            //      
            MigrationHelper.DEBUG = true;
            //   Daomaster               
            mHelper = new MyOpenHelper(this, "test-db", null);
            db = mHelper.getWritableDatabase();
            mDaoMaster = new DaoMaster(db);
            mDaoSession = mDaoMaster.newSession();
    
        }
    
        public DaoSession getDaoSession() {
            return mDaoSession;
        }
    
        public SQLiteDatabase getDb() {
            return db;
        }
    
    }
    

    質問があればメールを送ることができます[email protected]