android開源ORM框架OrmLite使用教程


OrmLite是一個輕量級的對象關系映射包,由Java語言開發。Github上有ormlite-coreormlite-androidormlite-examples,分別是主要庫,android依賴和一些教程。

一、准備

為了在android上使用OrmLite,我們需要下載ormlite-core.jar和ormlite-android.jar放到項目目錄下,然后:

1、創建一個類繼承OrmLiteSqliteOpenHelper,實現兩個抽象方法onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) 和 onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion),查看源碼可以知道OrmLiteSqliteOpenHelper是繼承了android里自帶的SqliteOpenHelper類,以上兩個抽象方法也是擴展自SqliteOpenHelper里面的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);

public class DBHelper extends OrmLiteSqliteOpenHelper{
  public DBHelper(Context context){
   //用於通過注解+反射創建數據庫表
        super(context, DB_NAME, null, VERSION_100);
   //用於通過讀取配置文件創建數據庫表
   //super(context, DB_NAME, null, VERSION_101,R.raw.config);
    }

    @Override
    public void onCreate(SQLiteDatabase database,
            ConnectionSource connectionSource) {
        try {
            TableUtils.createTableIfNotExists(connectionSource, Account.class);            
        } catch (SQLException e) {
            LogFactory.e(e);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase database,
            ConnectionSource connectionSource, int oldVersion, int newVersion) {
        if(oldVersion<VERSION_101){
            fixVersion101() ;
        }
        if(oldVersion<VERSION_200){
            fixVersion200() ;
        }
    }
}

需要說的是在onUpgrade中如果對數據庫表有修改,則只能通過sql語句來進行,TableUtils在此時不能發揮作用。例:

void fixVersion200(){
        try {
            String sql = "ALTER TABLE '"+TAB_ACCOUNT+"' ADD COLUMN "+DATE_ID+" INTEGER ;" ;
            getDao(Account.class).executeRaw(sql) ;
        } catch (SQLException e) {
            LogFactory.e(e);
        }
    }

2、OrmLiteSqliteOpenHelper中保存着數據庫的鏈接,因此沒必要創建太多的OrmLiteSqliteOpenHelper實例,官方建議使用OpenHelperManager來對OrmLiteSqliteOpenHelper進行操作,通過OpenHelperManager.getHelper(Context context, Class<T> openHelperClass)則可以返回OrmLiteSqliteOpenHelper實例;或者通過setOpenHelperClass()然后再getHelper();再或者在res-string下面定義一個open_helper_classname,里面制定類名,OrmLite框架會通過反射將其實例化;

3、最簡單的使用OpenHelperManager的方法是繼承OrmLiteBaseActivity,另外也提供了OrmLiteBaseListActivity, OrmLiteBaseService, and OrmLiteBaseTabActivity,這些類里面會自動管理OrmLiteSqliteOpenHelper.通過getHelper()則可以獲取;

4、如果不想使用官方提供的方法,那么可以在自己的Activity里面管理OrmLiteSqliteOpenHelper,一般是在onCreate()里面創建,在onDestroy()里面釋放掉;OpenHelperManager.getHelper()和releaseHelper()必須成對出現,不然可能出現意想不到的情況;

二、數據庫表配置

OrmLite提供了兩種方法配置表,一是通過注解,如果通過注解,因為OrmLite的注解是運行時的(Runtime),在反射的時候Method.equals()會消耗很多資源導致初始化數據變的很慢。因此才有了第二種方法--通過注解生成的配置文件。

1、通過注解

@DatabaseTable(tableName = "accounts")
public class Account {
    
    @DatabaseField(id = true)
    private String name;
    @DatabaseField
    private String password;
    
    public Account() {
        // ORMLite needs a no-arg constructor 
    }
    public Account(String name, String password) {
        this.name = name;
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

其中"@DatabaseTable"是配置數據表的,只有兩個屬性"tableName"(表名,默認為類名小寫)和"daoClass"(Dao管理類)。

"@DatabaseField"是配置表中的column的,屬性比較多,見官方文檔

創建數據庫表則在繼承的OrmLiteSqliteOpenHelper的onCreate()中調用如下:

public void onCreate(SQLiteDatabase database,
            ConnectionSource connectionSource) {
        try {
            TableUtils.createTableIfNotExists(connectionSource, Account.class);
        } catch (SQLException e) {
            LogFactory.e(e);
        }
    }

2、通過注解加配置文件

注解部分如上。配置文件的生成需要Java工程中繼承OrmLiteConfigUtil

public class DatabaseConfigUtil extends OrmLiteConfigUtil {
  public static void main(String[] args) throws Exception {
    writeConfigFile("ormlite_config.txt");
  }
}

默認只查找當前目錄下使用了注解的.java文件,也可以手動設置

public class DatabaseConfigUtil extends OrmLiteConfigUtil {
  private static final Class<?>[] classes = new Class[] {
    Account.class,
  };
  public static void main(String[] args) throws Exception {
    writeConfigFile("ormlite_config.txt", classes);
  }
}

然后將生產的ormlite_config.txt文件放到android工程的res-raw目錄下,實例化OrmLiteSqliteOpenHelper時則需要傳入raw資源id,

OrmLiteSqliteOpenHelper(Context context, String databaseName, CursorFactory factory, int databaseVersion,int configFileId)

那么在創建數據表的時候OrmLite框架則會讀取配置文件而不會通過注解。以上生成配置文件時可以把用到的model類放入到java工程中,然后在android工程里面依賴java工程,如此可以只保存一份modle類代碼,修改時很方便。

三、數據庫增刪改查

對數據庫表的增刪改查則通過OrmLiteSqliteOpenHelper.getDao(Class<T> clazz)獲取到不同的對象的Dao之后進行操作,具體見API文檔。OrmLiteSqliteOpenHelper里面通過DaoManager對所有的Dao進行了緩存,不必在別處保存Dao了。

1、增

//保存數據
create(T data)
//當不存在時保存數據
createIfNotExists(T data)
//保存或者更新數據
createOrUpdate(T data)

2、刪

//刪除數據
delete(T data)
//根據ID刪除數據
deleteById(ID id)
//自定義的刪除請求,通過構建DeleteBuilder<T,ID>實現復雜的刪除
deleteBuilder() 

3、改

//更新對象
update(T data)
//更新對象ID
updateId(T data, ID newId)
//返回UpdateBuilder<T,ID>實現復雜更新需求
updateBuilder()

4、查

//根據ID查詢
queryForId(ID id)
//查詢所有數據
queryForAll()
//返回QueryBuilder<T,ID>自定義復雜的查詢需求
queryBuilder()

以上DeleteBuilder, QueryBuilder, UpdateBuilder全部集成於StatementBuilder,因此得到XXBuilder之后可以通過where()設置條件,如下

QueryBuilder<Account, String> qb = accountDao.queryBuilder();
 Where where = qb.where();
 // the name field must be equal to "foo"
 where.eq(Account.NAME_FIELD_NAME, "foo");
 // and
 where.and();
 // the password field must be equal to "_secret"
 where.eq(Account.PASSWORD_FIELD_NAME, "_secret");
 PreparedQuery<Account, String> preparedQuery = qb.prepareQuery();

只是對於不同的XXBuilder需要調用不同的方法罷了,如delete()、query()、update()。更多詳情見API文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM