zoukankan      html  css  js  c++  java
  • Android之greenDao,一个orm的使用

    转自:http://blog.csdn.net/krislight/article/details/9391455

     greenDaoMaster的学习研究
    分类: 心得笔记 2013-07-20 16:59 603人阅读 评论(11) 收藏 举报
    greenDao
    最近一直在研究一个第三方的开源框架,greenDaoMaster是一个移动开发的ORM框架,由于网上一直查不到使用资料,所以自己摸索总结下用法。
    首先需要新建一个JAVA项目用来自动生成文件。需要导入greendao-generator-1.3.0.jar和freemarker.jar到项目中
    示例代码如下:
    [java] view plaincopy
    /* 
     * 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);  
        }  
      
    }  
    来分析这段代码:
    [java] view plaincopy
    Schema schema = new Schema(3, "de.greenrobot.daoexample");  
    
    Schema对象接受2个参数,第一个参数是DB的版本号,通过更新版本号来更新数据库。第二个参数是自动生成代码的包路径。包路径系统自动生成
    在来看这段代码
    [java] view plaincopy
    Entity note = schema.addEntity("Note");  
            note.addIdProperty();  
            note.addStringProperty("text").notNull();  
            note.addStringProperty("comment");  
            note.addDateProperty("date");  
    
    Entity表示一个实体可以对应成数据库中的表
    系统自动会以传入的参数作为表的名字,这里表名就是NOTE
    当然也可以自己设置表的名字,像这样:
    [java] view plaincopy
    order.setTableName("ORDERS");  
    
    接下来是一些字段参数设置。
    如果想ID自动增长可以像这样:
    [java] view plaincopy
    order.addIdProperty().autoincrement();  
    
    再来看这一段:
    [java] view plaincopy
    new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");  
    
    第一个参数是Schema对象,第二个参数是希望自动生成的代码对应的项目路径。
    试了下src-gen这个文件夹必须手动创建,这里路径如果错了会抛出异常。
    好了先别慌运行这段程序。新建一个Android项目名字是DaoExample,和刚才的JAVA项目保持在同一个文件夹下。
    接着就可以运行刚才的JAVA程序,会看到src-gen下面自动生成了8个文件,3个实体对象,3个dao,1个DaoMaster,
    1个DaoSession
    [java] view plaincopy
    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对象:
    [java] view plaincopy
    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的方法:
    [java] view plaincopy
    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工具类:
    [java] view plaincopy
    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常量:
    [java] view plaincopy
    public class Constants {  
        public static final String DB_NAME = "note_db";  
    }  
    
    Note实体类:
    [java] view plaincopy
    // 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;  
        }  
      
    }  
  • 相关阅读:
    94. Binary Tree Inorder Traversal
    101. Symmetric Tree
    38. Count and Say
    28. Implement strStr()
    实训团队心得(1)
    探索性测试入门
    LC.278. First Bad Version
    Search in Unknown Sized Sorted Array
    LC.88. Merge Sorted Array
    LC.283.Move Zeroes
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/3483604.html
Copyright © 2011-2022 走看看