GreenDao(1)--項目配置

項目配置

  • grdle配置
    在Android Studio的build.gradle配上
    compile 'de.greenrobot:greendao:1.3.7'
    compile 'de.greenrobot:greendao-generator:1.3.1'

  • 生成代碼

項目示例2

我們需要在包根目錄新建一個Java文件,做初始化工作。
如圖所示,包的根目錄是'com.usst.chensl.greendaodemo',創建一個名為'ExampleDaoGenerator'的Java文件。

ExampleDaoGenerator文件如下

package com.usst.chensl.introducdemo.db;    
import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

/**
 * 初始化工作

 * Created by ChenSL on 2015/8/14.
 */
public class ExampleDaoGenerator {

    private static void addTaskDetail(Schema schema) {
        //指定實體類
        Entity entity = schema.addEntity("User");
        //添加id屬性
        entity.addIdProperty();
        //添加列userId,指定非空,默認可為空
        entity.addStringProperty("userId").notNull();
        //添加列username  
        entity.addStringProperty("username");
        //添加列age
        entity.addIntProperty("age");
        //添加列phone
        entity.addStringProperty("phone");
    }

    public static void main(String[] args) throws Exception {
        //生成數據庫文件的目標包名//target package for dao files
        //第一個參數是數據庫版本號,第二個參數是包的根目錄的包
        Schema schema = new Schema(1, "db");
        addDetail(schema);
        try {
            //第二個參數是src-gen文件夾相對路徑
            //'..'代表工程前一個目錄,接著是工程名/app(AndroidStudio生成)/
            new DaoGenerator().generateAll(schema, "../GreenDaoDemo/app/src/main/java/com/usst/chensl/greendaodemo/");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Entity可以看作是一張表,它使用構造器模式來設計,可以指定某一列的各種數據庫屬性,例如非空,自增,升降序,主鍵等。

同時,在工程目錄下新建src-gen文件夾,放置代碼生成的數據庫文件。

項目文件結構目錄

對著ExampleDaoGenerator右鍵,選擇run ... main(),會在src-gen文件夾中生成四個文件。

注意:必須要使用run main()這種方法,在AndroidStudio下直接對該文件右鍵即可選擇run main(),之前LZ試過在onCreate()里跑結果報錯

下面來看看初始化出來的東西:

項目實例3

db包拖動到包的根目錄下,然后可以將src-gen文件夾下的東西全部刪掉了。

初始化完成

初始化完成后,'ExampleDaoGenerator'就沒用了,留著修改后可以創建另一個表,不需要可以刪除。

  • user實體類,注釋已經說明是GreenDao自動生成的。其實就跟自己建實體類一樣,不過現在是代碼自動生成

     package com.usst.chensl.introductdemo.db;
    
     // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. 
     /**
      * Entity mapped to table USER.
      */
     public class User {
     
         private Long id;
         private String userId;
         private String username;
         private String age;
         private String phone;
     
         public User() {
         }
     
         public User(Long id) {
             this.id = id;
         }
     
         public User(Long id, String userId, String username, String age, String phone) {
             this.id = id;
             this.userId = userId;
             this.username = username;
             this.age = age;
             this.phone = phone;
         }
     
         public Long getId() {
             return id;
         }
     
         public void setId(Long id) {
             this.id = id;
         }
     
         public String getUserId() {
             return userId;
         }
     
         public void setUserId(String userId) {
             this.userId = userId;
         }
     
         public String getUsername() {
             return username;
         }
     
         public void setUsername(String username) {
             this.username = username;
         }
     
         public String getAge() {
             return age;
         }
     
         public void setAge(String age) {
             this.age = age;
         }
     
         public String getPhone() {
             return phone;
         }
     
         public void setPhone(String phone) {
             this.phone = phone;
         }
     
     }
    
  • userDao,如果自己實現過簡單的ORM框架的話,很容易就看出這個是對sql語句的包裝,有createTable()dropTable,readEntity,updateKeyAfterInsert,這些望文生義的方法

     package com.usst.chensl.introductdemo.db;
     
     import android.database.Cursor;
     import android.database.sqlite.SQLiteDatabase;
     import android.database.sqlite.SQLiteStatement;
     
     import de.greenrobot.dao.AbstractDao;
     import de.greenrobot.dao.Property;
     import de.greenrobot.dao.internal.DaoConfig;
     
     import com.usst.chensl.introductdemo.db.User;
     
     // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
     /** 
      * DAO for table USER.
     */
     public class UserDao extends AbstractDao<User, Long> {
     
         public static final String TABLENAME = "USER";
     
         /**
          * Properties of entity User.<br/>
          * Can be used for QueryBuilder and for referencing column names.
         */
         public static class Properties {
             //參數分別是(列數,類型,Java實體類的變量名,是否主鍵,數據庫列名)
             //因為上面有entity.addIdProperty(),所以自動生成了主鍵'_id'
             public final static Property Id = new Property(0, Long.class, "id", true, "_id");
             public final static Property UserId = new Property(1, String.class, "userId", false, "USER_ID");
             public final static Property Username = new Property(2, String.class, "username", false, "USERNAME");
             public final static Property Age = new Property(3, String.class, "age", false, "AGE");
             public final static Property Phone = new Property(4, String.class, "phone", false, "PHONE");
         };
     
         public UserDao(DaoConfig config) {
             super(config);
         }
         
         public UserDao(DaoConfig config, DaoSession daoSession) {
             super(config, daoSession);
         }
     
         /** Creates the underlying database table. */
         public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
             String constraint = ifNotExists? "IF NOT EXISTS ": "";
             db.execSQL("CREATE TABLE " + constraint + "'USER' (" + //
                     "'_id' INTEGER PRIMARY KEY ," + // 0: id
                     "'USER_ID' TEXT," + // 1: userId
                     "'USERNAME' TEXT," + // 2: username
                     "'AGE' TEXT," + // 3: age
                     "'PHONE' TEXT);"); // 4: phone
         }
     
         /** Drops the underlying database table. */
         public static void dropTable(SQLiteDatabase db, boolean ifExists) {
             String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "'USER'";
             db.execSQL(sql);
         }
     
         /** @inheritdoc */
         @Override
         protected void bindValues(SQLiteStatement stmt, User entity) {
             stmt.clearBindings();
      
             Long id = entity.getId();
             if (id != null) {
                 stmt.bindLong(1, id);
             }
      
             String userId = entity.getUserId();
             if (userId != null) {
                 stmt.bindString(2, userId);
             }
      
             String username = entity.getUsername();
             if (username != null) {
                 stmt.bindString(3, username);
             }
      
             String age = entity.getAge();
             if (age != null) {
                 stmt.bindString(4, age);
             }
      
             String phone = entity.getPhone();
             if (phone != null) {
                 stmt.bindString(5, phone);
             }
         }
     
         /** @inheritdoc */
         @Override
         public Long readKey(Cursor cursor, int offset) {
             return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
         }    
     
         /** @inheritdoc */
         @Override
         public User readEntity(Cursor cursor, int offset) {
             User entity = new User( //
                 cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
                 cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // userId
                 cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // username
                 cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // age
                 cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4) // phone
             );
             return entity;
         }
          
         /** @inheritdoc */
         @Override
         public void readEntity(Cursor cursor, User entity, int offset) {
             entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
             entity.setUserId(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
             entity.setUsername(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
             entity.setAge(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
             entity.setPhone(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
          }
         
         /** @inheritdoc */
         @Override
         protected Long updateKeyAfterInsert(User entity, long rowId) {
             entity.setId(rowId);
             return rowId;
         }
         
         /** @inheritdoc */
         @Override
         public Long getKey(User entity) {
             if(entity != null) {
                 return entity.getId();
             } else {
                 return null;
             }
         }
     
         /** @inheritdoc */
         @Override    
         protected boolean isEntityUpdateable() {
             return true;
         }
         
     }
    
  • DaoSession,數據庫Session

     package com.usst.chensl.introductdemo.db;
     
     import android.database.sqlite.SQLiteDatabase;
     
     import java.util.Map;
     
     import de.greenrobot.dao.AbstractDao;
     import de.greenrobot.dao.AbstractDaoSession;
     import de.greenrobot.dao.identityscope.IdentityScopeType;
     import de.greenrobot.dao.internal.DaoConfig;
     
     import com.usst.chensl.introductdemo.db.User;
     
     import com.usst.chensl.introductdemo.db.UserDao;
     
     // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
     
     /**
      * {@inheritDoc}
      * 
      * @see de.greenrobot.dao.AbstractDaoSession
      */
     public class DaoSession extends AbstractDaoSession {
     
         private final DaoConfig userDaoConfig;
     
         private final UserDao userDao;
     
         public DaoSession(SQLiteDatabase db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
                 daoConfigMap) {
             super(db);
     
             userDaoConfig = daoConfigMap.get(UserDao.class).clone();
             userDaoConfig.initIdentityScope(type);
     
             userDao = new UserDao(userDaoConfig, this);
     
             registerDao(User.class, userDao);
         }
         
         public void clear() {
             userDaoConfig.getIdentityScope().clear();
         }
     
         public UserDao getUserDao() {
             return userDao;
         }
     
     }
    
  • DaoMaster,對SQLiteDatabase的封裝,包含了UserDao

     package com.usst.chensl.introductdemo.db;
     
     import android.content.Context;
     import android.database.sqlite.SQLiteDatabase;
     import android.database.sqlite.SQLiteDatabase.CursorFactory;
     import android.database.sqlite.SQLiteOpenHelper;
     import android.util.Log;
     import de.greenrobot.dao.AbstractDaoMaster;
     import de.greenrobot.dao.identityscope.IdentityScopeType;
     
     import com.usst.chensl.introductdemo.db.UserDao;
     
     // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
     /** 
      * Master of DAO (schema version 1): knows all DAOs.
     */
     public class DaoMaster extends AbstractDaoMaster {
         public static final int SCHEMA_VERSION = 1;
     
         /** Creates underlying database table using DAOs. */
         public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) {
             UserDao.createTable(db, ifNotExists);
         }
         
         /** Drops underlying database table using DAOs. */
         public static void dropAllTables(SQLiteDatabase db, boolean ifExists) {
             UserDao.dropTable(db, ifExists);
         }
         
         //抽象類
         public static abstract class OpenHelper extends SQLiteOpenHelper {
             
             public OpenHelper(Context context, String name, CursorFactory factory) {
                 super(context, name, factory, SCHEMA_VERSION);
             }
     
             @Override
             public void onCreate(SQLiteDatabase db) {
                 Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
                 createAllTables(db, false);
             }
         }
         
         //真正實現類
         /** WARNING: Drops all table on Upgrade! Use only during development. */
         public static class DevOpenHelper extends OpenHelper {
         
             public DevOpenHelper(Context context, String name, CursorFactory factory) {
                 super(context, name, factory);
             }
     
             @Override
             public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                 Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
                 dropAllTables(db, true);
                 onCreate(db);
             }
         }
     
         public DaoMaster(SQLiteDatabase db) {
             super(db, SCHEMA_VERSION);
             registerDaoClass(UserDao.class);
         }
         
         public DaoSession newSession() {
             return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
         }
         
         public DaoSession newSession(IdentityScopeType type) {
             return new DaoSession(db, type, daoConfigMap);
         }
         
     }
    

DbMaster的最終目的是獲取DbSession,通過DbSession對數據庫進行操作。

下一篇說GreenDao具體使用,敬請期待~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • GreenDao 介紹:greenDAO是一個對象關系映射(ORM)的框架,能夠提供一個接口通過操作對象的方式去操...
    小董666閱讀 739評論 0 1
  • 2017年5月17日 Kylin_Wu 標注(★☆)為考綱明確給出考點(必考) 常見手機系統(★☆) And...
    Azur_wxj閱讀 1,830評論 0 10
  • 一、配置maven的pom.xml加載jar包 為了后續開發的方便,將SSM框架所有需要的jar包一并加載進來 p...
    docki閱讀 2,273評論 1 23
  • 看到微博上說2015年對你最重要的事,我一下子就想到了畢業,然后是去參加書海滄生的簽售會,然后工作?然后第一次晚上...
    由子閱讀 175評論 1 0
  • 好吧,今天看了kindle上面的簡書周刊,有篇文章提到了每天寫一千字堅持不懈所能帶來的各種改變。作為真心想成為...
    KevinYoung閱讀 362評論 0 1