在Android 開發中,數據庫模塊是必不可少的.如今也有許多很是好用流行的數據庫快速開發框架.今天主要介紹下xUtils下封裝的數據庫模塊.
在這裏列一下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
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的使用配置了,配置好而且初始化好下面咱們就能夠愉快的使用了
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,更多幹貨等你來拿喲.
更多精彩文章請關注