Android ORM

簡介

您是否在Android上使用sqlite來存儲您的應(yīng)用數(shù)據(jù)呢?如果是,或許您會對Android存取sqlite數(shù)據(jù)感覺有點小復(fù)雜。本人從2010年開始從事Android開發(fā),對于Android的數(shù)據(jù)庫操縱這一塊裁蚁,感覺還是比較復(fù)雜的,尤其是可維護性及或可擴展性方面继准,都是比較差的枉证。
也正是從這時開始,我決定在Android平臺上實現(xiàn)像Hibernate那樣的ORM框架移必,來簡化開發(fā)工作室谚。使得開發(fā)者在使用sqlite數(shù)據(jù)庫時,無需關(guān)注底層數(shù)據(jù)庫實現(xiàn)崔泵,更多的是關(guān)注上層業(yè)務(wù)邏輯實現(xiàn)秒赤。
如果您對此項目感興趣,歡迎您的加入管削!

特性

  • 簡潔的ORM映射配置, 只需在Java Bean的屬性中添加類似@Column(name="_name")的注解即可完成到數(shù)據(jù)庫字段的映射配置.
  • 強大的正向工程支持, 自動生成DDL和ContentProvider.
  • 給力的輔助工具, 向?qū)叫陆ˋctivity/Service/BroadcastReceiver并且自動配置到AndroidManifest.xml.
  • ...
    更多特性倒脓,請自行體驗.

使用

最新版本 $latest 為:

, 在使用中請將$latest替換為具體的版本.

Eclipse

下載aorm-core-$latest.jar并放入libs/目錄下

推薦安裝Android ADT-extensions插件

Android Studio

Aorm已經(jīng)發(fā)布到j(luò)center,在您的app/build.gradle中添加以下依賴含思。

dependencies {
    compile 'cn.ieclipse.aorm:aorm-core:1.1.5'
}

推薦安裝Android Studio上的Android ORM Tool插件,可以快速生成相關(guān)代碼甘晤。

類似orm庫比較

簡單試驗結(jié)果:

Simple Trial
Simple Trial

復(fù)雜試驗結(jié)果:

Complex Trial
Complex Trial

測試工程代碼請參考: https://github.com/Raizlabs/AndroidDatabaseLibraryComparison

示例代碼

創(chuàng)建映射

只需添加類@Table注解及@Column屬性注解即可完成表與字段的映射含潘。

@Table(name = "student")
public class Student implements Serializable {
    
    @Column(name = "_id", id = true)
    public long id; //id is Primary key.
    
    @Column(name="_name")
    public String name; //mapping to _name and auto column type
    
    @Column()
    public int age; //auto column type and name
    
    @Column(defaultValue="''")
    public String phone; // default value in empty
    
    public String address; // no mapping
}

Create database

package cn.ieclipse.aorm.example;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import cn.ieclipse.aorm.Aorm;
import cn.ieclipse.aorm.Session;
import cn.ieclipse.aorm.example.bean.Course;
import cn.ieclipse.aorm.example.bean.Grade;
import cn.ieclipse.aorm.example.bean.Student;

/**
 * @author Jamling
 * 
 */
public class ExampleContentProvider extends ContentProvider {
    
    public static final String AUTH = "cn.ieclipse.aorm.example.provider";
    public static final Uri URI = Uri.parse("content://" + AUTH);
    private SQLiteOpenHelper mOpenHelper;
    private static Session session;
    
    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        return 0;
    }
    
    @Override
    public String getType(Uri arg0) {
        return null;
    }
    
    @Override
    public Uri insert(Uri arg0, ContentValues arg1) {
        return null;
    }
    
    @Override
    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
            String arg4) {
        return null;
    }
    
    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        return 0;
    }
    
    public static Session getSession() {
        return session;
    }
    
    @Override
    public boolean onCreate() {
        mOpenHelper = new SQLiteOpenHelper(this.getContext(), "example.db",
                null, 1) {
            public void onCreate(SQLiteDatabase db) {
                // method 3: use AORM to create table
                Aorm.createTable(db, Grade.class);
                Aorm.createTable(db, Student.class);
                Aorm.createTable(db, Course.class);
            }
            
            public void onUpgrade(SQLiteDatabase db, int oldVersion,
                    int newVersion) {
                // update table, suggested to wrapper in if block
                Aorm.updateTable(db, Grade.class);
                Aorm.updateTable(db, Student.class);
                Aorm.updateTable(db, Course.class);
            }
        };
        session = new Session(mOpenHelper, getContext().getContentResolver());
        return true;
    }
    
}

