Android常用的room增删改查语句(外部数据库)

简介: 本文分享了将一个原生数据库驱动的单词APP重构为使用Room库的过程及遇到的问题,重点解决了Room中增删改查的常用语句实现。文章通过具体示例(以“forget”表为例),详细展示了如何定义实体类、Dao接口、Database类以及Repository和ViewModel的设计与实现。同时,提供了插入、删除、更新和查询数据的代码示例,包括模糊查询、分页加载等功能。此外,针对外部数据库导入问题,作者建议可通过公众号“计蒙不吃鱼”获取更多支持。此内容适合有一定Room基础的开发者深入学习。

最近博主把一个以前用原生数据库写的单词APP中数据库部分改成了room,在这个过程中踩了很多坑

坑大概为两点

  • 使用room增删改查的一些语句
  • 导入外部数据库并对其表格内容进行增删改查

在项目最后是全部重构成功了,但是在处理外部数据库时遇到的坑比较多,一时间没整理出来(整理了一个demo,但是没整理完),所以这篇文章解决room增删改查的一些常用语句。

如果项目吃急,遇到外部数据库的一些问题,可通过公众号计蒙不吃鱼 联系博主

相信看这篇文章的人应该都有room的使用基础了,所以直接上菜(以下图表格为例)。
20200806044918130.png

如上图:表名为forget

  1. 单词名称:wordname
  2. 单词等级:wordclass
  3. 单词时间:wordtime

插入数据(增):

    //Forget为表的实体类
    @Insert
    void insertWords(Forget... forgets);
AI 代码解读

删除数据(删):

    //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);
AI 代码解读

更新数据(改):

    //更新数据 
    @Update
    void  updateWords(Forget... forgets);

    //根据单词名称修改单词等级
    @Query("UPDATE FORGET SET wordclass= :wordclasss WHERE wordname = :wordname")
    void  updateWords(String wordname,String wordclasss);
AI 代码解读

查询数据(查):

    //查询全部数据
    @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);

     //查询某项的全部数据(模糊查询)
    @Query("SELECT * FROM 表名 WHERE 某一项 LIKE '%' || :name || '%'")
    List<User> getSubjectForSchool(String name);
AI 代码解读

Forget实体类如下

@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;
    }
}
AI 代码解读

Dao文件如下:

@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);

}
AI 代码解读

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();

}
AI 代码解读

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;
            }
        });
    }




}
AI 代码解读

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);
    }

}
AI 代码解读
相关文章
Android使用EditText+Listview实现搜索效果(使用room模糊查询)
本文介绍如何在Android中使用EditText与ListView实现搜索功能,并结合Room数据库完成模糊查询。主要内容包括:Room的模糊查询语句(使用`||`代替`+`号)、布局美化(如去除ListView分割线和EditText下划线)、EditText回车事件监听,以及查询逻辑代码示例。此外,还提供了相关扩展文章链接,帮助读者深入了解ListView优化、动态搜索及Room基础操作。
228 65
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
249 77
Android数据库的使用(增删改查)
本文介绍了一个简单的数据库操作Demo,包含创建数据库、增删改查功能。通过5个按钮分别实现创建数据库、插入数据、删除数据、更新数据和查询数据的操作。代码结构清晰,适合初学者学习Android SQLite数据库基础操作。
Android外部数据库的引用
简介:本文介绍了在Android项目中引用外部数据库的方法。首先,将现成的数据库文件放入项目的`assets`文件夹中(需手动创建)。其次,在APP引导界面通过代码将数据库拷贝至App目录下,确保数据库可用。最后,对数据库进行增删改查等操作。关键步骤包括判断数据库是否存在、使用`AssetManager`读取数据库文件并写入App私有目录,实现外部数据库的顺利集成与使用。
Unity连接Mysql数据库 增 删 改 查
在 Unity 中连接 MySQL 数据库,需使用 MySQL Connector/NET 作为数据库连接驱动,通过提供服务器地址、端口、用户名和密码等信息建立 TCP/IP 连接。代码示例展示了如何创建连接对象并执行增删改查操作,确保数据交互的实现。测试代码中,通过 `MySqlConnection` 类连接数据库,并使用 `MySqlCommand` 执行 SQL 语句,实现数据的查询、插入、删除和更新功能。
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
261 13
使用Py2neo进行Neo4j图数据库的增删改查操作
使用Py2neo进行Neo4j图数据库的增删改查操作
304 5
低代码开发工具-学生管理系统-老师管理增删改查实现
低代码开发工具-学生管理系统-老师管理增删改查实现
122 5
javamvc配置,增删改查,文件上传下载。
【10月更文挑战第4天】javamvc配置,增删改查,文件上传下载。
78 1
[新手入门]todolist增删改查:vue3+ts版本!
【10月更文挑战第15天】[新手入门]todolist增删改查:vue3+ts版本!

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等