Jetpack Room - Room 查询返回列表无需判空、LIKE 关键字

Room 查询返回列表无需判空

1、基本介绍
  1. Room 的 @Query 方法返回 List 类型时,永远不会返回 null

  2. 没有数据时返回空列表,有数据时返回包含元素的列表

2、演示
(1)Application
  • MyApplication.java
java 复制代码
public class MyApplication extends Application {

    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();

        context = this;
    }

    public static Context getContext() {
        return context;
    }
}
(2)Entity
  • Member.java
java 复制代码
@Entity(tableName = "Member")
public class Member {

    @PrimaryKey(autoGenerate = true)
    private Integer id;

    @ColumnInfo(name = "name")
    private String name;

    @ColumnInfo(name = "age")
    private Integer age;

    public Member() {
    }

    @Ignore
    public Member(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Ignore
    public Member(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
(3)Dao
  • MemberDAO.java
java 复制代码
@Dao
public interface MemberDAO {

    @Insert
    void insert(Member member);

    @Query("DELETE FROM Member")
    void deleteAll();

    @Query("SELECT * FROM Member")
    List<Member> queryAll();

    @Query("SELECT * FROM Member WHERE name = :name")
    Member queryByName(String name);

    @Query("SELECT * FROM Member WHERE name LIKE '%' || :name || '%'")
    List<Member> queryByNameLike(String name);
}
(4)Database
  • MyDatabase.java
java 复制代码
@Database(entities = {Member.class}, version = 1, exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {

    public static final String DATABASE_NAME = "test.db";

    private static MyDatabase myDatabase;

    public static MyDatabase getInstance() {
        if (myDatabase == null) {
            myDatabase = Room.databaseBuilder(MyApplication.getContext(), MyDatabase.class, DATABASE_NAME).build();
        }
        return myDatabase;
    }

    public abstract MemberDAO getMemberDAO();
}
(5)Test
java 复制代码
new Thread(() -> {
    MemberDAO memberDAO = MyDatabase.getInstance().getMemberDAO();

    memberDAO.deleteAll();

    Log.i(TAG, "没有数据时");

    List<Member> members = memberDAO.queryAll();
    Member member = memberDAO.queryByName("jack");
    List<Member> membersLike = memberDAO.queryByNameLike("m");

    Log.d(TAG, "members: " + members);
    Log.d(TAG, "member: " + member);
    Log.d(TAG, "membersLike: " + membersLike);

    memberDAO.insert(new Member("Jack", 18));
    memberDAO.insert(new Member("Tom", 19));
    memberDAO.insert(new Member("Smith", 20));

    Log.i(TAG, "有数据时");

    List<Member> members2 = memberDAO.queryAll();
    Member member2 = memberDAO.queryByName("Jack");
    List<Member> membersLike2 = memberDAO.queryByNameLike("m");

    Log.d(TAG, "members: " + members2);
    Log.d(TAG, "member: " + member2);
    Log.d(TAG, "membersLike: " + membersLike2);
}).start();
复制代码
# 输出结果

没有数据时
members: []
member: null
membersLike: []
有数据时
members: [Member{id=4, name='Jack', age=18}, Member{id=5, name='Tom', age=19}, Member{id=6, name='Smith', age=20}]
member: Member{id=4, name='Jack', age=18}
membersLike: [Member{id=5, name='Tom', age=19}, Member{id=6, name='Smith', age=20}]

LIKE 关键字

1、基本介绍
  • SQLite 中的 LIKE 关键字用于模式匹配,通常与 WHERE 子句结合使用
通配符 描述
% 代表零个或多个字符
_ 代表单个字符
2、基本使用
sql 复制代码
-- 查找名字以 '张' 开头的记录

SELECT * FROM users WHERE name LIKE '张%';
sql 复制代码
-- 查找邮箱包含 'gmail' 的记录

SELECT * FROM users WHERE email LIKE '%gmail%';
sql 复制代码
-- 查找名字第二个字符是 'a' 的记录

SELECT * FROM users WHERE name LIKE '_a%';
java 复制代码
// Room 中的使用

@Query("SELECT * FROM Member WHERE name LIKE '%' || :name || '%'")
List<Member> queryByNameLike(String name);
相关推荐
白山编程大哥6 分钟前
Java 迭代器接口详解:从 Iterator 到 ListIterator 的完整指南
java·开发语言·windows
热心网友俣先生7 分钟前
2026国赛C题:五年命题规律与预测
java·c语言·前端·数学建模
见叶之秋11 分钟前
【C++】String类的使用(含模拟实现)
java·开发语言·c++
想吃火锅100511 分钟前
【leetcode】42.接雨水js
开发语言·javascript·ecmascript
竹叶青_七弦43 分钟前
从复制粘贴到Harness:Java后端AI编程的工程化之路
java
wuminyu1 小时前
Linux内核线程调度与虚拟线程调度机制系统级深度剖析
java·linux·c语言·jvm·c++
你的坚定1 小时前
SurfaceFlinger合成一帧的完整流程
android
小溪学编程1 小时前
Java InputStream 详解:从基础到实战
java·python·php
血小板要健康1 小时前
队列 + 宽搜(BFS):二叉树层序遍历 算法总结
java·数据结构·笔记·算法·leetcode·宽度优先
雪芽蓝域zzs1 小时前
第十六节:递归组件实现无限层级折叠侧边栏菜单
开发语言·javascript·ecmascript