1. 程式人生 > >Android雜談(22)GreenDAO的使用

Android雜談(22)GreenDAO的使用

我和一幫應屆生同學維護了一個公眾號:IT面試填坑小分隊。旨在幫助應屆生從學生過度到開發者,並且每週樹立學習目標,一同進步!
這裡寫圖片描述

寫在前面

很久沒有寫部落格了,沒辦法。國際局勢著實有點跳脫,腐朽的美帝資本主義能的簡直要上天了。把不要臉的精神發揮的淋淋盡致,日甚一日,甚囂塵上。更可氣的是,一些不法分子,資本主義自由思想氾濫,忘掉了本性,應該堅決清理出偉大的社會主義陣營!可這和我沒寫部落格有什麼關係呢?
沒有關係啊!我就是在裝逼。

今天記錄一下使用GreenDAO的過程,第一次使用關於資料庫的框架。不得不說真的好用。有多好用?這麼形容,十方無影像,六道絕形蹤。跳出三界外,不在五行中。這簡直就是一個賊6的框架。

準備階段

依賴:

    compile 'org.greenrobot:greendao:3.2.0'

greendao {
    schemaVersion 1  //資料庫版本
    daoPackage 'com.aopa.greendao'   //自動生成工具類的目錄位置
    targetGenDir 'src/main/java'    
}

PS:我並沒有用過2.x的版本,因此那種些main方法的經歷的確沒有接觸過。

我們在使用GreenDAO的時候,我們只需要按套路寫一個類,這個類就是對應我們資料庫的每一張表。比如:

開始

@Entity
public class CollectQuestion { @Id(autoincrement = true) private Long id; @Property(nameInDb = "USERNAME") private int testName; }

通過@Entity那麼這個類便成了資料庫中的一張表,而@Id 此表明這是表的主鍵。當我們build工程之後我們會發現,GreenDAO替我們預設生成了:

這裡寫圖片描述

關於Entity:

