Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ORM 框架之 ActiveAndroid應用基礎

Android ORM 框架之 ActiveAndroid應用基礎

編輯:關於Android編程

Android">ActiveAndroid作為輕量級的ORM框架,在快速開發中,使用很簡單,滿足大部分對數據庫操作不復雜的應用。

一,配置

添加依賴

build.gradle中添加:

repositories {
    mavenCentral()
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}

compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'

項目配置

1>Application類配置:

    

        ...

    
" data-snippet-id="ext.44fc325f8ea1e55c6327075976a1cd72" data-snippet-saved="false" data-codota-status="done">
    

        ...

    

注意:應用程序的名稱指向ActiveAndroid應用程序類。如果使用自定義的應用程序類,要繼承com.activeandroid.app.Application而不是android.app.Application:

public class MyApplication extends com.activeandroid.app.Application { ...
}

但是,如果已經有了繼承其他Application類的類,需要在應用程序初始化類ActiveAndroid(如果調試中需要重置框架,調用ActiveAndroid.dispose();後初始化):

public class MyApplication extends SomeLibraryApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        ActiveAndroid.initialize(this);
    }
}

2>配置數據庫名和版本名:

    

        ...

        
        

    
" data-snippet-id="ext.daf1f5118d4bae054a2dd92e5b20fa11" data-snippet-saved="false" data-codota-status="done">
    

        ...

        
        

    

如果想動態的創建數據庫,可以這樣配置:

public class MyApplication extends SomeLibraryApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        Configuration dbConfiguration = new Configuration.Builder(this).setDatabaseName("xxx.db").create();
        ActiveAndroid.initialize(dbConfiguration);
    }
}

二,創建表

創建表需要新建實體類繼承Model,添加類注解@Table(name = “表名”),類成員添加@Column注解標識表裡的列。 ActiveAndroid自動為表添加自增的id主鍵。ActiveAndroid使用標准構造函數實例化對象,如果定義有自己的構造函數,還必須定義一個無參構造函數。
如下,創建一個表Items,表中添加兩列(自動添加id列),一個為String類型的Name列,一個為實體Category列:

@Table(name = "Items")
public class Item extends Model {
        // If name is omitted, then the field name is used.
        @Column(name = "Name")
        public String name;

        @Column(name = "Category")
        public Category category;

        public Item() {
                super();
        }

        public Item(String name, Category category) {
                super();
                this.name = name;
                this.category = category;
        }
}

@Table(name = "Categories")
public class Category extends Model {
    @Column(name = "Name")
    public String name;

    ...
}

如果Category 和 Item是一對多的關系,可以在Category類中添加一個helper 方法:

 items() {
        return getMany(Item.class, "Category");
    }
}" data-snippet-id="ext.cceb5c268e2acc7fe021e03873d62cba" data-snippet-saved="false" data-codota-status="done">@Table(name = "Categories")
public class Category extends Model {
    ...

        // helper方法, 不要影響外鍵創建.
    public List items() {
        return getMany(Item.class, "Category");
    }
}

指定某個列可以被索引,在其注解中添加:index = true。

@Column(name = "Name", index = true)
    public String name;

其他屬性可以查詢依賴包中com.activeandroid.annotation.Column。

ActiveAndroid會搜索所有的文件查找Model的子類,如果項目中有很多依賴,這個過程會花費很長時間。為了加快應用的啟動速度,我們可以在清單文件中明確的指出model類,多個用逗號分開:

" data-snippet-id="ext.2e7fb879004fa8409733297b1d4b556f" data-snippet-saved="false" data-codota-status="done">

不要使用以下詞語作表和列名:

ABORT               DEFAULT         INNER         REGEXP
ACTION              DEFERRABLE      INSERT        REINDEX
ADD                 DEFERRED        INSTEAD       RELEASE
AFTER               DELETE          INTERSECT     RENAME
ALL                 DESC            INTO          REPLACE
ALTER               DETACH          IS            RESTRICT
ANALYZE             DISTINCT        ISNULL        RIGHT
AND                 DROP            JOIN          ROLLBACK
AS                  EACH            KEY           ROW
ASC                 ELSE            LEFT          SAVEPOINT
ATTACH              END             LIKE          SELECT
AUTOINCREMENT       ESCAPE          LIMIT         SET
BEFORE              EXCEPT          MATCH         TABLE
BEGIN               EXCLUSIVE       NATURAL       TEMP
BETWEEN             EXISTS          NO            TEMPORARY
BY                  EXPLAIN         NOT           THEN
CASCADE             FAIL            NOTNULL       TO
CASE                FOR             NULL          TRANSACTION
CAST                FOREIGN         OF            TRIGGER
CHECK               FROM            OFFSET        UNION
COLLATE             FULL            ON            UNIQUE
COLUMN              GLOB            OR            UPDATE
COMMIT              GROUP           ORDER         USING
CONFLICT            HAVING          OUTER         VACUUM
CONSTRAINT          IF              PLAN          VALUES
CREATE              IGNORE          PRAGMA        VIEW
CROSS               IMMEDIATE       PRIMARY       VIRTUAL
CURRENT_DATE        IN              QUERY         WHEN
CURRENT_TIME        INDEX           RAISE         WHERE
CURRENT_TIMESTAMP   INDEXED         RECURSIVE     WITH
DATABASE            INITIALLY       REFERENCES    WITHOUT
                    ID

