android-Jetpack组件之Room持久化数据

没有效果图的示例简直就是扯淡

在这里插入图片描述

Room是什么?

Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。

该库可帮助您在运行应用的设备上创建应用数据的缓存。此缓存充当应用的单一可信来源,使用户能够在应用中查看关键信息的一致副本,无论用户是否具有互联网连接。

Room最重要的三个组件是什么?

数据库: 包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。

使用 @Database 注释的类应满足以下条件:

是扩展 RoomDatabase 的抽象类。
在注释中添加与数据库关联的实体列表。
包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。
在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。

Entity: 表示数据库中的表。

DAO: 包含用于访问数据库的方法。

废话不多说,上代码。

依赖:

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

先看实体类:StudentBean.class

import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;

/**
 * 实体类
 */
@Entity(tableName = "studentBean")
public class StudentBean {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id", typeAffinity = ColumnInfo.INTEGER)
    public int id;

    @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)
    public String name;

    @ColumnInfo(name = "age", typeAffinity = ColumnInfo.INTEGER)
    public int age;

    public StudentBean() {
    }

    /**
     * Room会使用这个构造器来存储数据,也就是当你从表中得到Student对象时候,Room会使用这个构造器
     */
    public StudentBean(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    /**
     * 由于Room只能识别和使用一个构造器,如果希望定义多个构造器,你可以使用Ignore标签,让Room忽略这个构造器
     * 同样,@Ignore标签还可用于字段,使用@Ignore标签标记过的字段,Room不会持久化该字段的数据
     */
    @Ignore
    public StudentBean(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
注:代码里面的注释写的非常清楚,这里就不说明了。

StudentDao.class

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;

import java.util.List;

@Dao
public interface StudentDao {

    //插入数据
    @Insert
    void insertStudent(StudentBean studentBean);

    //根据插入数据去删除数据
    @Delete
    void deleteStudent(StudentBean studentBean);

    //更新数据
    @Update
    void updateStudent(StudentBean studentBean);

    //查询所有数据
    @Query("SELECT * FROM studentBean")
    List<StudentBean> getStudentList();

    //根据id去查询数据
    @Query("SELECT * FROM studentBean WHERE id = :id")
    StudentBean getStudentById(int id);

    //删除全部数据
    @Query("DELETE FROM studentBean")
    void deleteAll();

    //根据id去删除相对应的数据
    @Query("delete from studentBean where id= :id")
    void deleteID(int id);

}

MyDataBase.class

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;

@Database(entities = {StudentBean.class}, version = 1)
public abstract class MyDataBase extends RoomDatabase {

    //数据库名字
    private static final String DATABASE_NAME = "cc_db";

    private static MyDataBase databaseInstance;

    public static synchronized MyDataBase getInstance(Context context) {
        if (databaseInstance == null) {
            databaseInstance = Room
                    .databaseBuilder(context.getApplicationContext(), MyDataBase.class, DATABASE_NAME)
                    .build();
        }
        return databaseInstance;
    }

    public abstract StudentDao studentDao();

}

MainActivity.class

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.chushou.roomdemo.diffutil.DiffCallBack;
import com.chushou.roomdemo.diffutil.StudentAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private MyDataBase myDataBase;

    private RecyclerView recyclerView;

    private StudentAdapter studentAdapter;

    List<StudentBean> oldLists;
    List<StudentBean> newLists;

    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case 1:
                    recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
                    studentAdapter = new StudentAdapter(MainActivity.this, oldLists);
                    recyclerView.setAdapter(studentAdapter);
                    break;
                case 2:
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            //放在子线程中计算DiffResult
                            DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(oldLists, newLists), true);
                            Message message = handler.obtainMessage(3);
                            message.obj = diffResult;//obj存放DiffResult
                            message.sendToTarget();
                        }
                    }).start();
                    break;
                case 3:
                    //取出Result
                    DiffUtil.DiffResult diffResult = (DiffUtil.DiffResult) msg.obj;
                    //利用DiffUtil.DiffResult对象的dispatchUpdatesTo()方法,传入RecyclerView的Adapter,轻松成为文艺青年
                    diffResult.dispatchUpdatesTo(studentAdapter);
                    //别忘了将新数据给Adapter
                    oldLists = new ArrayList<>();
                    oldLists.addAll(newLists);

                    studentAdapter.setDatas(oldLists);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    private void initData() {
        myDataBase = MyDataBase.getInstance(getApplicationContext());

        select();
    }

    private void initView() {
        recyclerView = findViewById(R.id.rv);
        findViewById(R.id.insect).setOnClickListener(view -> insect());
        findViewById(R.id.update).setOnClickListener(view -> update());
        findViewById(R.id.delete).setOnClickListener(view -> delete());
    }

    private void insect() {
        new Thread(() -> {
            myDataBase.studentDao().insertStudent(new StudentBean("老吴", 30));


            newLists = new ArrayList<>();
            newLists.addAll(myDataBase.studentDao().getStudentList());
            handler.sendEmptyMessage(2);
        }).start();
    }

    private void select() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                oldLists = new ArrayList<>();
                oldLists = myDataBase.studentDao().getStudentList();
                newLists = new ArrayList<>();
                newLists.addAll(oldLists);
                handler.sendEmptyMessage(1);
            }
        }).start();
    }

    private void update() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                StudentBean studentBean = myDataBase.studentDao().getStudentList().get(0);
                studentBean.setName("小吴");
                studentBean.setAge((int) (Math.random() * 10));
                myDataBase.studentDao().updateStudent(studentBean);

                newLists = new ArrayList<>();
                newLists.addAll(myDataBase.studentDao().getStudentList());
                handler.sendEmptyMessage(2);
            }
        }).start();
    }

    private void delete() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                myDataBase.studentDao().deleteAll();


                newLists = new ArrayList<>();
                newLists.addAll(myDataBase.studentDao().getStudentList());
                handler.sendEmptyMessage(2);
            }
        }).start();
    }

}

