Android使用Room操作数据库流程详解
作者:Flynn_MIMD 发布时间:2023-03-21 21:00:31
Room的三个主要组件:
数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。
数据实体,@Entity,表示数据库中的表。
数据访问对象 (DAO),@Dao,提供查询、更新、插入和删除数据的方法。
build.gradle添加
dependencies {
def room_version = "2.4.3"implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"implementation "android.arch.persistence.room:rxjava2:$room_version"
testImplementation "android.arch.persistence.room:testing:$room_version"
}
1. 创建实体类User
@Entity(tableName = "users")
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
@Entity实体类,users表的名称,不加默认user
@ColumnInfo列名
@PrimaryKey主键
2. 创建DAO
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(User... users);
@Delete
void delete(User user);
}
增,删,改:将实例与表的主键进行匹配
查询结果将自动映射到对应类型的字段,若未映射将报警告
3. 数据库
抽象类AppDatabase 定义数据库配置,并作为应用对持久性数据的主要访问点,扩展了RommDataBase
@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class AppDataBase extends RoomDatabase {
public abstract UserDao userDao();
}
4. 使用
AppDataBase db = Room.databaseBuilder(getApplicationContext(),
AppDataBase.class, "database-name").build();
for (int i = 0; i < 10; i++) {
User user = new User();
user.uid = i;
user.firstName = "Shell" + i;
user.lastName = "Hub" + i;
db.userDao().insertAll( user);
List<User> userList = db.userDao().getAll();
for(User user1 : userList) {
Log.d("mip",""+user1.firstName);
}
}
为了节约获取数据库的时间和资源,采取单例模式
简单实现:
public class Utils {
private static AppDataBase db = null;
private static Context context = null;
public static AppDataBase getDb(){
if( db == null) {
db = Room.databaseBuilder(context,
AppDataBase.class, "database-name").build();
}
return db;
}
public static void setContext(Context context){
Utils.context = context;
}
}
调用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Utils.setContext(getApplicationContext());
new Thread(new Runnable() {
@Override
public void run() {
AppDataBase db = Utils.getDb();
for (int i = 0; i < 10; i++) {
User user = new User();
user.uid = i;
user.firstName = "Shell" + i;
user.lastName = "Hub" + i;
db.userDao().insertAll( user);
List<User> userList = db.userDao().getAll();
for(User user1 : userList) {
Log.d("mip",""+user1.firstName);
}
}
}
}).start();
}
}
路过的大佬们有更好的单例实现请告诉我一下,
来源:https://blog.csdn.net/weixin_45369680/article/details/127866214


猜你喜欢
- 基本流foreach 实现了外部迭代,它是建立于集合的基础上;stream 流实现的是内部迭代中间操作与终端操作对任意集合使用 stream
- RecyclerView是什么 RecycleView是Androi
- 最近做局域网socket连接问题,要在多个activity之间公用一个socket连接,就在网上搜了下资料,感觉还是application方
- 前言最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题
- 本文实例讲述了Android编程获取网络连接方式及判断手机卡所属运营商的方法。分享给大家供大家参考,具体如下:问题:项目中写的网络模块,感觉
- 本文实例为大家分享了Android登录邮箱自动补全功能的实现方法,供大家参考,具体内容如下效果:实现原理:1、继承重写简单控件AutoCom
- 本文实例讲述了java之swing下拉菜单实现方法。分享给大家供大家参考。具体如下:import java.awt.*;import jav
- Java内置GUI Frame类Frame概述* 事件处理 * 事件: 用户的一个操作* 事件源: * 作的组件*
- 引入对于基本类型的常量或变量进行运算时,我们可以使用 +、-、*、/ 等运算符,但是我们不可以使用运算符来进行对象之间的运算。eg:对象之间
- package com.robin;import java.io.File;import java.io.FileInputStream;i
- 在前面的博客中,https://www.jb51.net/article/134866.htm 我们使用了spring boot的异步操作,
- 该工具包含是封装了jedis,包含redis.properties和jedisPool,序列化使用的是protostuff,map类型操作使
- 对于生成的sql语句 自动加上单引号的情况mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区
- Java本身都是值传递式的调用,对于对象传递的是地址值。给地址值重新赋值等于重新指向,不会影响外层。而且这里Integer对象也有特殊性。其
- telnet-client太费尽了,比ssh-client费尽的多,搞了一天,凑合能用,还得改。org.apache.commons.net
- Hadoop环境搭建详见此文章https://www.jb51.net/article/33649.htm。我们已经知道Hadoop能够通过
- 本文实例介绍了sdcard存储图片下载简单操作,分享给大家供大家参考,具体内容如下步骤 -- 在配置清单添加完联网权限后1、res/layo
- java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法玩web
- 在使用之前先介绍一个并发需要用到的方法:CountDownLatchCountDownLatch(也叫闭锁)是一个同步协助类,允许一个或多个
- 本文实例为大家分享了Android双向选择控件DoubleSeekBar的使用方法,供大家参考,具体内容如下先看效果图1.DoubleSli