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);
相关推荐
星夜离尘562 分钟前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
_Evan_Yao3 分钟前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
Ai-_Man25 分钟前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd28 分钟前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼30 分钟前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
学逆向的1 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_1 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
thefool1122661 小时前
TCP 1
java·1024程序员节
美狐美颜SDK开放平台2 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
传奇开心果编程2 小时前
【Jetpack Compose娓娓道来】第26课:Repository模式与数据层设计——数据的唯一入口
android·移动开发·1024程序员节·jetpack compose·编程语言理论·编程框架·声明式ui