zoukankan      html  css  js  c++  java
  • greenDaoMaster的学习研究

    最近一直在研究一个第三方的开源框架,greenDaoMaster是一个移动开发的ORM框架,由于网上一直查不到使用资料,所以自己摸索总结下用法。

    首先需要新建一个JAVA项目用来自动生成文件。需要导入greendao-generator-1.3.0.jar和freemarker.jar到项目中

    示例代码如下:

    /*
     * Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de)
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package de.greenrobot.daogenerator.gentest;
    
    import de.greenrobot.daogenerator.DaoGenerator;
    import de.greenrobot.daogenerator.Entity;
    import de.greenrobot.daogenerator.Property;
    import de.greenrobot.daogenerator.Schema;
    import de.greenrobot.daogenerator.ToMany;
    
    /**
     * Generates entities and DAOs for the example project DaoExample.
     * 
     * Run it as a Java application (not Android).
     * 
     * @author Markus
     */
    public class ExampleDaoGenerator {
    
        public static void main(String[] args) throws Exception {
        	
            Schema schema = new Schema(3, "de.greenrobot.daoexample");
    
            addNote(schema);
            addCustomerOrder(schema);
    
            new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");
        }
    
        private static void addNote(Schema schema) {
            Entity note = schema.addEntity("Note");
            note.addIdProperty();
            note.addStringProperty("text").notNull();
            note.addStringProperty("comment");
            note.addDateProperty("date");
        }
    
        private static void addCustomerOrder(Schema schema) {
            Entity customer = schema.addEntity("Customer");
            customer.addIdProperty();
            customer.addStringProperty("name").notNull();
    
            Entity order = schema.addEntity("Order");
            order.setTableName("ORDERS"); // "ORDER" is a reserved keyword
            order.addIdProperty();
            Property orderDate = order.addDateProperty("date").getProperty();
            Property customerId = order.addLongProperty("customerId").notNull().getProperty();
            order.addToOne(customer, customerId);
    
            ToMany customerToOrders = customer.addToMany(order, customerId);
            customerToOrders.setName("orders");
            customerToOrders.orderAsc(orderDate);
        }
    
    }
    

    来分析这段代码:

    Schema schema = new Schema(3, "de.greenrobot.daoexample");


    Schema对象接受2个参数,第一个参数是DB的版本号,通过更新版本号来更新数据库。第二个参数是自动生成代码的包路径。包路径系统自动生成

    在来看这段代码

    Entity note = schema.addEntity("Note");
            note.addIdProperty();
            note.addStringProperty("text").notNull();
            note.addStringProperty("comment");
            note.addDateProperty("date");


    Entity表示一个实体可以对应成数据库中的表

    系统自动会以传入的参数作为表的名字,这里表名就是NOTE

    当然也可以自己设置表的名字,像这样:

    order.setTableName("ORDERS");


    接下来是一些字段参数设置。

    如果想ID自动增长可以像这样:

      order.addIdProperty().autoincrement();


    再来看这一段:

    new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");


    第一个参数是Schema对象,第二个参数是希望自动生成的代码对应的项目路径。

    试了下src-gen这个文件夹必须手动创建,这里路径如果错了会抛出异常。

    好了先别慌运行这段程序。新建一个Android项目名字是DaoExample,和刚才的JAVA项目保持在同一个文件夹下。

    接着就可以运行刚才的JAVA程序,会看到src-gen下面自动生成了8个文件,3个实体对象,3个dao,1个DaoMaster,

    1个DaoSession

    greenDAO Generator
    Copyright 2011-2013 Markus Junginger, greenrobot.de. Licensed under GPL V3.
    This program comes with ABSOLUTELY NO WARRANTY
    Processing schema version 3...
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleNoteDao.java
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleNote.java
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleCustomerDao.java
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleCustomer.java
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleOrderDao.java
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleOrder.java
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleDaoMaster.java
    Written D:android workspaceOpen SourcegreenDAO-masterDaoExamplesrc-gendegreenrobotdaoexampleDaoSession.java
    Processed 3 entities in 7743ms
    


    可以看到DaoMaster中封装了SQLiteDatabase和SQLiteOpenHelper

    来看看如何使用GreenDao实现CRUD

    如下代码实现插入一个Note对象:

       DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
            db = helper.getWritableDatabase();
            daoMaster = new DaoMaster(db);
            daoSession = daoMaster.newSession();
            noteDao = daoSession.getNoteDao();
            Note note = new Note(null, noteText, comment, new Date());
            noteDao.insert(note);

    代码变得如此简单。

    官方推荐将取得DaoMaster对象的方法放到Application层这样避免多次创建生成Session对象。

    感觉这个框架和Web的Hibernate有异曲同工之妙。

    这里列出自己实际开发中的代码方便记忆:

    首先是在Application层实现得到DaoMaster和DaoSession的方法:

    public class BaseApplication extends Application {
    	
    	private static BaseApplication mInstance;
    	private static DaoMaster daoMaster;
    	private static DaoSession daoSession;
    	
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		if(mInstance == null)
    			mInstance = this;
    	}
    	
    	/**
    	 * 取得DaoMaster
    	 * 
    	 * @param context
    	 * @return
    	 */
    	public static DaoMaster getDaoMaster(Context context) {
    		if (daoMaster == null) {
    			OpenHelper helper = new DaoMaster.DevOpenHelper(context,Constants.DB_NAME, null);
    			daoMaster = new DaoMaster(helper.getWritableDatabase());
    		}
    		return daoMaster;
    	}
    	
    	/**
    	 * 取得DaoSession
    	 * 
    	 * @param context
    	 * @return
    	 */
    	public static DaoSession getDaoSession(Context context) {
    		if (daoSession == null) {
    			if (daoMaster == null) {
    				daoMaster = getDaoMaster(context);
    			}
    			daoSession = daoMaster.newSession();
    		}
    		return daoSession;
    	}
    }
    


    然后写一个Db工具类:

    public class DbService {
    	
    	private static final String TAG = DbService.class.getSimpleName();
    	private static DbService instance;
    	private static Context appContext;
    	private DaoSession mDaoSession;
    	private NoteDao noteDao;
    	
    	
    	private DbService() {
    	}
    
    	public static DbService getInstance(Context context) {
    		if (instance == null) {
    			instance = new DbService();
    			if (appContext == null){
    				appContext = context.getApplicationContext();
    			}
    			instance.mDaoSession = BaseApplication.getDaoSession(context);
    			instance.noteDao = instance.mDaoSession.getNoteDao();
    		}
    		return instance;
    	}
    	
    	
    	public Note loadNote(long id) {
    		return noteDao.load(id);
    	}
    	
    	public List<Note> loadAllNote(){
    		return noteDao.loadAll();
    	}
    	
    	/**
    	 * query list with where clause
    	 * ex: begin_date_time >= ? AND end_date_time <= ?
    	 * @param where where clause, include 'where' word
    	 * @param params query parameters
    	 * @return
    	 */
    	
    	public List<Note> queryNote(String where, String... params){
    		return noteDao.queryRaw(where, params);
    	}
    	
    	
    	/**
    	 * insert or update note
    	 * @param note
    	 * @return insert or update note id
    	 */
    	public long saveNote(Note note){
    		return noteDao.insertOrReplace(note);
    	}
    	
    	
    	/**
    	 * insert or update noteList use transaction
    	 * @param list
    	 */
    	public void saveNoteLists(final List<Note> list){
    	    	if(list == null || list.isEmpty()){
    			     return;
    		    }
    		    noteDao.getSession().runInTx(new Runnable() {
    			@Override
    			public void run() {
    				for(int i=0; i<list.size(); i++){
    					Note note = list.get(i);
    					noteDao.insertOrReplace(note);
    				}
    			}
    		});
    		
    	}
    	
    	/**
    	 * delete all note
    	 */
    	public void deleteAllNote(){
    		noteDao.deleteAll();
    	}
    	
    	/**
    	 * delete note by id
    	 * @param id
    	 */
    	public void deleteNote(long id){
    		noteDao.deleteByKey(id);
    		Log.i(TAG, "delete");
    	}
    	
    	public void deleteNote(Note note){
    		noteDao.delete(note);
    	}
    	
    }
    


    DB常量:

    public class Constants {
    	public static final String DB_NAME = "note_db";
    }


    Note实体类:

    // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. 
    /**
     * Entity mapped to table note.
     */
    public class Note {
    
        private Long id;
        /** Not-null value. */
        private String title;
        /** Not-null value. */
        private String content;
        private java.util.Date createDate;
    
        public Note() {
        }
    
        public Note(Long id) {
            this.id = id;
        }
    
        public Note(Long id, String title, String content, java.util.Date createDate) {
            this.id = id;
            this.title = title;
            this.content = content;
            this.createDate = createDate;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        /** Not-null value. */
        public String getTitle() {
            return title;
        }
    
        /** Not-null value; ensure this value is available before it is saved to the database. */
        public void setTitle(String title) {
            this.title = title;
        }
    
        /** Not-null value. */
        public String getContent() {
            return content;
        }
    
        /** Not-null value; ensure this value is available before it is saved to the database. */
        public void setContent(String content) {
            this.content = content;
        }
    
        public java.util.Date getCreateDate() {
            return createDate;
        }
    
        public void setCreateDate(java.util.Date createDate) {
            this.createDate = createDate;
        }
    
    }
    






  • 相关阅读:
    Linux svn checkout时候总报设备上没有空间
    Linux vi常用命令
    Linux 文件与目录管理
    Linux 文件权限于目录配置
    Linux 项目上线管理 MAVEN + expect 一台机器管理所有机器的应用程序
    alibaba / zeus 安装 图解
    hadoop 1.0.1集群安装及配置
    linux 远程复制 scp
    Django的一些操作与视图函数
    MCV 和 MTV框架基本信息
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748373.html
Copyright © 2011-2022 走看看