• Android中使用Room(ORM关系映射框架)对sqllite数据库进行增删改查


    场景

    Room

    Room是Google官方提供的数据库ORM框架,使用起来非常方便。Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库。

    Room中三个主要组件:

    Database:该组件用来创建一个database holder。注解定义实体的列表,类的内容定义从数据库中获取数据的对象(DAO)。它也是底层连接的主要入口。这个被注解的类是一个继承RoomDatabase的抽象类。在运行时,可以通过调用Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder()来得到它的实例。

    Entity:该组件的一个示例表示数据库的一行数据,对于每个Entity类来说,都会有对应的table被创建。想要这些Entity被创建,就需要卸载上面的Database的注解参属entities列表中,默认Entity中的所有字段都会来创建表,除非该字段上加上@Ignore注解。

    Dao:该组件用来表述具有Data Access Object(DAO)功能的类或者接口,DAO类时Room的重要组件,负责定义查询(添加或者删除等)数据库的方法。使用@Database注解的类中必须定义一个不带参数的抽象方法,这个方法返回使用@Dao注解的类,返回类型为@Dao注解过的类的抽象方法Room会在编译时生成这个类的实现。

    Room 不同组件之间的关系

    官方Room教程

    https://developer.android.google.cn/training/data-storage/room

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    打开Android Studio 新建一个项目,勾选上下面的User legacy android support libraries

    然后点击Finish,然后打开build.grdle,添加项目依赖

        def room_version = "2.2.5"
    
        implementation "androidx.room:room-runtime:$room_version"
        annotationProcessor "androidx.room:room-compiler:$room_version"

    添加位置

    下面开始按照官方文档构建三个组件。

    首先是数据库组件,按照其文档说明

    以及官方推荐的使用单例设计模式

    在包下新建继承自RoomDatabase的类,这里叫AppDatebase

    package com.badao.roomstudy.room;
    
    import androidx.room.Database;
    import androidx.room.Room;
    import androidx.room.RoomDatabase;
    
    import com.badao.roomstudy.MyApplication;
    
    
    @Database(entities = {User.class}, version = 1, exportSchema = false)
    public abstract class AppDatabase extends RoomDatabase {
    
        private static AppDatabase INSTANCE;
    
    
        public static AppDatabase getInstance() {
            if (INSTANCE == null) {
                synchronized (AppDatabase.class) {
                    if (INSTANCE == null) {
                        INSTANCE = Room.databaseBuilder(MyApplication.context, AppDatabase.class, "badao.db")
                                .allowMainThreadQueries()
                                .build();
                    }
                }
            }
            return INSTANCE;
        }
    
        public abstract  UserDao userDao();
    
     
    
    }

    因为此类作为工具类的方式存在,在进行构建数据库时需要获取Context对象。

    所以另外再新建一个继承自Application的类MyApplication

    package com.badao.roomstudy;
    
    import android.app.Application;
    import android.content.Context;
    
    public class MyApplication extends Application {
        public static Context context;
    
        @Override
        public void onCreate() {
            super.onCreate();
            context = this;
        }
    }

    然后在AndroidMainifest.xml中添加

        <application
            android:name=".MyApplication"

    在上面的AppDarabase中用到了User这个类,就是Entity组件

    新建User.java

    package com.badao.roomstudy.room;
    
    import androidx.room.ColumnInfo;
    import androidx.room.Entity;
    import androidx.room.PrimaryKey;
    
    @Entity
    public class User {
        @PrimaryKey
        public int uid;
    
        @ColumnInfo(name = "first_name")
        public String firstName;
    
        @ColumnInfo(name = "last_name")
        public String lastName;
    
        public int getUid() {
            return uid;
        }
    
        public void setUid(int uid) {
            this.uid = uid;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    }

    有三个属性:uid使用PrimaryKey注解作为主键,后面是姓和名两个属性,使用@ColumnInfo(name = "first_name")映射数据库中的列。

    然后再新建Dao层组件UserDao接口

    package com.badao.roomstudy.room;
    
    import androidx.room.Dao;
    import androidx.room.Delete;
    import androidx.room.Insert;
    import androidx.room.OnConflictStrategy;
    import androidx.room.Query;
    
    import java.util.List;
    
    @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);
    
        @Query("SELECT * FROM user WHERE last_name LIKE :last LIMIT 1")
        User findByLastName(String last);
    
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        void insertAll(User... users);
    
        @Delete
        void delete(User user);
    }

    并且创建了几个方法。

    然后在布局文件中添加几个按钮

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="添加数据"
            android:onClick="insertData"
            />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="查询所有数据"
            android:onClick="getAll"
            />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="根据名字模糊查询"
            android:onClick="findByLastName"
            />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="删除"
            android:onClick="delete"
            />
    
    </LinearLayout>

    然后在对应的Activity中

    package com.badao.roomstudy;
    
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Toast;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.badao.roomstudy.room.AppDatabase;
    import com.badao.roomstudy.room.User;
    
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
        /**
         * 添加数据
         * @param view
         */
        public void insertData(View view)
        {
    
            User user = new User();
            user.setUid((int) System.currentTimeMillis());
            user.setFirstName("公众号"+Math.random());
            user.setLastName("霸道的程序猿");
    
            AppDatabase.getInstance().userDao().insertAll(user);
            Toast.makeText(this,"插入成功",Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 查询所有数据
         * @param view
         */
        public void getAll(View view)
        {
            StringBuilder stringBuilder = new StringBuilder();
    
            List<User> userList = AppDatabase.getInstance().userDao().getAll();
            for (User user:userList) {
                stringBuilder.append(","+user.getLastName());
            }
            Toast.makeText(this,"查询到所有的名字为:"+stringBuilder,Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 条件查询
         * @param view
         */
        public void findByLastName(View view) {
            User user = AppDatabase.getInstance().userDao().findByLastName("霸道%");
            if (user == null) {
                Toast.makeText(this, "没有查到" , Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "查询到的名字为:" + user.getFirstName() + user.getLastName(), Toast.LENGTH_SHORT).show();
            }
        }
    
        /**
         * 删除
         * @param view
         */
        public void delete(View view) {
            User user = new User();
            user.setUid(0);
            AppDatabase.getInstance().userDao().delete(user);
            Toast.makeText(this, "删除成功" , Toast.LENGTH_SHORT).show();
    
        }
    
    
    }

    即可实现对数据库的增删改查。

    对应的数据库文件的位置在data/data/你的包名/database下

    Android中怎样使用Navicat可视化查看sqllite的数据库(查看db文件):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/110818121

    示例代码下载

    https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/13487201

  • 相关阅读:
    一段路
    memcache 键名的命名规则以及和memcached的区别
    浏览器解释网页时乱码
    windows下安装Apache
    巧用PHP数组函数
    程序返回值的数据结构
    Linux如何生成列表
    判断用户密码是否在警告期内(学习练习)
    判断用户的用户名和其基本组的组名是否一致
    sed笔记
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/14097773.html
Copyright © 2020-2023  润新知