android room 数据库简单使用
首先我们在build.gradle引用room
def roomVersion = "2.4.2"implementation("androidx.room:room-runtime:$roomVersion")annotationProcessor("androidx.room:room-compiler:$roomVersion")
plugins { id 'com.android.application'}android { compileSdk 32 defaultConfig { applicationId "com.nyw.roomdemo" minSdk 21 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }}dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' //room数据库 def roomVersion = "2.4.2" implementation("androidx.room:room-runtime:$roomVersion") annotationProcessor("androidx.room:room-compiler:$roomVersion")}
在settings.gradle中添加
maven { url "https://jitpack.io" }
pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() maven { url "https://jitpack.io" } }}dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() maven { url "https://jitpack.io" } }}rootProject.name = "RoomDemo"include ':app'
在AndroidManifest.xml中添加读写内存权限
这是user表代码
package com.nyw.roomdemo.room;import androidx.annotation.NonNull;import androidx.room.ColumnInfo;import androidx.room.Entity;import androidx.room.Ignore;import androidx.room.PrimaryKey;/ * 这里就是一张数据库表,如果(tableName = "user")这里不指定表名,则默认使用类名做表名 */@Entity(tableName = "user")public class User { //主健id自增长,一个主键@PrimaryKey,autoGenerate = true 自增长 //可以使用默认,也可以指定属性设置如下的(name = "name",typeAffinity = ColumnInfo.INTEGER)指定列名和数据类型 @PrimaryKey(autoGenerate = true) private int id; @ColumnInfo(name = "name",typeAffinity = ColumnInfo.TEXT) private String name; @ColumnInfo private String img; @ColumnInfo private String phone; @ColumnInfo private String adress; @ColumnInfo private String sex; @ColumnInfo private String password; / * room只使用一个构造方法,如果多个构造方法使用 @Ignore进行注解,是我们业务使用, * 另外业务中使用到其他数量变量也可以使用@Ignore进行注解后,room就不会当成列数据使用 */ @Ignore public User() { } @Ignore public User(int id, String name, String adress) { this.id = id; this.name = name; this.adress = adress; } @Ignore public User(int id) { this.id = id; } public User(int id, String name, String img, String phone, String adress, String sex, String password) { this.id = id; this.name = name; this.img = img; this.phone = phone; this.adress = adress; this.sex = sex; this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", img='" + img + '\'' + ", phone='" + phone + '\'' + ", adress='" + adress + '\'' + ", sex='" + sex + '\'' + ", password='" + password + '\'' + '}'; } 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 String getImg() { return img; } public void setImg(String img) { this.img = img; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
这是dao代码
package com.nyw.roomdemo.room;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代表数据访问对象 * Query 查询 * Insert 插入 * Update 更新 * Delete 删除 * 传入多种不同的参数 * 下面的User...users 可变对象,可以多个 */@Daopublic interface UserDao { @Query("select * from user") List getAllUserInfo(); //根据用户id查询数据,数据表的字段id对应方法的id值,查询语句里可以通过冒号方法变量名方式使用 @Query("select * from user where id = :id") List getUserInfo(int id); @Insert() void insert(List userLists); @Update void updateUserInfo(User...users); @Delete void deleteInfo(User...users);}
这是 Database类
package com.nyw.roomdemo.room;import android.content.Context;import androidx.annotation.NonNull;import androidx.room.Database;import androidx.room.Room;import androidx.room.RoomDatabase;import androidx.room.migration.Migration;import androidx.sqlite.db.SupportSQLiteDatabase;/ * 使用@Database注解该类并添加了表名、数据库版本(每当我们改变数据库中的内容时它都会增加),所以这里使用exportSchema = false * 除了添加表映射的类以及和数据库版本外,还要添加exportSchema = false否则会报警告。 */@Database(entities = {User.class},version = 1,exportSchema = false)public abstract class UserDatabase extends RoomDatabase { //数据库名字 private static final String DB_NAME = "UserDatabase.db"; private static volatile UserDatabase instance; public static synchronized UserDatabase getInstance(Context context) { if (instance == null) { instance = create(context); } return instance; } private static UserDatabase create(final Context context) { return Room.databaseBuilder( context, UserDatabase.class, DB_NAME).build(); } public abstract UserDao getUserDao();}
这是activity代码,如下,代码可进一步优化,目前简单使用如下
package com.nyw.roomdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.View;import android.widget.Toast;import com.nyw.roomdemo.room.User;import com.nyw.roomdemo.room.UserDatabase;import java.util.ArrayList;import java.util.List;import java.util.Random;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { findViewById(R.id.addData).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //添加数据 new Thread(new Runnable() { @Override public void run() { //不能在主线程中操作数据库,放在后台线程中完成,通过使用AsyncTask,Thread,Handler,RxJava //插入数据 List userList=new ArrayList(); User user=new User();// user.setId(getNum(10000)); user.setAdress("南宁"); user.setImg("图片地址"); user.setName("这是名字"); user.setPassword("这是密码"); user.setPhone("这是手机号码"); user.setSex("男"); userList.add(user); UserDatabase .getInstance(MainActivity.this) .getUserDao() .insert(userList); } }).start(); } }); findViewById(R.id.btn_read).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //查询数据 new Thread(new Runnable() { @Override public void run() { //后台线程中完成,通过使用AsyncTask,Thread,Handler,RxJava //查询数据 List allUsers = UserDatabase .getInstance(MainActivity.this) .getUserDao() .getAllUserInfo(); for (int i = 0; i < allUsers.size(); i++) {Log.i("sklfjsfksnfsfsf", i+" "+allUsers.get(i).getName()); } } }).start(); } }); findViewById(R.id.btn_update).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //更新数据 new Thread(new Runnable() { @Override public void run() { //后台线程中完成,通过使用AsyncTask,Thread,Handler,RxJava //user表中字段不传值的,都会被设置为null User user=new User(2,"张三","在南宁这里的地址啊"); UserDatabase .getInstance(MainActivity.this) .getUserDao() .updateUserInfo(user); } }).start(); } }); findViewById(R.id.btn_del).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Thread(new Runnable() { @Override public void run() { //后台线程中完成,通过使用AsyncTask,Thread,Handler,RxJava //删除数据,删除id为2的数据 User user=new User(2); UserDatabase .getInstance(MainActivity.this) .getUserDao() .deleteInfo(user); } }).start(); } }); }}
这是xml4个按钮代码