Android之xUtils-3.0數據庫框架詳解

在Android 開發中,數據庫模塊是必不可少的.如今也有許多很是好用流行的數據庫快速開發框架.今天主要介紹下xUtils下封裝的數據庫模塊.

Android 經常使用數據庫開發框架

在這裏列一下Android開發中經常使用的數據庫框架,有情趣的能夠自行了解下,順便儲備點知識.java

1.OrmLite
對象關係映射Lite(ORM Lite)提供了一些簡單,輕量級的功能,用於將Java對象持久保存到SQL數據庫,同時避免了更多標準ORM包的複雜性和開銷。android

2.LitePal
LitePal是一個開源的Android庫,容許開發人員很是容易地使用SQLite數據庫。您能夠完成大部分數據庫操做,而無需編寫SQL語句,包括建立或升級表,crud操做,聚合函數等.LitePal的設置也很是簡單,您能夠在不到5分鐘中將其集成到項目中。git

3.GreenDao
greenDAO是一款輕巧快捷的Android版ORM,可將對象映射到SQLite數據庫。greenDAO針對Android進行了高度優化,性能卓越,佔用內存極少。github

4.DBFlow
一個功能強大,功能強大且很是簡單的ORM android數據庫庫,帶有註釋處理功能。
該庫創建在速度,性能和可接近性的基礎之上。它不只消除了大多數用於處理數據庫的樣板代碼,並且還提供了一個強大而簡單的API來管理交互。數據庫

5.Realm
Realm是一個直接在手機,平板電腦或可穿戴設備中運行的移動數據庫。此存儲庫包含Realm的Java版本的源代碼,該版本目前僅在Android上運行。segmentfault


xutils3.0數據庫模塊詳解

項目加載

1.添加依賴
在app的build.gradle下添加如下依賴:api

compile 'org.xutils:xutils:3.5.0'

對於gradle3.0以上,compile已經被廢棄了,須要使用api
以下:app

api 'org.xutils:xutils:3.5.0'

2.配置權限
在AndroidManifest中添加權限:框架

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

3.初始化
在application的onCreate中初始化:ide

@Override
public void onCreate() {
    super.onCreate();
    x.Ext.init(this);
    x.Ext.setDebug(BuildConfig.DEBUG); // 是否輸出debug日誌, 開啓debug會影響性能.
    ...
}
以上就是xutils3.0的使用配置了,配置好而且初始化好下面咱們就能夠愉快的使用了

xutils-DB使用

1.建立數據庫幫助類:DatabaseOpenHelper

/**
 * 數據庫幫助類
 * Created by darryrzhong on 2018/9/23.
 */

public class DatabaseOpenHelper {
  private DbManager.DaoConfig daoConfig;
  private static DbManager dbManager;
  private final String DB_NAME="history.db";//數據庫名
  private final int VERSION = 1;


  private DatabaseOpenHelper(){
      //初始化數據庫配置信息
      daoConfig = new DbManager.DaoConfig()
              .setDbName(DB_NAME)//設置數據庫名稱
              .setDbVersion(VERSION)//設置初始版本號
              .setDbOpenListener(new DbManager.DbOpenListener() {//監聽數據庫打開
                  @Override
                  public void onDbOpened(DbManager db) {
                     db.getDatabase().enableWriteAheadLogging();
                      //開啓WAL, 對寫入加速提高巨大(做者原話)
                  }
              })
              .setDbUpgradeListener(new DbManager.DbUpgradeListener() {//監聽數據庫更新
                  @Override
                  public void onUpgrade(DbManager db, int oldVersion, int newVersion) {

                  }
              });
      dbManager= x.getDb(daoConfig);//獲取數據庫管理類
  }

  //單例設計
  public static DbManager getInstance(){
     if (dbManager==null){
         DatabaseOpenHelper databaseOpenHelper = new DatabaseOpenHelper();
     }
     return dbManager;
  }
}

2.建立JavaBean數據實體類
先介紹下註解字段意思:

注意必須添加註解字段,不然數據庫沒法識別,且實體類必需要有無參構造,不然數據庫可能建立不成功
@Table(name = "details") 表名

 @Column(name = "userid") 字段名

實體類以下:

/**
 * 歷史記錄詳情表
 * Created by darryrzhong on 2018/7/23.
 */


@Table(name = "details")//表名即實體類名
public class HistoryDetails {
    @Column(name = "id",isId = true,autoGen = true)//主鍵,自增
    private int id;
    @Column(name = "userid")
    private String userid;
    @Column(name = "photo")
    private String photo;//視頻封面
    @Column(name = "title")
    private String title;//視頻標題
    @Column( name = "detail")
    private String detail;//視頻分類and時長
    @Column(name = "date")
    private String date;//觀看日期
    @Column(name = "desc")
    private String desc;//視頻詳情
    @Column(name = "blurred")
    private String blurred;//模糊圖片
    @Column(name = "video")
    private String video;//視頻播放地址
    @Column(name = "collect")
    private int collect;//收藏量
    @Column(name = "share")
    private int share;//分享量
    @Column(name = "reply")
    private int reply;//回覆量

    /**
     * 無參數構造法不可私有化,不然數據庫表格建立異常
     * 若使用無參構造,容易引發數據插入只有一條。
     */
    public HistoryDetails(){

    }


