最近博主把一個之前用原生數據庫寫的單詞APP中數據庫部分改爲了room,在這個過程當中踩了不少坑
坑大概爲兩點web
- 使用room增刪改查的一些語句
- 導入外部數據庫並對其表格內容進行增刪改查
在項目最後是所有重構成功了,可是在處理外部數據庫時遇到的坑比較多,一時間沒整理出來(整理了一個demo,可是沒整理完),因此這篇文章解決room增刪改查的一些經常使用語句。數據庫
若是項目吃急,遇到外部數據庫的一些問題,可經過公衆號:計蒙不吃魚 聯繫博主app
相信看這篇文章的人應該都有room的使用基礎了,因此直接上菜(如下圖表格爲例)。
如上圖:表名爲forgetide
- 單詞名稱:wordname
- 單詞等級:wordclass
- 單詞時間:wordtime
插入數據(增):svg
//Forget爲表的實體類 @Insert void insertWords(Forget... forgets);
刪除數據(刪):ui
//1.刪除數據,根據主鍵來刪除數據的!!! @Delete void deleteWords(Forget... forgets); //2.根據單詞名稱刪除表中數據(單個) @Query("DELETE FROM FORGET where wordname=:name") void deleteWords(String name); //3.根據單詞名稱,單詞等級刪除表中數據(多個) @Query("DELETE FROM FORGET where wordname=:name and wordclass=:wordclass") void deleteWords(String name,String wordclass);
更新數據(改):this
//更新數據 @Update void updateWords(Forget... forgets); //根據單詞名稱修改單詞等級 @Query("UPDATE FORGET SET wordclass= :wordclasss WHERE wordname = :wordname") void updateWords(String wordname,String wordclasss);
查詢數據(查):spa
//查詢所有數據 @Query(" SELECT * FROM FORGET ORDER BY rowid DESC") LiveData<List<Forget>> getAllForgetLive(); //查詢某項的所有數據 @Query(" SELECT wordname FROM FORGET") LiveData<List<Forget>> getAllForgetLive(); //查詢表中某單詞是否存在 存在返回值爲1,不存在返回值爲0. @Query("select 1 from forget where wordname =:wordname limit 1") int forgetWordisExist(String wordname); //部分查詢 大多用於分頁加載 @Query(" SELECT wordname,wordclass,wordtime FROM FORGET limit :start,:end") LiveData<List<Forget>> getHarfWordsLive(int start,int end); //根據單詞名稱獲得此行的所有信息 @Query("SELECT * FROM FORGET WHERE wordname= :name") Forget getForgetByName(String name);
Forget實體類以下.net
@Fts4 @Entity(tableName = "forget") public class Forget { @Ignore @PrimaryKey(autoGenerate = true) private int rowid; @ColumnInfo(name="wordname") private String wordname; @ColumnInfo(name="wordclass") private String wordclass; @ColumnInfo(name="wordtime") private String wordtime; public String getWordname() { return wordname; } public void setWordname(String wordname) { this.wordname = wordname; } public String getWordclass() { return wordclass; } public void setWordclass(String wordclass) { this.wordclass = wordclass; } public String getWordtime() { return wordtime; } public void setWordtime(String wordtime) { this.wordtime = wordtime; } public Forget(String wordname, String wordclass, String wordtime) { this.wordname = wordname; this.wordclass = wordclass; this.wordtime = wordtime; } }
Dao文件以下:code
@Dao //訪問數據庫的一個接口 public interface WordDao { @Insert void insertWords(Forget... forgets); //根據單詞名稱刪除表中數據 @Query("DELETE FROM FORGET where wordname=:name") void deleteWords(String name); //根據單詞名稱更新表中數據 @Query("UPDATE FORGET SET wordclass= :wordclasss WHERE wordname = :wordname") void updateWords(String wordname,String wordclasss); //查詢表中某數據是否存在 @Query("select 1 from forget where wordname =:wordname limit 1") int forgetWordisExist(String wordname); //分頁加載: @Query(" SELECT example,english,phonetic,chinese FROM FOURS limit :start,:end") LiveData<List<Word>> getHarfWordsLive(int start,int end); //查詢所有 @Query(" SELECT * FROM FORGET ORDER BY rowid DESC") LiveData<List<Forget>> getAllForgetLive(); //根據字段查詢 @Query("SELECT * FROM FORGET WHERE wordname= :name") Forget getForgetByName(String name); }
DataBase文件以下
@Database(entities = { Forget.class},version =1,exportSchema = false) public abstract class WordDataBase extends RoomDatabase { private static WordDataBase INSTANCE; static synchronized WordDataBase getDatabase(final Context context){ if (INSTANCE==null){ INSTANCE= Room.databaseBuilder(context.getApplicationContext(),WordDataBase.class,"word.db") .createFromAsset("word.db") //預填充數據庫 .fallbackToDestructiveMigration() .build(); } return INSTANCE; } public abstract WordDao getWordDao(); }
Repository文件以下
class WordRepository { private LiveData<List<Forget>> allForgetLive; private WordDao wordDao; private WordDataBase wordDatabase; WordRepository(Context context){ //單例 wordDatabase=WordDataBase.getDatabase(context.getApplicationContext()); allForgetLive=wordDao.getAllForgetLive(); } public LiveData<List<Forget>> getAllForgetLive() { return allForgetLive; } public Forget getForgetByName(String name) { return wordDao.getForgetByName(name); } public int forgetWordisExist(final String wordname){ return wordDao.forgetWordisExist(wordname); } void insertWords(final Forget...forgets){ RxBusMax.getInstance().chainProcess(new Func1() { @Override public Object call(Object o) { wordDao.insertWords(forgets); return null; } }); } void deleteWords(final String name){ RxBusMax.getInstance().chainProcess(new Func1() { @Override public Object call(Object o) { wordDao.deleteWords(name); return null; } }); } void updateWords(final String wordname,final String wordclass){ RxBusMax.getInstance().chainProcess(new Func1() { @Override public Object call(Object o) { wordDao.updateWords(wordname,wordclass); return null; } }); } }
ViewMode文件以下
public class WordViewModel extends AndroidViewModel { private WordRepository wordRepository; public WordViewModel(@NonNull Application application) { super(application); //單例 wordRepository=new WordRepository(application); } public LiveData<List<Forget>> getAllForgetLive() { return wordRepository.getAllForgetLive(); } public void insertWords(Forget...forgets){ wordRepository.insertWords(forgets); } public void deleteWords(String name){ wordRepository.deleteWords(name); } public Forget getForgetByName(String name) { return wordRepository.getForgetByName(name); } public void updateWords(String wordname,String wordclasss){ wordRepository.updateWords(wordname,wordclasss); } public int forgetWordisExist(final String wordname){ return wordRepository.forgetWordisExist(wordname); } public LiveData<List<Word>> getHalfWordsLive(int start,int end) { return wordRepository.getHalfwordLive(start,end); } }
本文同步分享在 博客「計蒙不吃魚」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。