關於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的靜態方法,其內部類OpenHelper和DevOpenHelper實現了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更深層次的運用還沒學到,先了解大概的用法,會用了才能理解的更深