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;  
        }  
      
    }  
  • 相关阅读:
    Python统计excel表格中文本的词频,生成词云图片
    springboot application.properties 常用完整版配置信息
    JAVA高级-面试题总结
    删除csdn上面自己上传的资源
    本博客背景特效源码
    我的自定义框架 || 基于Spring Boot || 第一步
    PYTHON 实现的微信跳一跳【辅助工具】仅作学习
    PM2守护babel-node
    记一个HOST引起的前端项目打不开的问题
    迭代器与iterable
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/3483604.html
Copyright © 2011-2022 走看看