GreenDao使用詳解、封裝、優化升級

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

  1. 插入數據
SQLiteUtils.getInstance().addUser(new User(null, "name", "sex", "10", "email"));
  1. 查詢數據
//所有數據查詢
SQLiteUtils.getInstance().selectAllUser();

//條件查詢
SQLiteUtils.getInstance().selectWhereAge(10);

  1. 修改數據

SQLiteUtils.getInstance().updateWhereAgeUser("10",new User(null, "name1221", "sex", "22", "email"));

  1. 刪除數據
//這種默認,通過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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章