編輯:關於Android編程
OrmLite是一個數據庫操作輔助的開源框架,主要面向Java語言。在Android面向數據庫開發中,是一個比較流行的開源框架,方便操作而且功能強大,今天來學習一下,最近的項目中也有所涉及,寫個博客來記一下吧,感謝大神團隊貢獻如此實用的開源框架,
ORMlite通過Java注解的方式來建立起與數據庫的映射關系,在這裡我們以一個實例來進行說明,如我們現在想要建立一個簡單的數據庫test.db並創建一張表person來記錄一個人的名字,年齡,住址等等。
首先,建立我們的Bean類Person,並通過注解的方式與數據庫聯系起來
@DatabaseTable(tableName = person)
public class Person {
@DatabaseField(generatedId=true)
private int id;
@DatabaseField(columnName=name)
private String name;
@DatabaseField(columnName=age)
private int age;
@DatabaseField(columnName=address)
private String address;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the address
*/
public String getAddress() {
return address;
}
/**
* @param address the address to set
*/
public void setAddress(String address) {
this.address = address;
}
}
在這裡我們創建了Bean類,並與數據庫建立了聯系,有兩件事是我們需要做的
1.需要在@DatabaseTable注解中填入表名
2.在@DatabaseField(columnName=”“)填入字段名,設置字段的屬性等等
ORMLite為我們提供了全面的字段屬性的支持,下面我們來具體看一下吧:
cloumnName:指定字段名,不指定則變量名作為字段名 canBeNull:是否可以為null dataType:指定字段的類型 foreign 指定這個字段的對象是一個外鍵,外鍵值是這個對象的id foreignAutoCreate 外鍵不存在時是否自動添加到外間表中 foreignAutoRefresh 外鍵值,自動刷新 foreignColumnName外鍵字段指定的外鍵表中的哪個字段 generatedId:指定字段為自增長的id,不能id,generatedIdSequence通用 id:指定字段為id index:索引 persisted:指定是否持久化此變量,默認true throwIfNull,如果空值拋出異常 useGetSet:指定ormlite訪問變量使用set,get方法默認使用的是反射機制直接訪問變量 unique:字段值唯一 uniqueIndex 唯一索引 uniqueCombo整列的值唯一與Android中的數據庫創建相似,使用OrmLite創建數據庫需要我們創建一個SqlOpenHelper繼承OrmLiteSqliteOpenHelper,在OrmLiteSqliteOpenHelper也有兩個重要方法,分別是onCreate和onUpgrade,負責數據庫創建以及升級時的操作
public class MySqlOpenHelper extends OrmLiteSqliteOpenHelper {
private Dao mPersonDao;
public MySqlOpenHelper(Context context) {
super(context, test, null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
// TODO Auto-generated method stub
try {
//創建數據表
TableUtils.createTableIfNotExists(arg1, Person.class);
} catch (java.sql.SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
public Dao getPersonDao() throws java.sql.SQLException {
if (mPersonDao == null) {
mPersonDao = getDao(Person.class);
}
return mPersonDao;
}
}
Dao是一個很重要的類, 這些Dao對象用於以後的數據庫操作,其包含兩個泛型,第一個泛型表DAO操作的類,第二個是標記數據表的ID。
創建了我們自己的數據庫之後就可以來,對數據庫操作了,接下來我們看看如何進行數據庫的增刪查改
這些方法使用起來都比較簡單,我們只需將自己的Bean傳入到下列方法中即可
create:插入一條數據 createIfNotExists:如果不存在則插入 createOrUpdate:如果存在則更新OrmLite為我提供了一系列的查詢操作,方法很多,而且很多都是只看方法名就可以知道的,這裡就不逐一介紹了,在這裡介紹一下如何使用QueryBuilder進行復雜查找。
首先調用personDao.queryBuilder();獲得該Dao下的QueryBuilder對象, 接下來設置QueryBuilder的查詢條件, 最後通過QueryBuilder的query方法獲得List對象,下面介紹幾個常用的builder下的查詢,
1.多字段條件查詢:
QueryBuilder builder = dao.queryBuilder();
builder.where().eq(字段名1,條件1).and.eq(字段名2,條件2);
builder.query();
2.查詢並按順序輸出
QueryBuilder builder = dao.queryBuilder();
builder.orderBy(字段名, true);
builder.query();
orderBy的方法第一參數表示按那個字段進行排序,第二個參數表示是否為升序。
3.分頁查詢
QueryBuilder builder = dao.queryBuilder();
builder.offset(10);//表示查詢的起始位置
builder.limit(10);//表示總共獲取的對象數量
builder.query();
與查詢操作類似,ORMLite同樣為我們提供了一系列的方法,同時也提供了復雜刪除,復雜更改的DeleteBuilder和UpdateBuilder,其用法與QueryBuilder相似,就不詳細介紹了。
Android創建數據庫默認的存儲路徑是在/data/data/packagename/database 目錄之下,一方面如果數據庫龐大將占用系統存儲空間,另一方面如果沒有獲得系統ROOT權限,將不能直觀的看到該數據庫。所以在最後介紹一下如何將數據庫建立在指定的SD卡目錄之下。
這個在ORMLite中並沒有提供,自己來動手寫一寫吧。閱讀一下Android的源碼可以很容易發現,Android數據庫存放的目錄是由ContextWrapper類下的public File getDatabasePath(String name)方法決定的,那麼我們只需創建自己的Context覆蓋該方法即可。
public class DatabaseContext extends ContextWrapper {
private static final String ROOT_SDCARD = Environment
.getExternalStorageDirectory().getAbsolutePath();
private String dbDir;
public DatabaseContext(Context base, String path) {
super(base);
dbDir = path;
}
@Override
public File getDatabasePath(String name) {
// 判斷是否存在sd卡
boolean sdExist = android.os.Environment.MEDIA_MOUNTED
.equals(android.os.Environment.getExternalStorageState());
if (!sdExist) {// 如果不存在,
Log.e(Database error, SD卡不存在);
return null;
}
// 判斷目錄是否存在,不存在則創建該目錄
File dirFile = new File(dbDir);
if (!dirFile.exists())
dirFile.mkdirs();
// 標記數據庫文件是否創建成功
boolean isFileCreateSuccess = false;
String dbPath = dbDir + / + name;// 數據庫路徑
File dbFile = new File(dbPath);
// 如果數據庫文件不存在則創建該文件
if (!dbFile.exists()) {
try {
isFileCreateSuccess = dbFile.createNewFile();// 創建文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
isFileCreateSuccess = true;
// 返回數據庫文件對象
if (isFileCreateSuccess)
return dbFile;
else
return null;
}
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
SQLiteDatabase.CursorFactory factory) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
getDatabasePath(name), null);
return result;
}
/**
* Android 4.0會調用此方法獲取數據庫。
*
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
CursorFactory factory, DatabaseErrorHandler errorHandler) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
getDatabasePath(name), null);
return result;
}
}
之後我們在創建SQLOpenHelper時,只需傳入我們自己的DatabaseContext 即可,如
SdCardDBHelper dbHelper = new SdCardDBHelper(new DatabaseContext(
MainActivity.this, path), person.db);
關鍵點 canvas.drawBitmap(bitmap, srcRect, dstRect, null); 將bitmap的srcRect區域繪制到canva
1.申請微信APPID要實現分享到微信的功能,首先要到微信開放平台申請一個APPID。但在申請APPID的時候需要填寫一個應用簽名和應用包名。需要注意的是包名
當我們在手機上安裝360安全衛士時,手機屏幕上時刻都會出現一個小浮動窗口,點擊該浮動窗口可跳轉到安全衛士的操作界面,而且該浮動窗口不受其他activity的覆蓋影響仍然可
(1)首先實現AutoCompleteTextView功能所需要的適配器數據源共有兩種方法,一種結果是手工配置的,另一匯總是通過xml文件制定的數據(當然也