GreenDao初學

關於GreenDao的初步學習,本想着用Android studio來學習的,可是無奈電腦內存太小,裝上之後,完全卡的不能用,所以暫用eclipse來學習

編譯工具:eclipse-android-neon-2-incubation-win32

jar包:freemarker-2.3.25-incubating.jar     greendao-generator-2.1.0.jar  greendao-2.1.0.jar (特別說明一下,greendao的版本其實已經升到3.X.X了,可是因爲編譯生成的文件裏面含有註釋,類似於@Id,@Name,在eclipse裏無法解決,所以用低版本的)

jdk版本爲1.7

步驟:

1.首先創建一個java工程,工程名字叫greendaogenerate



2. 把下載好的greendao jar包:freemarker-2.3.25-incubating.jar 和 greendao-generator-2.1.0.jar放進 java工程的libs中


3.創建GreenDaoGenerate.java文件,內容如下:


package greendaogenerate;

import java.io.IOException;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Property;
import de.greenrobot.daogenerator.Schema;

public class GreenDaoGenerate {

	public static void main(String[] args) {
		// 正如你所見的,你創建了一個用於添加實體(Entity)的模式(Schema)對象。
		// 兩個參數分別代表:數據庫版本號與自動生成代碼的包路徑。
		Schema schema = new Schema(2, "www.imooc.com");
		// 當然,如果你願意,你也可以分別指定生成的 Bean 與 DAO 類所在的目錄,只要如下所示:
		// Schema schema = new Schema(1, "www.imooc.com.bean");
		// schema.setDefaultJavaPackageDao("www.imooc.com.dao");

		// 兒子表
		// 一個實體(類)就關聯到數據庫中的一張表,此處表名爲「Son」(既類名)
		Entity son = schema.addEntity("Son");
		
		// greenDAO 會自動根據實體類的屬性值來創建表字段,並賦予默認值  
        // 接下來你便可以設置表中的字段:
		son.addStringProperty("name");
		son.addIntProperty("age");
		son.addIdProperty();
		
		//設置fatherId爲son表的外鍵
		Property fatherId = son.addLongProperty("fatherId").getProperty();

		// 父親表
		Entity father = schema.addEntity("Father");
		father.addIdProperty();
		father.addStringProperty("name");
		father.addIntProperty("age");

		// 一對一的關係 一個兒子對應一個父親
		son.addToOne(father, fatherId);

		// 一對多的關係 一個父親對應多個兒子
		// Property sonId = son.addLongProperty("sonId").getProperty();
		// father.addToOne(son, sonId);
		// son.addToMany(father, sonId).setName("fathers");
		
		// 最後我們將使用 DaoGenerator 類的 generateAll()
		// 方法自動生成代碼,此處你需要根據自己的情況更改輸出目錄(既之前創建的目錄就發在src下)。
		try {
			new DaoGenerator().generateAll(schema, "../GreenDaoGenerate/src");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
4.編譯運行,生成文件,點擊項目刷新或F5才能看到,此時文件是帶紅叉的,需要拷貝到Android工程目錄下



5.Android工程是提前創建好的,拷貝過去,在libs目錄下導入greendao-2.1.0.jar 然後需要把拷貝過來的文件中之前的工程路徑刪去 如:import www.imooc.com.xxxx;這樣就沒有錯誤了。

DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase對象以及操作DAO classes(注意:不是對象)。其提供了一些創建和刪除table的靜態方法,其內部類OpenHelperDevOpenHelper實現了SQLiteOpenHelper並創建數據庫的框架。

DaoSession:會話層。操作具體的DAO對象(注意:是對象),比如各種getter方法。

XXXDao:實際生成的某某DAO類,通常對應具體的java類,比如NoteDao等。其有更多的權限和方法來操作數據庫元素。

XXXEntity:持久的實體對象。通常代表了一個數據庫row的標準java properties。


6.下面是MainActivity的內容

public class MainActivity extends Activity {

    //greenDAO提供的幫助類
    private DaoMaster master;
    private DaoSession session;
    private SQLiteDatabase db;
    private SonDao sonDao;
    private FatherDao fatherDao;
    private void openDb(){
        //創建一個名爲person.db的數據庫
        db = new DaoMaster.DevOpenHelper(MainActivity.this,"person.db",null).getWritableDatabase();
        master = new DaoMaster(db);
        session = master.newSession();
        //獲得son表操作數據庫類的對象
        sonDao = session.getSonDao();
        //獲得father表操作數據庫類的對象
        fatherDao = session.getFatherDao();
    }

    //插入數據
    private void addPerson(){
    //下面代碼具體得根據數據庫表的關係,這裏只是示例(son有多個father)
        Son son = new Son();
        son.setName("nate");
        son.setAge(29);
        sonDao.insert(son);

        Father father = new Father();
        father.setName("Tom");
        father.setSon(son);
        fatherDao.insert(father);

        Father father2 = new Father();
        father2.setName("Jane");
        father2.setSon(son);
        fatherDao.insert(father2);

    }

//常用api:
//list() 直接取出數據返回一個list並緩存數據
//listLazy() 不直接取出數據返回一個list有緩存,需手動close
//listLazyUncached() 延遲加載返回一個list不緩存數據,需手動close
//listIterator() 遍歷數據,返回一個迭代器

    public void queryAll(){
        //listLazy()懶加載,多個表級聯查詢使用最佳
       List<Son> list = sonDao.queryBuilder().list();//查詢son表中的所有數據,返回集合
       for (Son son: list){
           Log.d("nate","queryAll() called with: "+son);
       }
    }

    //條件查詢: Eq 查詢
    public void queryEq(){
       Son nate =  sonDao.queryBuilder().where(SonDao.Properties.Name.eq("nate")).unique();
       Log.d("nate","queryEq called with:"+ nate);
    }

    //條件查詢: like 查詢
    public void queryLike(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Name.like("nate%")).list();
        Log.d("nate","queryEq called with:"+ data);
    }

    //條件查詢: between 查詢
    public void queryBetween(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.between(16,20)).list();
        Log.d("nate","queryBetween called with:"+ data);
    }

    //條件查詢: > 大於 查詢
    public void queryGt(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.gt(16)).list();
        Log.d("nate","queryGt called with:"+ data);
    }

