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

标签:Android,Room,数据库
0
投稿

猜你喜欢

  • 教你如何用好 Java 中的枚举

    2022-11-03 10:31:21
  • WPF中使用WebView2控件的方法及常见问题

    2023-10-02 18:23:28
  • Java之Spring注解开发案例详解

    2022-05-23 05:33:02
  • Java异常的处理机制

    2023-12-03 15:33:19
  • 简单的一次springMVC路由跳转实现

    2023-01-09 10:05:11
  • Android编程实现WebView全屏播放的方法(附源码)

    2023-03-01 10:11:21
  • 安卓11适配攻略抢先看

    2022-05-22 22:39:05
  • Java利用HttpClient模拟POST表单操作应用及注意事项

    2023-11-29 23:48:01
  • java使用ftp上传文件示例分享

    2021-10-23 08:33:03
  • java的url方式、本地方式获取json文件内容

    2023-08-22 18:30:23
  • 自己动手写的mybatis分页插件(极其简单好用)

    2023-11-01 18:12:09
  • c# 实现语音合成

    2021-06-16 00:17:47
  • Java @Async注解导致spring启动失败解决方案详解

    2022-03-06 00:15:17
  • springmvc限流拦截器的示例代码

    2021-09-08 02:50:55
  • android实现软件自动更新的步骤

    2022-12-27 00:48:17
  • SpringBoot 配置文件总结

    2021-09-06 13:12:57
  • C# StringBuilder和string

    2021-08-20 00:21:20
  • IDEA新手必备之各种快捷键详解

    2023-02-13 15:27:31
  • C# 中const,readonly,static的使用小结

    2022-05-16 20:39:58
  • C#多线程Thread使用示例详解

    2021-11-12 06:52:05
  • asp之家 软件编程 m.aspxhome.com