三,數據處理

保存一條新的數據,需要創建一個activeandroid.Model對象,為其成員指定值,然後其save()方法。save()執行保存和更新數據。

Category restaurants = new Category();
restaurants.name = "Restaurants";
restaurants.save();

插入一條item數據,並為其指定一個category

Item item = new Item();
item.category = restaurants;
item.name = "Outback Steakhouse";
item.save();

如果插入多條數據,需要重復創建activeandroid.Model對象,然後重復執行相關操作。

要刪除單條記錄只需要調用delete()方法。在下面的例子中,我們將通過id加載一個對象,並將其刪除:

Item item = Item.load(Item.class, 1);
item.delete();

或:

Item.delete(Item.class, 1);

也可以使用查詢語法:

new Delete().from(Item.class).where("Id = ?", 1).execute();

ActiveAndroid可以使用查詢語法或Model.query()方法查詢數據。
獲取一條隨機的數據:

public static Item getRandom() {
    return new Select().from(Item.class).orderBy("RANDOM()").executeSingle();
}

ActiveAndroid構建查詢就像建立一個正常的SQL語句,創建一個新的Select對象,調用並傳入item類。然後,我們調用排序依據方法,傳遞“隨機”。要執行可以調用execute(查詢),或者executeSingle()。等還有一些其他指令。
從指定的category隨機獲取一個item:

public static Item getRandom(Category category) {
    return new Select()
        .from(Item.class)
        .where("Category = ?", category.getId())
        .orderBy("RANDOM()")
        .executeSingle();
}

獲取所有item,並按name排列:

 getAll(Category category) {
    return new Select()
        .from(Item.class)
        .where("Category = ?", category.getId())
        .orderBy("Name ASC")
        .execute();
}" data-snippet-id="ext.b9a017351c33d0c37b7ae9df291780b6" data-snippet-saved="false" data-codota-status="done">public static List getAll(Category category) {
    return new Select()
        .from(Item.class)
        .where("Category = ?", category.getId())
        .orderBy("Name ASC")
        .execute();
}

事務

當一次執行多條數據時,還可以使用事務處理,會較於上面方法有很大加速。
一次插入多條數據:

ActiveAndroid.beginTransaction();
try {
        for (int i = 0; i < 100; i++) {
            Item item = new Item();
            item.name = "Example " + i;
            item.save();
        }
        ActiveAndroid.setTransactionSuccessful();
}
finally {
        ActiveAndroid.endTransaction();
}

在查詢Category數據時,因為每個對象中包括了一個List對象,所以,我們需要在查詢出Category對象後,在把關聯的List表查詢一遍:

 category = new Select().from(Category.class).limit(20).execute();
    if (category != null) {
        int len = category.size();
        for (int i = 0; i < len; i++) {
            category.get(i).items();
        }
    }
   ActiveAndroid.setTransactionSuccessful();
   } finally {
       ActiveAndroid.endTransaction();
   }" data-snippet-id="ext.802e56520f0ad83b9ebef5704054df92" data-snippet-saved="false" data-codota-status="done">ActiveAndroid.beginTransaction();
try {
    List category = new Select().from(Category.class).limit(20).execute();
    if (category != null) {
        int len = category.size();
        for (int i = 0; i < len; i++) {
            category.get(i).items();
        }
    }
   ActiveAndroid.setTransactionSuccessful();
   } finally {
       ActiveAndroid.endTransaction();
   }

四,類型序列

