最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rxjava2_Flowable_Sqlite_Android數據庫訪問實例

 更新時間:2018年02月07日 09:41:43   作者:robert_cysy  
下面小編就為大家分享一篇Rxjava2_Flowable_Sqlite_Android數據庫訪問實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一、使用Rxjava訪問數據庫的優(yōu)點:

1.隨意的線程控制,數據庫操作在一個線程,返回數據處理在ui線程

2.隨時訂閱和取消訂閱,而不必再使用回調函數

3.對讀取的數據用rxjava進行過濾,流式處理

4.使用sqlbrite可以原生返回rxjava的格式,同時是響應式數據庫框架

(有數據添加和更新時自動調用之前訂閱了的讀取函數,達到有數據添加自動更新ui的效果,

同時這個特性沒有禁止的方法,只能通過取消訂閱停止這個功能,對于有的框架這反而是一種累贅)

二、接下來之關注實現過程:

本次實現用rxjava2的Flowable,有被壓支持(在不需要被壓支持的情況建議使用Observable)

實現一個穩(wěn)健的的可靈活切換其他數據庫的結構,當然是先定義數據庫訪問接口。然后跟具不同的數據庫實現接口的方法

定義接口:(對于update,delete,insert,可以選擇void類型,來簡化調用代碼,但缺少了執(zhí)行結果判斷)

public interface DbSource { 
  //String sql = "insert into table_task (tid,startts) values(tid,startts)"; 
  Flowable<Boolean> insertNewTask(int tid, int startts); 
 
  //String sql = "select * from table_task"; 
  Flowable<List<TaskItem>> getAllTask(); 
 
  //String sql = "select * from table_task where endts = 0"; 
  Flowable<Optional<TaskItem>> getRunningTask(); 
 
  //String sql = "update table_task set isuploadend=isuploadend where tid=tid"; 
  Flowable<Boolean> markUploadEnd(int tid, boolean isuploadend); 
 
  //String sql = "delete from table_task where tid=tid and endts>0"; 
  Flowable<Boolean> deleteTask(int tid); 
} 

三、用Android原生的Sqlite實現數據庫操作

public class SimpleDb implements DbSource { 
 
 private static SimpleDb sqlite; 
 private SqliteHelper sqliteHelper; 
 
 private SimpleDb(Context context) { 
  this.sqliteHelper = new SqliteHelper(context); 
 } 
 
 public static synchronized SimpleDb getInstance(Context context) { 
  if (sqlite == null ) 
   sqlite = new SimpleDb(context); 
  return sqlite; 
 } 
 
 Flowable<Boolean> insertNewTask(int tid, int startts) { 
  return Flowable.create(new FlowableOnSubscribe<Boolean>() { 
   @Override 
   public void subscribe(FlowableEmitter<Boolean> e) throws Exception { 
    //這里數據庫操作只做示例代碼,主要關注rxjava的Flowable使用方法 
    ContentValues values = new ContentValues(); 
    values.put(“tid”, 1); 
    values.put(“startts”,13233); 
    if(sqliteHelper.getWriteableDatabase().insert(TABLE_NAME, null, values) != -1) 
     e.onNext(true); 
    else 
     e.onNext(false); 
    e.onComplete(); 
   } 
  }, BackpressureStrategy.BUFFER); 
 } 
 
 Flowable<List<TaskItem>> getAllTask() { 
  return Flowable.create(new FlowableOnSubscribe<List<TaskItem>>() { 
   @Override 
   public void subscribe(FlowableEmitter<List<TaskItem>> e) throws Exception { 
 
    List<TaskItem> taskList = new ArrayList<>(); 
    StringBuilder sql = new StringBuilder(100); 
    sql.append("select * from "); 
    sql.append(SqliteHelper.TABLE_NAME_TASK); 
 
    SQLiteDatabase sqLiteDatabase = sqliteHelper.getReadableDatabase(); 
    Cursor cursor = sqLiteDatabase.rawQuery(sql.toString(), null); 
    if (cursor.moveToFirst()) { 
     int count = cursor.getCount(); 
     for (int a = 0; a < count; a ++) { 
      TaskItem item = new TaskItem(); 
      item.setTid(cursor.getInt(1)); 
      item.setStartts(cursor.getInt(2)); 
      item.setEndts(cursor.getInt(3)); 
      taskList.add(item); 
      cursor.move(1); 
     } 
    } 
    cursor.close(); 
    sqLiteDatabase.close(); 
 
    e.onNext(taskList); 
    e.onComplete(); 
   } 
  }, BackpressureStrategy.BUFFER); 
 } 
  
