没有效果图的示例简直就是扯淡
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
如果有什么问题,欢迎大家指导。并相互联系,希望能够通过文章互相学习。
---财财亲笔