ActiveAndroid默認處理多種類型。如果需要處理自定義數據類型,繼承TypeSerializer,重寫其方法。比如我們要將Date類型轉換為long類型保存,讀取的時候又直接得到Date類型:

 getDeserializedType() {
        return Date.class;
    }
    /**
     *返回存儲到數據庫中的類型
     */
    public Class getSerializedType() {
        return long.class;
    }
   /**
    *將我們所使用的數據類型轉換為ActiveAndroid存儲的數據類型
    */
    public Long serialize(Object data) {
        if (data == null) {
            return null;
        }

        return ((Date) data).getTime();
    }
    /**
    *使存儲的數據轉換成使用的數據類型
    */
    public Date deserialize(Object data) {
        if (data == null) {
            return null;
        }

        return new Date((Long) data);
    }
}" data-snippet-id="ext.7dd60920c6c990d4c281c609b8393abd" data-snippet-saved="false" data-codota-status="done">    public final class UtilDateSerializer extends TypeSerializer {
    /**
     *返回序列的類
     */
    public Class getDeserializedType() {
        return Date.class;
    }
    /**
     *返回存儲到數據庫中的類型
     */
    public Class getSerializedType() {
        return long.class;
    }
   /**
    *將我們所使用的數據類型轉換為ActiveAndroid存儲的數據類型
    */
    public Long serialize(Object data) {
        if (data == null) {
            return null;
        }

        return ((Date) data).getTime();
    }
    /**
    *使存儲的數據轉換成使用的數據類型
    */
    public Date deserialize(Object data) {
        if (data == null) {
            return null;
        }

        return new Date((Long) data);
    }
}

然後注冊自定義的序列化類型,在AndroidManifest.xml聲明它們:

" data-snippet-id="ext.1ee965351c4bf65a80b47dda2b90f45c" data-snippet-saved="false" data-codota-status="done">

ActiveAndroid自帶的TypeSerializer:
這裡寫圖片描述

五,使用content provider

1>在AndroidManifest.xml聲明:


    
    ...
" data-snippet-id="ext.c7bc71a93593a45ce3563201e37669bb" data-snippet-saved="false" data-codota-status="done">
    
    ...

2>在表注解中添加id列:

@Table(name = "Items", id = BaseColumns._ID)
public class Item extends Model {...}

3>使用:

() {
        @Override
        public Loader onCreateLoader(int arg0, Bundle cursor) {
            return new CursorLoader(getActivity(),
                ContentProvider.createUri(MyEntityClass.class, null),
                null, null, null, null
            );
        }

        @Override
        public void onLoadFinished(Loader arg0, Cursor cursor) {
            ((SimpleCursorAdapter)mySpinner.getAdapter()).swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader arg0) {
            ((SimpleCursorAdapter)mySpinner.getAdapter()).swapCursor(null);
        }
    });" data-snippet-id="ext.1398312adbb776551ce6093267ad2d77" data-snippet-saved="false" data-codota-status="done">    mySpinner.setAdapter(new SimpleCursorAdapter(getActivity(),
        android.R.layout.simple_expandable_list_item_1,
        null,
        new String[] { "MyProperty" },
        new int[] { android.R.id.text1 },
        0));

    getActivity().getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks() {
        @Override
        public Loader onCreateLoader(int arg0, Bundle cursor) {
            return new CursorLoader(getActivity(),
                ContentProvider.createUri(MyEntityClass.class, null),
                null, null, null, null
            );
        }

        @Override
        public void onLoadFinished(Loader arg0, Cursor cursor) {
            ((SimpleCursorAdapter)mySpinner.getAdapter()).swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader arg0) {
            ((SimpleCursorAdapter)mySpinner.getAdapter()).swapCursor(null);
        }
    });

六,數據庫升級

當架構變化,需要增加數據庫的版本號,需要使用配置文件,並且改變AA_DB_VERSION meta-data。如果你想改變數據庫中現有的表(比如,添加一列或重命名表),要使用命名為< NewVersion >.sql的sql腳本,放進assets/migrations中,NewVersion是版本號。如果它的文件名比以前的數據庫版本高,ActiveAndroid會執行它。
例如 向 Items表中添加 color列:
1>AA_DB_VERSION 增加為 2 ,並提供一個名為2.sql的腳本:

ALTER TABLE Items ADD COLUMN color INTEGER;

2>增加實體類color。

七,導入提供有的數據庫

1>將數據庫放進assets包中:

/myapp/src/main/assets/prepop.db

2>manifest.xml中設置AA_DB_NAME:

" data-snippet-id="ext.c4b39bc1310671cd64b62757b0d9451d" data-snippet-saved="false" data-codota-status="done">

3>創建android_metadata表:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')

INSERT INTO "android_metadata" VALUES ('en_US')

4>如果表model沒有定義id列,主鍵重命名為默認值id,而不是_id。如果數據是被建議主鍵列為_id的使用,比如ListView,可以在@Table注解中添加id = “_id”:

@Table(name = "Items", id = "_id")
public class Item extends Model {
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved