Room 查询返回列表无需判空
1、基本介绍
-
Room 的
@Query方法返回 List 类型时,永远不会返回 null -
没有数据时返回空列表,有数据时返回包含元素的列表
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);