//直接Google翻譯的官方註釋
@Entity(
        // 如果你有多個模式,你可以告訴greenDAO
// 實體所屬的模式(選擇任何字串作為名稱). schema = "myschema", // 使實體“活動”的標誌:活動實體具有更新,刪除和重新整理方法。 active = true, // 指定資料庫中的表的名稱。 預設情況下,名稱基於實體類名稱。 nameInDb = "AWESOME_USERS", // 在此處定義跨多個列的索引。 indexes = { @Index(value = "name DESC", unique = true) }, // 標記DAO是否應該建立資料庫表(預設值為true)。 // 如果您有多個實體對映到一個表,或者表的建立是在greenDAO之外建立的, // 則將此屬性設定為false。 createInDb = false, // 是否應生成所有屬性建構函式。 // 總是需要一個無引數的建構函式。 generateConstructors = true, // 如果缺少,應該生成屬性的getter和setter。 generateGettersSetters = true )

關於Property:

@Property允許您定義屬性對映到的非預設列名稱。如果不存在,greenDAO將以SQL-ish方式使用欄位名(大寫字母,下劃線代替駝峰,例如 customName將成為 CUSTOM_NAME)。注意:您當前只能使用內聯常量來指定列名稱。

表以及欄位的預設值:

greenDAO嘗試使用合理的預設值,因此開發人員不必配置每一個位。

例如,資料庫側的表和列名稱派生自實體和屬性名稱。而不是在Java中使用的駱駝案例樣式,預設資料庫名稱使用大寫,使用下劃線分隔單詞。

例如,名為creationDate的屬性 將成為資料庫列 CREATION_DATE。

簡單的操作資料庫:

建立資料庫:


DaoMaster.DevOpenHelper devOpenHelper=new DaoMaster.DevOpenHelper(context,"test.db");
SQLiteDatabase database = devOpenHelper.getWritableDatabase();
DaoSession daoSession = new DaoMaster(database).newSession();
QuestionDao questionDao = daoSession.getQuestionDao();

當我們獲取questionDao 物件之後,我們便可以很方便的操作資料庫了。

//查詢表中所有資訊
collectQuestionDao.queryBuilder().list();
//按條件查詢
collectQuestionDao.queryBuilder()
                    .where(CollectQuestionDao.Properties.TestName
                    .eq("aaa")).list();
//限制,分頁
collectQuestionDao.queryBuilder()
                .limit(5)
                .offset(5)
                .list();


//簡單的插入:
collectQuestionDao.insert(collectQuestion);

//通過主鍵刪除:
collectQuestionDao.deleteByKey(1L);

//更新
question.setTestName("bbb");
collectQuestionDao.update(question);

//更多用法,請直接上官網

開啟已有的資料庫:做法很簡單。和我們正常開啟內建的資料庫沒什麼兩樣。

開啟assets中的資料庫

首先要封裝一個返回SQLiteDatabase 物件的類。


public class MySQLiteDatabase {
    String filePath = "data/data/com.aopa/data.db";
    String pathStr = "data/data/com.aopa/databases";

    public  SQLiteDatabase openDatabase(Context context){
        File jhPath=new File(filePath);
        if(jhPath.exists()){
            return SQLiteDatabase.openOrCreateDatabase(jhPath, null);
        }else{
            File path=new File(pathStr);
            if (path.mkdir()){
            }else{
            }
            try {
                InputStream is=context.getClass().getClassLoader().getResourceAsStream("assets/"+"data.db");

                FileOutputStream fos=new FileOutputStream(jhPath);
                byte[] buffer=new byte[10240];
                int count = 0;
                while((count = is.read(buffer))>0){
                    fos.write(buffer,0,count);
                }
                fos.flush();
                fos.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            return openDatabase(context);
        }
    }
}

然後按套路來建立DaoSession 即可。


MySQLiteDatabase s = new MySQLiteDatabase ();
SQLiteDatabase db = s.openDatabase(App.getInstance().getContext());
DaoSession daoSession = new DaoMaster(db).newSession();

OK,到此我們就可以正常的操作資料庫了。

尾聲

如果看的直迷糊,你可拉到吧,別看了。民主富強革命火炬的傳承,靠的是我們這些祖國的花朵,王者農藥挺好玩的,還不快去上分。
更多用法還是直接進官網來的快:http://greenrobot.org/greendao/documentation/

相關推薦

Android雜談22GreenDAO的使用

我和一幫應屆生同學維護了一個公眾號:IT面試填坑小分隊。旨在幫助應屆生從學生過度到開發者,並且每週樹立學習目標,一同進步! 寫在前面 很久沒有寫部落格了,沒辦法。國際局勢著實有點跳脫,腐朽的美帝資本主義能的簡直要上天了。把不要臉的精神發揮的淋淋盡

Android雜談14OKHttp+Gson的簡單使用

轉載請注意:http://blog.csdn.net/wjzj000/article/details/52562674 本菜GitHub上開源了一個小的Android專案,感興趣的看官大大們可以star下: https://github.com/zhiaixinyan

Android雜談11更換Androidstudio快取配置目錄,減少c盤壓力

轉載請注意:http://blog.csdn.net/wjzj000/article/details/52424496 我和一幫應屆生同學維護了一個公眾號:IT面試填坑小分隊。旨在幫助應、屆生從學生過度到開發者,並且每週樹立學習目標,一同進步! 剛剛發現

Android面試題22-lruCache與DiskLruCache快取詳解

關於lruCache(最近最少使用)的演算法,這是一個比較重要的演算法,它的應用非常廣泛,不僅僅在Android中使用,Linux系統等其他地方中也有使用;今天就來看一看這其中的奧祕;講到LruCache,就不得不講一講LinkedHashMap,而對於LinkedHashM

[Android]如何做一個崩潰率少於千分之三噶應用app22-元件化路由跳轉

大家好,我是蒼王。以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。 大家應該有看完我的第十二編簡書的頁面跳轉會清楚跨module的跳轉用Android原生來做是,需要使用隱式跳轉完成。 但是原生跳轉方式是有很多的侷限性的。這裡借用AR

Android 資料加密及安全網路通訊雜談

Android 資料加密及安全網路通訊雜談 前言:本人多年從事軟體開發,發現大多數程式設計師(其中包括不少是資深的)、CTO、PM們對資訊保安的瞭解幾乎為零!很多時候,專案負責人在不得不面對資訊保安需求時,隨意指派某個程式設計師(通常還是入行時間最短、技術經驗最少的那位)負

ActiveMQ22:Consumer高級特性之消息分組Message Groups

jms message groups activemq 一、簡介Message Groups就是對消息分組,它是Exclusive Consumer功能的增強。邏輯上,Message Groups 可以看成是一種並發的Exclusive Consumer。跟所有的消息都由唯一的consumer處理

如何運行容器?- 每天5分鐘玩轉 Docker 容器技術22

docker 教程 容器 上一章我們學習了如何構建 Docker 鏡像,並通過鏡像運行容器。本章將深入討論容器:學習容器的各種操作,容器各種狀態之間如何轉換,以及實現容器的底層技術。運行容器docker run 是啟動容器的方法。在討論 Dockerfile 時我們已經學習到,可用三種方式指定容器

android weight權重的詳細分析

關註 一段 sum 比例 .net orien 2個 背景 wid 首先要明確權重分配的是那些空間? 權重是依照比例分配屏幕的剩余空間 對這句話不理解的能夠看下圖 假如我們希望剩余的空間平分給空間1 和空間2 , 我們分別在2個控件的設置and

設計模式解密22- 訪問者模式

ges action oid 使用 復合 con 9.png ava array 前言:訪問者模式拆分 訪問者模式基礎篇 :http://www.cnblogs.com/JsonShare/p/7380772.html 訪問者模式擴展篇 - 分派的概念: htt

設計模式解密22- 訪問者模式 - 擴展篇分派的概念

綁定 接受 傳遞 ble 實例 擴展 back exp 重載方法 前言:訪問者模式拆分 訪問者模式基礎篇 :http://www.cnblogs.com/JsonShare/p/7380772.html 訪問者模式擴展篇 - 分派的概念: http://www.cn

Akka22: Stream:實時操控:動態管道連接-MergeHub,BroadcastHub and PartitionHub

urn abs bound parameter code 結果類型 subscribe mil 又是 在現實中我們會經常遇到這樣的場景:有一個固定的數據源Source,我們希望按照程序運行狀態來接駁任意數量的下遊接收方subscriber、又或者我需要在程序運行時(ru

深入淺出數據結構C語言版22——排序決策樹與桶式排序

不改變 自然 只需要 都是 變種 限定 style buck oid   在(17)中我們對排序算法進行了簡單的分析,並得出了兩個結論:   1.只進行相鄰元素交換的排序算法時間復雜度為O(N2)   2.要想時間復雜度低於O(N2),算法必須進行遠距離的元素交換     

讀《Android電視機機頂盒初次開發的一些經驗分享》後的筆記

方便 實現 radi 麻煩 lamp 順時針 焦點控制 href ott 原文: http://blog.csdn.net/tanghongchang123/article/details/52982818 一、基本命令: 1、adb connect [ip] 2、 a

Linux學習筆記22

22一、yum更換國內源時候自帶的yum源是國外的很慢,這個時候可以換成國內163的源刪除/etc/yum.repos.d/centos-Base文件用這兩條命令下載一個新的Base163文件,yum clean all yum repolist all 查看所有源的可用情況二、yum下載rpm包yum

每天一個linux命令22:tar命令

soft 小文件 sof linu gunzip 算法 rect 過程 提取文件 通過SSH訪問服務器,難免會要用到壓縮,解壓縮,打包,解包等,這時候tar命令就是是必不可少的一個功能強大的工具。linux中最流行的tar是麻雀雖小,五臟俱全,功能強大。 tar命令可以為l

Python實用筆記 22面向對象編程——實例屬性和類屬性

keyword com HA class python int def pytho obj 由於Python是動態語言,根據類創建的實例可以任意綁定屬性。 給實例綁定屬性的方法是通過實例變量,或者通過self變量: class Student(object): de

Android廣播BroacastReceiver與服務Service

com 還要 activit pro service 動態註冊 let onclick nds BroadcastReceiver可以理解成是一種組件,是默默的在改後臺運行的,用於在不同軟件和不同組件之間的傳遞,無法被用戶感知,因為他在系統的內部工作,BroadcastRe

設計模式學習之責任鏈模式Chain of Responsibility,行為型模式22

分析 一定的 之間 ash 我們 set 抽象 request 發現 參考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一、引言   在現實生活中,有很多請求並不是一個人說了就算的,例如面試時的工資,低

Android MVC MVC簡介

mvc tar .com 程序 tro view 用戶界面 lis 代碼 今天有朋友和我提到Android中的MVC模式,自己就在這裏總結下,如有不妥,大家盡情批評指教 MVC框架簡介   MVC全名是Model View Controller,是模型(model)-視圖(