> 文档中心 > android room 数据库简单使用

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个按钮代码  

    

 

 

 

旅游攻略大全