 Flowable<Optional<TaskItem>> getRunningTask() { 
  return Flowable.create(new FlowableOnSubscribe<Optional<TaskItem>>() { 
   @Override 
   public void subscribe(FlowableEmitter<Optional<TaskItem>> e) throws Exception { 
    TaskItem item = null; 
    StringBuilder sql = new StringBuilder(100); 
    sql.append("select * from "); 
    sql.append(SqliteHelper.TABLE_NAME_TASK); 
    sql.append(" where endts=0 limit 1"); 
    SQLiteDatabase sqLiteDatabase = sqliteHelper.getReadableDatabase(); 
    Cursor cursor = sqLiteDatabase.rawQuery(sql.toString(), null); 
    if (cursor.moveToFirst()) { 
     int count = cursor.getCount(); 
     if (count == 1) { 
      item = new TaskItem(); 
      item.setId(cursor.getInt(0)); 
      item.setTid(cursor.getInt(1)); 
      item.setStartts(cursor.getInt(2)); 
      item.setEndts(cursor.getInt(3)); 
     } 
    } 
    cursor.close(); 
    sqLiteDatabase.close(); 
 
    e.onNext(Optional.fromNullable(item)); //import com.google.common.base.Optional;//安全檢查,待會看調用的代碼,配合rxjava很好 
    e.onComplete(); 
   } 
  }, BackpressureStrategy.BUFFER); 
 } 
  
 Flowable<Boolean> markUploadEnd(int tid, boolean isuploadend) { 
   return Flowable.create(new FlowableOnSubscribe<Boolean>() { 
   @Override 
   public void subscribe(FlowableEmitter<Boolean> e) throws Exception { 
    //這里數據庫操作只做示例代碼,主要關注rxjava的Flowable使用方法 
    //數據庫操作代碼 
    e.onNext(false);//返回結果 
    e.onComplete();//返回結束 
   } 
  }, BackpressureStrategy.BUFFER); 
 } 
 
   
 Flowable<Boolean> deleteTask(int tid) { 
  return Flowable.create(new FlowableOnSubscribe<Boolean>() { 
   @Override 
   public void subscribe(FlowableEmitter<Boolean> e) throws Exception { 
    //這里數據庫操作只做示例代碼,主要關注rxjava的Flowable使用方法 
    //數據庫操作代碼 
    e.onNext(false);//返回結果 
    e.onComplete();//返回結束 
   } 
  }, BackpressureStrategy.BUFFER); 
 } 
} 

四、同一個接口使用sqlbrite的實現方式

