事實上,我想寫數據庫的動機已很久了,在之前寫了1個答題系統的小項目那只是初步的帶了1下數據庫,數據庫是比較強大的,不是我們3言兩語就可以解決的,我1直想抽個時間自己再過1遍Sqlite和JDBC的,但是,大家也知道,雜事比較多,我們來講1下數據庫的框架吧,事實上市面上,我覺得還可以的數據庫框架有兩個,ORMLite和GreenDao,我之前做的運動類的利用上,就需要存儲大量的運動數據,我們最開始是在本地寫數據庫的,那也是比較老的邏輯了,后來我們準備重構項目的時候,我決定把數據庫也重構1下,由于我們當時的利用讀取速度來還是比較慢的,比如你有1兩年的數據之類的,我后來就研究了1下這兩個框架,雖然我最后采取的是GreenDao,但是ORMLite也是研究了1會兒,所以,接下來,我將把這兩個框架分兩篇文章來分析,首先就是ORMLite了,網上還是有很多關于他們的文章的,所以我也是準備站在偉人的肩膀上,首先他們之間的優缺點,也有先輩寫了,你可以參考1下
而且鴻洋老師也寫了兩篇關于ORMLite的文章
但是就算他們寫了,我覺得我再根據自己的邏輯去講1遍,很多人還是會收益的,我自信我的文筆應當還是算不錯的,而且我是基于Android studio來說的。嘻嘻,話不多說,我們來新建1個項目:
在之前,我們寫數據庫時怎樣寫的?那就是頻繁的去寫SQLiteOpenHelper了,所以后來在我們開發中,很多人就喜歡封裝他們,提高性能,也就出現了很多的數據庫框架,ORMLite算是1個佼佼者了
我們根據官方文檔來看這個框架是怎樣樣集成的,官網上有共有4個步驟
知道他需要兩個jar,1個android的,1個core的可以直接去下載
然后添加到libs目錄下,然后右鍵——Add As Library就算是添加成功了,緊接著,我們在xml中寫個按鈕用來創建表和保存數據
<Button
android:id="@+id/btn_create_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="創建表 | 保存數據" />
OK,我們繼續看文檔,他需要編寫1個bean類來聲明1些表明和字段的
既然如此,那我們就創建好了,這個類可不簡單,它主要通過注解去注明表單信息,然后映照給全部數據庫,我們看
package com.lgl.ormlite;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
/**
* bean類,對應的全部數據庫的表單信息,幫助我們映照到全部數據庫當中
* Created by LGL on 2016/6/26.
*/
//配置表名
@DatabaseTable(tableName = "user_info")
public class User {
//配置主鍵 id
@DatabaseField(generatedId = true)
private int id;
//名稱
@DatabaseField(columnName = "name")
private String name;
//描寫
@DatabaseField(columnName = "desc")
private String desc;
//空構造
public User(){
}
//構造方法
public User(int id, String name, String desc) {
this.id = id;
this.name = name;
this.desc = desc;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
寫起來還是邏輯性很強的,如果需要1些特別的參數的話,可以參考1下官網上的項目描寫,首先在User類上添加@DatabaseTable(tableName = “user_info”),標明這是數據庫中的1張表名字為user_info,然后分別在屬性上添加@DatabaseField(columnName = “name”) ,columnName的值為該字段在數據中的列名,@DatabaseField(generatedId = true) ,generatedId 表示id為主鍵且自動生成,好了,到這里,我們繼續看官方的文檔了
官網寫的很詳細呀,我們隨著造輪子既可呀,嘿嘿,那我們就來寫這個Dao類吧,注意,注釋寫的很清楚了哦!
package com.lgl.ormlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* Dao類
* Created by LGL on 2016/6/26.
*/
public class DataBaseHelper extends OrmLiteSqliteOpenHelper {
//創建數據庫名稱
private static final String DATABASE_NAME = "ormlite_sql.db";
//版本號
private static final int DATABASE_VERSION = 1;
//寄存Dao
private Map<String, Dao> maps = new HashMap<>();
//單例模式
private static DataBaseHelper instance;
public static synchronized DataBaseHelper getInstance(Context context) {
if (instance == null) {
synchronized (DataBaseHelper.class) {
if (instance == null) {
instance = new DataBaseHelper(context);
}
}
}
return instance;
}
/**
* 取得數據庫的訪問對象
*
* @param cls
* @return
* @throws SQLException
*/
public synchronized Dao getDao(Class cls) throws SQLException {
Dao dao = null;
//通過反射取得類的名稱
String clsName = cls.getSimpleName();
//是不是存在該對象
if (maps.containsKey(clsName)) {
dao = maps.get(clsName);
} else {
dao = super.getDao(cls);
maps.put(clsName, dao);
}
return dao;
}
/**
* 關閉所有操作
*/
public void close() {
super.close();
//獲得所有的map鍵值對置空
for (String key : maps.keySet()) {
Dao dao = maps.get(key);
dao = null;
}
}
//構造方法
public DataBaseHelper(Context context) {
//上下文,數據庫名,null,版本號
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//創建數據庫
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
try {
//對數據庫的創建和表的建立
TableUtils.clearTable(connectionSource, User.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
//更新數據庫
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
try {
//調用更新就刪除數據庫
TableUtils.dropTable(connectionSource, User.class, true);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
到這里,我們的前期都OK了,緊接著,我們就能夠去操作這些數據了
這個類主要是對數據的初始化和操作的
package com.lgl.ormlite;
import android.content.Context;
import com.j256.ormlite.dao.Dao;
import java.sql.SQLException;
/**
* 數據庫操作類
* Created by LGL on 2016/6/26.
*/
public class UserDao {
//上下文
private Context mContext;
//主鍵查詢
private Dao<User,Integer>userDao;
//Dao類
private DataBaseHelper helper;
public UserDao(Context mContext) {
this.mContext = mContext;
//創建數據庫
helper = DataBaseHelper.getInstance(mContext);
try {
//操作Dao
userDao = helper.getDao(User.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void addUser(User user){
try {
userDao.create(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
OK,基本上現在可以去實際的操作了,這個UserDao類我們等下還需要去完善,現在先這樣,我們去實現按鈕的點擊事件
//點擊事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_create_save:
userDao = new UserDao(this);
User user = new User();
user.setName("lgl");
user.setDesc("Android");
userDao.addUser(user);
break;
}
}
到這里,我們就能夠去操作了,我們去看數據庫,打開DDMS
固然,你也能夠打開看看
既然插入成功了,那我們嘗試1下多條語句的插入吧
case R.id.btn_create_save:
User user = new User();
user.setName("lgl");
user.setDesc("Android");
userDao.addUser(user);
User user1 = new User();
user.setName("zhangsan");
user.setDesc("IOS");
userDao.addUser(user1);
User user2 = new User();
user.setName("lisi");
user.setDesc("python");
userDao.addUser(user2);
break;
OK,運行1下
我們繼續操作UserDao這個類
//更新User
public void updateUser(User user) {
try {
userDao.update(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
既然可以更新,那我們寫個按鈕
<Button
android:id="@+id/btn_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改數據" />
寫完以后,我們就能夠履行了
case R.id.btn_update:
//我們可以修改id為1的這個數據
User user3 = new User();
user3.setId(1);
user3.setName("lgl帥哥");
userDao.updateUser(user3);
break;
我們可以看下結果
OK,這就是我們的改了,我們可以封裝1下
/**
* 根據ID來更新
* @param user
* @param id
*/
public void updateById(User user,Integer id){
try {
userDao.updateId(user,id);
} catch (SQLException e) {
e.printStackTrace();
}
}
還有1個修改方法
/**
* 修改數據,支持多條
*
* @param user
*/
public void updateUserByBuilder(User user) {
try {
UpdateBuilder builder = userDao.updateBuilder();
builder.updateColumnValue("name", user.getName()).where().eq("id", 1);
builder.update();
} catch (SQLException e) {
e.printStackTrace();
}
}
刪除我們可以根據條件刪除,就直接貼代碼了
/**
* 刪除
*
* @param user
*/
public void deleteUser(User user) {
//刪除的方法比較多,根據的條件也比較多
try {
userDao.delete(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 多個對象的刪除操作
*
* @param users
*/
public void deleteMulUser(List<User> users) {
try {
userDao.delete(users);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 根據ID刪除
*
* @param ids
*/
public void deleteUserById(List<Integer> ids) {
try {
userDao.deleteIds(ids);
} catch (SQLException e) {
e.printStackTrace();
}
}
你要刪除直接調用就行了
查算是比較多的場景了,我們也能夠多條件查詢,看我們全部查詢的例子
/**
* 全部查詢
*
* @return
*/
public List<User> listAll() {
try {
return userDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
但是我們1般也不會用到全部查詢,條件查詢才是必須的,所以我們再新建1個按鈕
<Button
android:id="@+id/btn_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查詢數據" />
OK.我們就能夠查詢了,我們寫個單表查詢
/**
* 查詢單張表
*
* @return
*/
public List<User> queryBuilder() {
List<User> list = null;
//查詢器
QueryBuilder<User, Integer> queryBuilder = userDao.queryBuilder();
//聲明where條件
Where<User, Integer> where = queryBuilder.where();
//查詢sesc字段的name是哪一個值
try {
where.eq("name", "lgl");
where.and();
where.eq("desc", "Android");
where.prepare();
list = queryBuilder.query();
//select * from user_info where name = 'lgl' and desc = 'Android'
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
注意在點擊事件里
case R.id.btn_query:
List<User> list = userDao.queryBuilder();
Log.i(TAG, list.toString());
break;
好的,我們現在看Log
我們多條件查詢
/**
* 多條件查詢
*
* @return
*/
public List<User> queryBuilders() {
List<User> list = null;
QueryBuilder<User, Integer> queryBuilder = userDao.queryBuilder();
Where<User, Integer> where = queryBuilder.where();
try {
where.or(where.and(where.eq("", ""), where.eq("", "")), where.and(where.eq("", ""), where.ge("", ""))).query();
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
這里我們就不演示了
最后,只能說,ORMLite是比較強大的,我們如果真的要去理解他的話,還是得去看他的API文檔,不然真的無從下手,我這篇博文也只是希望大家能對ORMLite有個大概的了解,不敢妄自說精通,好的,本篇博客到這里也就結束了,如果大家覺得還不錯的話,無妨點個贊!