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);
相关推荐
倒流时光三十年7 分钟前
第一阶段 05 · Java 客户端查询类详解(Query / SearchCriteria / Response 与复杂拼接)
java·开发语言·python
rannn_1118 分钟前
【力扣hot100】哈希表专题——从两数之和到最长连续序列
java·算法·leetcode·哈希
观远数据9 分钟前
云原生BI的战略价值:不是技术选择,而是业务弹性的决定因素
java·人工智能·云原生
Full Stack Developme11 分钟前
Tomcat 设计原理
java·tomcat
心平气和量大福大16 分钟前
C#-WPF-控件-LiveChart图表-线性2(LineSeries)-数据绑定
开发语言·c#·wpf
gongzhxu18 分钟前
JetBrains IDEA开发环境搭建
java·ide·intellij-idea
lingran__23 分钟前
C++_stack和queue和priority_queue(容器适配器)
开发语言·c++
程序员三明治26 分钟前
【AI】RAG 生成阶段的最后一公里:Prompt 设计、幻觉抑制与引用对齐
java·人工智能·ai·大模型·llm·prompt·rag
Cry丶29 分钟前
【已解决】adb devices 能识别手机,但 HBuilderX 搜索不到设备的避坑指南
android·adb·uni-app·hbuilderx·真机调试
Bug收容所29 分钟前
12305项目学习day5
java·spring boot·redis·mysql·spring·rocketmq