public class BriteDb implements DbSource { 
 @NonNull 
 protected final BriteDatabase mDatabaseHelper; 
 @NonNull 
 private Function<Cursor, TaskItem> mTaskMapperFunction; 
 @NonNull 
 private Function<Cursor, PoiItem> mPoiMapperFunction; 
 @NonNull 
 private Function<Cursor, InterestPoiItem> mInterestPoiMapperFunction; 
 // Prevent direct instantiation. 
 private BriteDb(@NonNull Context context) { 
  DbHelper dbHelper = new DbHelper(context); 
  SqlBrite sqlBrite = new SqlBrite.Builder().build(); 
  mDatabaseHelper = sqlBrite.wrapDatabaseHelper(dbHelper, Schedulers.io(); 
  mTaskMapperFunction = this::getTask; 
  mPoiMapperFunction = this::getPoi; 
  mInterestPoiMapperFunction = this::getInterestPoi; 
 } 
 
 @Nullable 
 private static BriteDb INSTANCE; 
 public static BriteDb getInstance(@NonNull Context context) { 
  if (INSTANCE == null) { 
   INSTANCE = new BriteDb(context); 
  } 
  return INSTANCE; 
 } 
 
 @NonNull 
 private TaskItem getTask(@NonNull Cursor c) { 
  TaskItem item = new TaskItem(); 
  item.setId(c.getInt(c.getColumnIndexOrThrow(PersistenceContract.TaskEntry.COLUMN_TASK_ID))); 
  item.setTid(c.getInt(c.getColumnIndexOrThrow(PersistenceContract.TaskEntry.COLUMN_TASK_TID))); 
  item.setStartts(c.getInt(c.getColumnIndexOrThrow(PersistenceContract.TaskEntry.COLUMN_TASK_STARTTS))); 
  item.setEndts(c.getInt(c.getColumnIndexOrThrow(PersistenceContract.TaskEntry.COLUMN_TASK_ENDTS))); 
  return item; 
 } 
  
 @Override 
 public void insertNewTask(int tid, int startts) { 
  ContentValues values = new ContentValues(); 
  values.put(PersistenceContract.TaskEntry.COLUMN_TASK_TID, tid); 
  values.put(PersistenceContract.TaskEntry.COLUMN_TASK_STARTTS, startts); 
  mDatabaseHelper.insert(PersistenceContract.TaskEntry.TABLE_NAME_TASK, values, SQLiteDatabase.CONFLICT_REPLACE); 
 } 
 
 @Override 
 public Flowable<List<TaskItem>> getAllTask() { 
  String sql = String.format("SELECT * FROM %s", PersistenceContract.TaskEntry.TABLE_NAME_TASK);//TABLE_NAME_TASK表的名字字符串 
  return mDatabaseHelper.createQuery(PersistenceContract.TaskEntry.TABLE_NAME_TASK, sql) 
    .mapToList(mTaskMapperFunction) 
    .toFlowable(BackpressureStrategy.BUFFER); 
 } 
 
 @Override 
 public Flowable<Optional<TaskItem>> getRunningTask() { 
  String sql = String.format("SELECT * FROM %s WHERE %s = ? limit 1", 
    PersistenceContract.TaskEntry.TABLE_NAME_TASK, PersistenceContract.TaskEntry.COLUMN_TASK_ENDTS); 
  return mDatabaseHelper.createQuery(PersistenceContract.TaskEntry.TABLE_NAME_TASK, sql, "0") 
    .mapToOne(cursor -> Optional.fromNullable(mTaskMapperFunction.apply(cursor))) 
    .toFlowable(BackpressureStrategy.BUFFER); 
 } 
 
 @Override 
 public Flowable<Boolean> markUploadEnd(int tid, boolean isuploadend) { 
  return Flowable.create(new FlowableOnSubscribe<Boolean>() { 
   @Override 
   public void subscribe(FlowableEmitter<Boolean> e) throws Exception { 
     ContentValues values = new ContentValues(); 
     if(isuploadend) { 
      values.put(PersistenceContract.TaskEntry.COLUMN_TASK_ISUPLOADEND, 1); 
     } else { 
      values.put(PersistenceContract.TaskEntry.COLUMN_TASK_ISUPLOADEND, 0); 
     } 
     String selection = PersistenceContract.TaskEntry.COLUMN_TASK_TID + " = ?"; 
     //String[] selectionArgs = {String.valueOf(tid)}; 
     String selectionArgs = String.valueOf(tid); 
     int res = mDatabaseHelper.update(PersistenceContract.TaskEntry.TABLE_NAME_TASK, values, selection, selectionArgs); 
     if (res > 0) { 
      e.onNext(true);//返回結果 
     } else { 
       e.onNext(false);//返回結果 
     } 
     e.onComplete();//返回結束 
   } 
  }, BackpressureStrategy.BUFFER); 
 } 
 
 @Override 
 public Flowable<Boolean> deleteTask(int tid) { 
  return Flowable.create(new FlowableOnSubscribe<Boolean>() { 
   @Override 
   public void subscribe(FlowableEmitter<Boolean> e) throws Exception { 
     String selection = PersistenceContract.TaskEntry.COLUMN_TASK_TID + " = ? AND "+ 
             PersistenceContract.TaskEntry.COLUMN_TASK_ENDTS + " > 0"; 
     String[] selectionArgs = new String[1]; 
     selectionArgs[0] = String.valueOf(tid); 
     int res = mDatabaseHelper.delete(PersistenceContract.TaskEntry.TABLE_NAME_TASK, selection, selectionArgs); 
     if (res > 0) { 
      e.onNext(true);//返回結果 
     } else { 
       e.onNext(false);//返回結果 
     } 
     e.onComplete();//返回結束 
   } 
  }, BackpressureStrategy.BUFFER); 
 } 
} 

五、數據庫調用使用方法

使用了lambda簡化了表達式進一步簡化代碼:

簡化方法:在/app/build.gradle里面加入如下內容:(defaultConfig的外面)

compileOptions { 
 sourceCompatibility JavaVersion.VERSION_1_8 
 targetCompatibility JavaVersion.VERSION_1_8 
} 

接口調用(獲得數據庫實例):

//全局定義的實例獲取類,以后想要換數據庫,只需在這個類里切換即可 
public class Injection { 
 public static DbSource getDbSource(Context context) { 
  //choose one of them 
  //return BriteDb.getInstance(context); 
  return SimpleDb.getInstance(context); 
 } 
} 
 
DbSource db = Injection.getInstance(mContext); 
 
disposable1 = db.getAllTask() 
       .flatMap(Flowable::fromIterable) 
       .filter(task -> {     //自定義過濾 
         if (!task.getIsuploadend()) { 
          return true; 
         } else { 
          return false; 
         } 
       }) 
       .subscribe(taskItems -> //這里是使用了lambda簡化了表達式 
        doTaskProcess(taskItems) 
       , throwable -> { 
        throwable.printStackTrace(); 
       },// onCompleted 
       () -> { 
        if (disposable1 != null && !disposable1.isDisposed()) { 
         disposable1.dispose(); 
        } 
       }); 
 