StudentAdapter.class:

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import com.chushou.roomdemo.R;
import com.chushou.roomdemo.StudentBean;

import java.util.List;

public class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.DiffVH> {

    private final static String TAG = "zxt";
    private List<StudentBean> mDatas;
    private Context mContext;
    private LayoutInflater mInflater;

    public StudentAdapter(Context mContext, List<StudentBean> mDatas) {
        this.mContext = mContext;
        this.mDatas = mDatas;
        mInflater = LayoutInflater.from(mContext);
    }

    public void setDatas(List<StudentBean> mDatas) {
        this.mDatas = mDatas;
    }

    @Override
    public DiffVH onCreateViewHolder(ViewGroup parent, int viewType) {
        return new DiffVH(mInflater.inflate(R.layout.item_student_layout, parent, false));
    }

    @Override
    public void onBindViewHolder(final DiffVH holder, final int position) {
        StudentBean bean = mDatas.get(position);

        holder.mTvId.setText(new StringBuffer("ID:").append(bean.getId()));
        holder.mTvName.setText(new StringBuffer("姓名:").append(bean.getName()));
        holder.mTvAge.setText(new StringBuffer("年龄:").append(bean.getAge()));
    }

    @Override
    public void onBindViewHolder(DiffVH holder, int position, List<Object> payloads) {
        if (payloads.isEmpty()) {
            onBindViewHolder(holder, position);
        } else {
            //文艺青年中的文青
            Bundle payload = (Bundle) payloads.get(0);//取出我们在getChangePayload()方法返回的bundle
            StudentBean bean = mDatas.get(position);//取出新数据源,(可以不用)
            for (String key : payload.keySet()) {
                switch (key) {
                    case "KEY_ID":
                        holder.mTvId.setText(new StringBuffer("ID:").append(bean.getId()));
                        break;
                    case "KEY_NAME":
                        //这里可以用payload里的数据,不过data也是新的 也可以用
                        holder.mTvName.setText(new StringBuffer("姓名:").append(bean.getName()));
                        break;
                    case "KEY_AGE":
                        holder.mTvAge.setText(new StringBuffer("年龄:").append(bean.getAge()));
                        break;
                    default:
                        break;
                }
            }
        }
    }

    @Override
    public int getItemCount() {
        return mDatas != null ? mDatas.size() : 0;
    }

    class DiffVH extends RecyclerView.ViewHolder {

        TextView mTvId, mTvName, mTvAge;

        public DiffVH(View itemView) {
            super(itemView);

            mTvId = itemView.findViewById(R.id.txt_id);
            mTvName = itemView.findViewById(R.id.txt_name);
            mTvAge = itemView.findViewById(R.id.txt_age);
        }
    }

}
注:至此,代码就已经完全结束了。

附上demo源码。

源码:源码请点这里

如果下不了源码,可以加微信,手机号在下面。


Q:486789970(QQ现在很少用)
V:18588400509(如果着急,可以直接加微信)
email:mr.cai_cai@foxmail.com

如果有什么问题,欢迎大家指导。并相互联系,希望能够通过文章互相学习。

											                               	---财财亲笔
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谁抢我的小口口

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值