    //條件查詢: < 小於 查詢
    public void queryLt(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.lt(16)).list();
        Log.d("nate","queryLt called with:"+ data);
    }

    //條件查詢: NotEq 查詢
    public void queryNotEq(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.notEq(16)).list();
        Log.d("nate","queryNotEq called with:"+ data);
    }

    //條件查詢: GE 大於等於 查詢
    public void queryGE(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.ge(16)).list();
        Log.d("nate","queryGE called with:"+ data);
    }

    //條件查詢: 排序 查詢
    public void queryOrder(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Name.like("nate%"))
                .orderDesc(SonDao.Properties.Age).list();
        Log.d("nate","queryOrder called with:"+ data);
    }

    //拼裝sql語句查詢,在api無法滿足查詢需求的情況下使用
    public void querySQL(){
        List data =  sonDao.queryBuilder()
                .where(new WhereCondition.StringCondition(
                        "FATHER_ID IN" +"{SELECT _ID FROM FATHER WHERE AGE <50}"
                )).list();
        Log.d("nate","querySQL called with:"+ data);
    }

    //多線程查詢:有興趣可以看源碼
    public void queryThread(){
        final Query query = sonDao.queryBuilder().build();
        new Thread(){
            @Override
            public void run() {
                List data = query.forCurrentThread().list();
                Log.d("nate","queryThread called with:"+ data);
            }
        };
    }
    //一對多查詢:具體得看數據表關係
    public void queryOneToMany(){
        List<Son> sons = sonDao.queryBuilder().list();//查詢son表中的所有數據,返回集合
        for (Son son:sons){
            List<Father> fathers = son.getFathers();
            for (Father father:fathers){
                Log.d("nate","queryOneToMany() called with: "+son.getName()+" father:"+father.getName());
            }
        }
    }
    //一對一查詢:具體得看數據表關係
    public void queryOneToOne(){
        List<Son> sons = sonDao.queryBuilder().list();//查詢son表中的所有數據,返回集合
        for (Son son:sons){
           // Log.d("nate","queryOneToOne() called with: "+son.getFather().getName());
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //打開一個數據庫
         openDb();

        //向數據庫添加person
         addPerson();

        //設置打印sql語句,方便查看
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;

        //選擇具體需要的查詢方式測試:如queryOrder
        queryOrder();

    }
}


對於GreenDao更深層次的運用還沒學到,先了解大概的用法,會用了才能理解的更深




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