查詢

        Session session = ExampleContentProvider.getSession();
        // 最簡單的查詢:查詢所有的學(xué)生信息.
        Criteria criteria = Criteria.create(Student.class);
        // 添加條件: id相等
        criteria.add(Restrictions.eq("id", 1));
        // 添加條件: name like Jamling
        criteria.add(Restrictions.like("name", "Jaming"));
        // add restriction: age < 30
        criteria.add(Restrictions.lt("age", 30));
        // add order
        criteria.addOrder(Order.asc("age"));
        // set district
        criteria.setDistinct(true);
        // set limit from row 10 to 20
        criteria.setLimit(10, 10);

        List<Student> list = session.list(Student.class);
        // if you use Android CursorAdapter you can:
        Cursor c = session.query(criteria);

        // set alias, so the project will be alias.columnn. e.g. s.name
        // criteria.setAlias("s");
        // multi-table query
        criteria.addChild(StudentMore.class, "m", Criteria.INNER_JOIN,
                Restrictions.geProperty("s.id", "m.id"));
        // query to cursor
        c = session.query(criteria);
        // convert to list.
        List<Object[]> ret = CursorUtils.getFromCursor(c,
                new Class[] { Student.class }, new String[] { "s", "m" });
        // query to list.
        ret = session.listAll(criteria);
        Object[] item = ret.get(0);
        Student s = (Student) item[0];
        StudentMore m = (StudentMore) item[1];
        //

其它操作

        Session session = ExampleContentProvider.getSession();
        // insert
        Student s = new Student();
        s.setName("Jamling");
        long rowId = session.insert(s, null);
        // update student's name to Jame whose id is 1
        s.setId(1);
        s.setName("Jame");
        int rows = session.update(s);
        // delete student whose id is 2
        session.deleteById(Student.class, 2);
        // query student whose id is 4
        s = session.get(Student.class, 4);

文檔

請參考 http://www.ieclipse.cn/p/Android-ORM/userguide.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遏弱,一起剝皮案震驚了整個濱河市塞弊,隨后出現(xiàn)的幾起案子泪姨,更是在濱河造成了極大的恐慌,老刑警劉巖饰抒,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袋坑,居然都是意外死亡,警方通過查閱死者的電腦和手機枣宫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來也颤,“玉大人洋幻,你說我怎么就攤上這事翅娶。” “怎么了故觅?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵厂庇,是天一觀的道長。 經(jīng)常有香客問我输吏,道長权旷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任贯溅,我火速辦了婚禮拄氯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘它浅。我一直安慰自己译柏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布姐霍。 她就那樣靜靜地躺著鄙麦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镊折。 梳的紋絲不亂的頭發(fā)上胯府,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音恨胚,去河邊找鬼骂因。 笑死,一個胖子當(dāng)著我的面吹牛赃泡,可吹牛的內(nèi)容都是我干的寒波。 我是一名探鬼主播乘盼,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俄烁!你這毒婦竟也來了绸栅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤猴娩,失蹤者是張志新(化名)和其女友劉穎阴幌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卷中,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡矛双,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟆豫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片议忽。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖十减,靈堂內(nèi)的尸體忽然破棺而出栈幸,到底是詐尸還是另有隱情,我是刑警寧澤帮辟,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布速址,位于F島的核電站,受9級特大地震影響由驹,放射性物質(zhì)發(fā)生泄漏芍锚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一蔓榄、第九天 我趴在偏房一處隱蔽的房頂上張望并炮。 院中可真熱鬧逃魄,春花似錦、人聲如沸伍俘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舶胀,卻和暖如春碧注,著一層夾襖步出監(jiān)牢的瞬間糖赔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工逝变, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奋构,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓宴咧,卻偏偏與公主長得像径缅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纳猪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,791評論 25 707
  • 前言 我相信沙绝,在平時的開發(fā)過程中丽猬,大家一定會或多或少地接觸到SQLite。然而在使用它時脚祟,我們往往需要做許多額外的...
    勤奮的pangdunhu閱讀 2,000評論 1 11
  • 在開發(fā)Android應(yīng)用時,保存數(shù)據(jù)有這么幾個方式为黎, 一個是本地保存,一個是放在后臺(提供API接口)铭乾,還有一個是...
    ThinkerHu閱讀 2,642評論 0 1
  • 簡要說明 YoDao是一個簡單又高效的Android ORM開源框架娃循。 項目主頁:https://github.c...
    駱駝騎士閱讀 2,656評論 4 24
  • foreach bind 1.示例 2.不帶元素的綁定 if bind 1.綁定示例 if 綁定是很重要的,它能讓...
    luichooy閱讀 301評論 0 0