 disposable1 = db.getRunningTask() 
    .filter(Optional::isPresent) //判斷是否為空,為空的就跳過 
    .map(Optional::get)    //獲取到真的參數 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(taskItem -> {     //onNext() 
       //has running task 
       mTid = taskItem.getTid(); 
    }, throwable -> throwable.printStackTrace() //onError() 
    , () -> disposable1.dispose());    //onComplete() 
 
disposable1 = db.markUploadEnd(tid, isuploadend) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> {     //onNext() 
       if (status) { 
        //dosomething 
       } 
    }, throwable -> throwable.printStackTrace() //onError() 
    , () -> disposable1.dispose());    //onComplete() 
 
disposable1 = db.deleteTask(tid) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> {     //onNext() 
       if (status) { 
        //dosomething 
       } 
    }, throwable -> throwable.printStackTrace() //onError() 
    , () -> disposable1.dispose());    //onComplete() 

以上這篇Rxjava2_Flowable_Sqlite_Android數據庫訪問實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Android中viewPager使用指南

    Android中viewPager使用指南

    這是谷歌官方給我們提供的一個兼容低版本安卓設備的軟件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我們可以做很多事情,從最簡單的導航,到頁面菜單等等。那如何使用它呢
    2016-01-01
  • Android耳機插拔檢測(framework篇)原理解析

    Android耳機插拔檢測(framework篇)原理解析

    文章詳細介紹了Android系統中音頻設備插拔事件的處理流程,包括事件的獲取、處理和上報,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Flutter實現紅包動畫效果的示例代碼

    Flutter實現紅包動畫效果的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Flutter實現紅包的動畫效果,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • Android編程設置TextView顏色setTextColor用法實例

    Android編程設置TextView顏色setTextColor用法實例

    這篇文章主要介紹了Android編程設置TextView顏色setTextColor用法,結合實例形式分析了Android設置TextView顏色setTextColor、ColorStateList等方法的使用技巧與布局文件的設置方法,需要的朋友可以參考下
    2016-01-01
  • android實現注冊登錄程序

    android實現注冊登錄程序

    這篇文章主要為大家詳細介紹了android實現注冊登錄程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android 給空白包簽名并上傳審核

    Android 給空白包簽名并上傳審核

    之前公司app在騰訊開放平臺認領應用時,涉及了一個問題:就是給空白包簽名。然后再上傳上去審核,通過本文給大家介紹android 給空白包簽名并上傳審核,對android空白包簽名相關知識感興趣的朋友一起學習吧
    2016-01-01
  • Android開發(fā)設置RadioButton點擊效果的方法

    Android開發(fā)設置RadioButton點擊效果的方法

    這篇文章主要介紹了Android開發(fā)設置RadioButton點擊效果的方法,詳細分析了Android開發(fā)中RadioButton屬性功能及相關設置技巧,需要的朋友可以參考下
    2017-06-06
  • Android自定義View實現QQ消息氣泡

    Android自定義View實現QQ消息氣泡

    這篇文章主要為大家詳細介紹了Android自定義View實現QQ消息氣泡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 正確在Flutter中添加webview實現詳解

    正確在Flutter中添加webview實現詳解

    這篇文章主要為大家介紹了正確在Flutter中添加webview實現詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android 物理游戲之重力系統開發(fā)示例代碼

    Android 物理游戲之重力系統開發(fā)示例代碼

    介紹Android 物理游戲之重力系統,這里提供了詳細的資料整理,并附示例代碼和實現效果圖,有興趣的小伙伴可以參考下
    2016-08-08

最新評論

德化县| 额尔古纳市| 雅安市| 山东省| 尉犁县| 府谷县| 东台市| 准格尔旗| 顺平县| 光泽县| 新余市| 嘉祥县| 宁乡县| 平江县| 西丰县| 天气| 广灵县| 安陆市| 海南省| 荥经县| 霞浦县| 泰来县| 伊宁县| 屯门区| 会泽县| 通许县| 北海市| 永兴县| 栖霞市| 修文县| 基隆市| 额济纳旗| 信宜市| 卫辉市| 定西市| 扶绥县| 酉阳| 平昌县| 温泉县| 延边| 饶平县|