    /**
    *
    * @param photo 視頻封面
    * @param title 視頻標題
    * @param detail 視頻分類And時間
     *@param date 觀看日期
    * @param desc 視頻詳情
    *@param blurred 迷糊圖片
    * @param video 視頻播放地址
    * @param collect 收藏量
    * @param share 分享量
    * @param reply 回覆量
    * */

    public HistoryDetails(String photo, String title, String detail, String date, String desc, String blurred, String video, int collect, int share, int reply,String userid) {
        this.photo = photo;
        this.title = title;
        this.detail = detail;
        this.date = date;
        this.desc = desc;
        this.blurred = blurred;
        this.video = video;
        this.collect = collect;
        this.share = share;
        this.reply = reply;
        this.userid = userid;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getBlurred() {
        return blurred;
    }

    public void setBlurred(String blurred) {
        this.blurred = blurred;
    }

    public String getVideo() {
        return video;
    }

    public void setVideo(String video) {
        this.video = video;
    }

    public int getCollect() {
        return collect;
    }

    public void setCollect(int collect) {
        this.collect = collect;
    }

    public int getShare() {
        return share;
    }

    public void setShare(int share) {
        this.share = share;
    }

    public int getReply() {
        return reply;
    }

    public void setReply(int reply) {
        this.reply = reply;
    }

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }
}

3.建立數據操做類

public class HistoryDB {

    private DbManager dbManager;
    private boolean succeed;//操做是否成功
    boolean idDesc = true;//是否倒序,默認false
    private List<HistoryDetails>  details =null;
    private HistoryDetails historyDetails;
    long count=0;

    //初始化的DbManager對象
    public HistoryDB(){
        dbManager=DatabaseOpenHelper.getInstance();
    }

    /**
     * 將HistoryDetails實例存進數據庫
     * 保存新增
     * @param historyDetails
     *
     */

    public void saveHistory(HistoryDetails historyDetails){

        try {
            dbManager.save(historyDetails);
        } catch (DbException e) {
            e.printStackTrace();
        }
    }

    /**
     * 新增或更新
     *
     * @param historyDetails
     */

    public void saveOrUpdate(HistoryDetails historyDetails){
        try {
            dbManager.saveOrUpdate(historyDetails);
           // Log.e("log","save succeed!");
        } catch (DbException e) {
            e.printStackTrace();
        }
    }

    /**
     * 讀取全部HistoryDetails信息
     *
     * @return
     */
  public List<HistoryDetails> loadHistoryAll(){
      try {
          details=dbManager.selector(HistoryDetails.class).findAll();
      } catch (DbException e) {
          e.printStackTrace();
      }
      return details;
  }

    /**
     * 根據視頻標題讀取HistoryDetails信息
     *
     * @return
     */

    public List<HistoryDetails> loadHistoryByTitle(String title){
        try {
            details=dbManager.selector(HistoryDetails.class).where("title","==",title).findAll();
        } catch (DbException e) {
            e.printStackTrace();
        }
        return details;
    }

    /**
     * 根據用戶id讀取HistoryDetails信息
     *
     * @return
     */

    public List<HistoryDetails> loadHistoryByUserId(String userid){
        try {
            details=dbManager.selector(HistoryDetails.class).where("userid","==",userid).findAll();
        } catch (DbException e) {
            e.printStackTrace();
        }
        return details;
    }




    /**
     * 刪除對象數據
     *
     *
     * @return
     */
    public boolean delete(HistoryDetails historyDetails){
        try {
            dbManager.delete(historyDetails);
            succeed=true;
        } catch (DbException e) {
            succeed=false;
            e.printStackTrace();
        }
        return succeed;
    }


    /**
     * 刪除表
     *
     * @throws DbException
     */

    private void delTable() throws  DbException{
        dbManager.dropTable(HistoryDetails.class);

    }

    //關閉數據庫
    public void close(){
        try {
            dbManager.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

4.使用數據庫

建立以上操做類,就能夠愉快的快速使用數據庫了.

值得注意的是,xutils3並無提供單首創建一張表的方法,他是在你調插入數據庫操做的時候會判斷是否存在這張表,若是不存在就會去建立,因此咱們在取數據的時候須要判斷表是否存在

db = new HistoryDB();
        details= db.loadHistoryByUserId(sharedPreferences.getString("userId","000"));
       if (details==null||details.size()==0){//若是表爲空的話則爲null,
           tvHint.setVisibility(View.VISIBLE);
           compile.setVisibility(View.GONE);
           cleanHint.setVisibility(View.GONE);
       }

還有一點值得注意就是,xutils插入數據庫時,相同數據是會重複插入的,
因此咱們能夠按自身需求去解決,例如我這裏保存視頻觀看記錄不須要重複插入數據.
因此我根據id判斷數據是否存在,不存在則插入數據庫保存:

List<HistoryDetails> temp = hdb.loadHistoryByTitle(title);//同步默認帳戶觀看記錄
                   if (temp==null){
                       hdb.saveOrUpdate(historyDetails);//判斷表是否存在
                   }else if (temp.size()==0){
                       hdb.saveOrUpdate(historyDetails);//判斷數據是否存在
                   }
xutils使用就這麼簡單的完成了數據庫的編寫,使用起來步驟簡單明瞭,固然還有不少缺憾,因此數據庫模塊比較繁重的話仍是推薦以上介紹的幾種開發框架.

歡迎關注做者darryrzhong,更多幹貨等你來拿喲.

請賞個小紅心!由於你的鼓勵是我寫做的最大動力!

更多精彩文章請關注
相關文章
相關標籤/搜索