GreenDao使用解析


GreenDao是一個輕量級的數據庫框架,相比Xutils 等他的速度和效率會更快更好

這里展示GreenDao 的使用方法

①建立

 

compile 'org.greenrobot:greendao:3.2.0'

  基於Android Studio 的集成非常簡單,你需要現在Build Gradle里依賴此GreenDao庫

除此之外,你還需要在Build Gradle里使用插件的形式聲明

//使用greendao
apply plugin: 'org.greenrobot.greendao'

  還應該在build.gradle里配置dao 的package和targetGenDir 和 version,此配置應是在android{ }內聲明

 

  //greendao配置
    greendao {
        //版本號,升級時可配置
        schemaVersion 1
        daoPackage 'arcturis.greendao'
        targetGenDir 'src/main/java'

    }

  補充一句,數據庫的使用是需要SD卡的讀寫權限的所以別忘了添加權限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

  tips!還需要再工程的build.gradle里聲明,此處位於dependencies{ }內

        //GreenDao3依賴
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'

 

②代碼自動生成機制

GreenDao 的數據基類生成方式和xutils不一樣,Xutils你需要手動去寫bean類,然后和他的一些get Set方法,雖然Green也需要你去寫,但是他更多亮點的東西是自動生成這些相關方法,包括他的數據庫聲明以及控制文件

比如我們需要一個列表購物的清單文件這個商品我們需要保存於數據庫中

類似於這個是開始的bean基類

@Entity
public class Shop {
    //表示為購物車列表
    public static final int TYPE_CART = 0x01;
    //表示為收藏列表
    public static final int TYPE_LOVE = 0x02;

    //不能用int
    @Id(autoincrement = true)
    private Long id;

    //商品名稱 Unique 該屬性值必須在數據庫中是唯一值
    @Unique
    private String name;

    //商品價格 Property 可以自定義字段名,注意外鍵不能使用該屬性
    @Property(nameInDb = "price")

    private String price;
    //已售數量
    private int sell_num;
    //圖標url
    private String image_url;
    //商家地址
    private String address;
    //商品列表類型
    private int type;
}

  這里就是一個基本的bean基類,我們需要注解,這樣GreenDao才會知道這個是我們的bean基類,才會有后面的自動生成代碼的部分,然后我們看下各個注解的意思

@Entity 這個是一個Bean基類Entity
@Id(autoincrement = true) ID 可以設置是否自增漲,開啟自增長之后就算初始化你傳入null也沒有關系,類型為Long型
@Unique 由此標識標識在數據庫中此字段為唯一

@Property:設置一個非默認關系映射所對應的列名,默認是使用字段名,例如:@Property(nameInDb = "name")

之后點擊編譯按鈕,然后如果各項設置均准確設置成功,GreenDao就會幫助我們生成以下文件

 

就是標紅的三個文件

DaoMaster

DaoSession

ShopDao(這個名字是根據我們定義的bean類類名字來定義的)

然后我們就可以在Application里進行初始化工作

   private void steupDataBase(){
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"shop.db",null);

        //獲取可寫DataBase
        SQLiteDatabase db = helper.getWritableDatabase();
        //獲取數據庫對象
        DaoMaster daoMaster = new DaoMaster(db);
        //獲取Dao對象管理者
        daoSession = daoMaster.newSession();
    }

  

DaoMaster:

使用 greenDAO 的入口點。DaoMaster 負責管理數據庫對象(SQLiteDatabase)和 DAO 類(對象),我們可以通過它內部類 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 創建不同模式的 SQLite 數據庫。

DaoSession :

管理指定模式下的所有 DAO 對象,DaoSession提供了一些通用的持久性方法比如插入、負載、更新、更新和刪除實體。

XxxDAO :

每個實體類 greenDAO  多會生成一個與之對應DAO對象,如:User 實體,則會生成一個一個UserDao 類

這樣我們就將GreenDao建立完成

還需要獲取daoSession的實例

   private static DaoSession  daoSession;

    public static DaoSession getDaoinstan(){
        return daoSession;
    }

  使用靜態方法獲取DaoSession的實例,就可以進行數據庫的增刪改查操作。

 

③如何將GreenDao生成在特定的CD卡位置

 

有時候我們需要將GreenDao聲稱在特定的位置,這個時候我們怎么做,GreenDao也給我們提供了定制的機會,按照以下類寫即可

此類繼承自contextWrapper需重寫getDatabasePath方法

public class GreenDaoContext extends ContextWrapper {

    private Context mContext;

    public GreenDaoContext(){
        super(MyApplication.getContext());
        this.mContext = MyApplication.getContext();
    }

    @Override
    public File getDatabasePath(String dbName) {

        String dbBasePath = AppPathUtils.getDbCacheBaseDir(mContext);

        File dbDir = new File(dbBasePath);
        if(!dbDir.exists()){
            dbDir.mkdirs();
        }

        StringBuffer buffer = new StringBuffer();
        buffer.append(dbBasePath);
        buffer.append(File.separator);
        buffer.append(dbName);

        String dbPath = buffer.toString();

        File dbFile = new File(dbPath);

        if(!dbFile.exists()){

            try {
                dbFile.createNewFile();// 創建文件

            } catch (IOException e) {
                e.printStackTrace();
            }
            return dbFile;
        }else{
            return super.getDatabasePath(dbName);
        }
    }


    /***
     * 重載這個方法,是用來打開SD卡上的數據庫的,android 2.3及以下會調用這個方法。
     * @param name
     * @param mode
     * @param factory
     * @return
     */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
        SQLiteDatabase result =SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
        return result;
    }

    /**
     *  Android 4.0調用此方法獲取數據庫
     * @param name
     * @param mode
     * @param factory
     * @param errorHandler
     * @return
     */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
        return result;
    }

然后再application里初始化的時候改變一個地方的傳入值即可

   DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(new GreenDaoContext(),"shop.db",null);

        //獲取可寫DataBase
        SQLiteDatabase db = helper.getWritableDatabase();
        //獲取數據庫對象
        DaoMaster daoMaster = new DaoMaster(db);
        //獲取Dao對象管理者
        daoSession = daoMaster.newSession();

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM