https://developer.android.google.cn/topic/libraries/architecture/room
https://developer.android.google.cn/training/data-storage/room/index.html
https://developer.android.google.cn/jetpack/androidx/releases/room#declaring_dependencies
1 添加依赖
def room_version = "2.2.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
2 表的结构信息
/**
* 这就相当于表的结构信息
*/
@Entity
public class Student {
//设置主键,自增长
@PrimaryKey(autoGenerate = true)
private int uid;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "pwd")
private String password;
@ColumnInfo(name = "addressId")
private int addressId;
public Student(String name, String password, int addressId) {
this.name = name;
this.password = password;
this.addressId = addressId;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
@Override
public String toString() {
return "Student{" +
"uid=" + uid +
", name='" + name + '\'' +
", password='" + password + '\'' +
", addressId=" + addressId +
'}';
}
}
3 数据访问对象接口
/**
* 这就是数据访问对象
* 用于操作数据的API
*/
@Dao
public interface StudentDao {
@Insert
void insert(Student... students);
@Delete
void delete(Student student);
@Update
void update(Student student);
@Query("select * from Student")
List<Student> getAll();
}
4 定义数据库
/**
* 定义数据库
*/
@Database(entities = {Student.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract StudentDao userDao();
}
5 使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyThread t = new MyThread();
t.start();
}
public class MyThread extends Thread {
@Override
public void run() {
super.run();
//在这里进行数据库的操作
AppDatabase HongxDB = Room.databaseBuilder(getApplicationContext()
, AppDatabase.class
, "HongxDB")
.build();
StudentDao dao = HongxDB.userDao();
dao.insert(new Student("stu1", "123", 1));
dao.insert(new Student("stu2", "123", 2));
dao.insert(new Student("stu3", "123", 1));
dao.insert(new Student("stu4", "123", 2));
List<Student> list = dao.getAll();
Log.i("hongxue", list.toString());
}
}
}
6 查看结果
7 生成的代码
import androidx.room.DatabaseConfiguration;
import androidx.room.InvalidationTracker;
import androidx.room.RoomOpenHelper;
import androidx.room.RoomOpenHelper.Delegate;
import androidx.room.RoomOpenHelper.ValidationResult;
import androidx.room.util.DBUtil;
import androidx.room.util.TableInfo;
import androidx.room.util.TableInfo.Column;
import androidx.room.util.TableInfo.ForeignKey;
import androidx.room.util.TableInfo.Index;
import androidx.sqlite.db.SupportSQLiteDatabase;
import androidx.sqlite.db.SupportSQLiteOpenHelper;
import androidx.sqlite.db.SupportSQLiteOpenHelper.Callback;
import androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration;
import java.lang.Override;
import java.lang.String;
import java.lang.SuppressWarnings;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
@SuppressWarnings({"unchecked", "deprecation"})
public final class AppDatabase_Impl extends AppDatabase {
private volatile StudentDao _studentDao;
@Override
protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration configuration) {
final SupportSQLiteOpenHelper.Callback _openCallback = new RoomOpenHelper(configuration, new RoomOpenHelper.Delegate(1) {
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `Student` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `pwd` TEXT, `addressId` INTEGER NOT NULL)");
_db.execSQL("CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)");
_db.execSQL("INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '59d4098a3eac39a789ec7c792754cd68')");
}
@Override
public void dropAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("DROP TABLE IF EXISTS `Student`");
if (mCallbacks != null) {
for (int _i = 0, _size = mCallbacks.size(); _i < _size; _i++) {
mCallbacks.get(_i).onDestructiveMigration(_db);
}
}
}
@Override
protected void onCreate(SupportSQLiteDatabase _db) {
if (mCallbacks != null) {
for (int _i = 0, _size = mCallbacks.size(); _i < _size; _i++) {
mCallbacks.get(_i).onCreate(_db);
}
}
}
@Override
public void onOpen(SupportSQLiteDatabase _db) {
mDatabase = _db;
internalInitInvalidationTracker(_db);
if (mCallbacks != null) {
for (int _i = 0, _size = mCallbacks.size(); _i < _size; _i++) {
mCallbacks.get(_i).onOpen(_db);
}
}
}
@Override
public void onPreMigrate(SupportSQLiteDatabase _db) {
DBUtil.dropFtsSyncTriggers(_db);
}
@Override
public void onPostMigrate(SupportSQLiteDatabase _db) {
}
@Override
protected RoomOpenHelper.ValidationResult onValidateSchema(SupportSQLiteDatabase _db) {
final HashMap<String, TableInfo.Column> _columnsStudent = new HashMap<String, TableInfo.Column>(4);
_columnsStudent.put("uid", new TableInfo.Column("uid", "INTEGER", true, 1, null, TableInfo.CREATED_FROM_ENTITY));
_columnsStudent.put("name", new TableInfo.Column("name", "TEXT", false, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsStudent.put("pwd", new TableInfo.Column("pwd", "TEXT", false, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsStudent.put("addressId", new TableInfo.Column("addressId", "INTEGER", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
final HashSet<TableInfo.ForeignKey> _foreignKeysStudent = new HashSet<TableInfo.ForeignKey>(0);
final HashSet<TableInfo.Index> _indicesStudent = new HashSet<TableInfo.Index>(0);
final TableInfo _infoStudent = new TableInfo("Student", _columnsStudent, _foreignKeysStudent, _indicesStudent);
final TableInfo _existingStudent = TableInfo.read(_db, "Student");
if (! _infoStudent.equals(_existingStudent)) {
return new RoomOpenHelper.ValidationResult(false, "Student(com.hongx.room.dao.Student).\n"
+ " Expected:\n" + _infoStudent + "\n"
+ " Found:\n" + _existingStudent);
}
return new RoomOpenHelper.ValidationResult(true, null);
}
}, "59d4098a3eac39a789ec7c792754cd68", "04a8ed3f8162e345b21265f4b4ca7f0d");
final SupportSQLiteOpenHelper.Configuration _sqliteConfig = SupportSQLiteOpenHelper.Configuration.builder(configuration.context)
.name(configuration.name)
.callback(_openCallback)
.build();
final SupportSQLiteOpenHelper _helper = configuration.sqliteOpenHelperFactory.create(_sqliteConfig);
return _helper;
}
@Override
protected InvalidationTracker createInvalidationTracker() {
final HashMap<String, String> _shadowTablesMap = new HashMap<String, String>(0);
HashMap<String, Set<String>> _viewTables = new HashMap<String, Set<String>>(0);
return new InvalidationTracker(this, _shadowTablesMap, _viewTables, "Student");
}
@Override
public void clearAllTables() {
super.assertNotMainThread();
final SupportSQLiteDatabase _db = super.getOpenHelper().getWritableDatabase();
try {
super.beginTransaction();
_db.execSQL("DELETE FROM `Student`");
super.setTransactionSuccessful();
} finally {
super.endTransaction();
_db.query("PRAGMA wal_checkpoint(FULL)").close();
if (!_db.inTransaction()) {
_db.execSQL("VACUUM");
}
}
}
@Override
public StudentDao userDao() {
if (_studentDao != null) {
return _studentDao;
} else {
synchronized(this) {
if(_studentDao == null) {
_studentDao = new StudentDao_Impl(this);
}
return _studentDao;
}
}
}
}
import android.database.Cursor;
import androidx.room.EntityDeletionOrUpdateAdapter;
import androidx.room.EntityInsertionAdapter;
import androidx.room.RoomDatabase;
import androidx.room.RoomSQLiteQuery;
import androidx.room.util.CursorUtil;
import androidx.room.util.DBUtil;
import androidx.sqlite.db.SupportSQLiteStatement;
import java.lang.Override;
import java.lang.String;
import java.lang.SuppressWarnings;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings({"unchecked", "deprecation"})
public final class StudentDao_Impl implements StudentDao {
private final RoomDatabase __db;
private final EntityInsertionAdapter<Student> __insertionAdapterOfStudent;
private final EntityDeletionOrUpdateAdapter<Student> __deletionAdapterOfStudent;
private final EntityDeletionOrUpdateAdapter<Student> __updateAdapterOfStudent;
public StudentDao_Impl(RoomDatabase __db) {
this.__db = __db;
this.__insertionAdapterOfStudent = new EntityInsertionAdapter<Student>(__db) {
@Override
public String createQuery() {
return "INSERT OR ABORT INTO `Student` (`uid`,`name`,`pwd`,`addressId`) VALUES (nullif(?, 0),?,?,?)";
}
@Override
public void bind(SupportSQLiteStatement stmt, Student value) {
stmt.bindLong(1, value.getUid());
if (value.getName() == null) {
stmt.bindNull(2);
} else {
stmt.bindString(2, value.getName());
}
if (value.getPassword() == null) {
stmt.bindNull(3);
} else {
stmt.bindString(3, value.getPassword());
}
stmt.bindLong(4, value.getAddressId());
}
};
this.__deletionAdapterOfStudent = new EntityDeletionOrUpdateAdapter<Student>(__db) {
@Override
public String createQuery() {
return "DELETE FROM `Student` WHERE `uid` = ?";
}
@Override
public void bind(SupportSQLiteStatement stmt, Student value) {
stmt.bindLong(1, value.getUid());
}
};
this.__updateAdapterOfStudent = new EntityDeletionOrUpdateAdapter<Student>(__db) {
@Override
public String createQuery() {
return "UPDATE OR ABORT `Student` SET `uid` = ?,`name` = ?,`pwd` = ?,`addressId` = ? WHERE `uid` = ?";
}
@Override
public void bind(SupportSQLiteStatement stmt, Student value) {
stmt.bindLong(1, value.getUid());
if (value.getName() == null) {
stmt.bindNull(2);
} else {
stmt.bindString(2, value.getName());
}
if (value.getPassword() == null) {
stmt.bindNull(3);
} else {
stmt.bindString(3, value.getPassword());
}
stmt.bindLong(4, value.getAddressId());
stmt.bindLong(5, value.getUid());
}
};
}
@Override
public void insert(final Student... students) {
__db.assertNotSuspendingTransaction();
__db.beginTransaction();
try {
__insertionAdapterOfStudent.insert(students);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
@Override
public void delete(final Student student) {
__db.assertNotSuspendingTransaction();
__db.beginTransaction();
try {
__deletionAdapterOfStudent.handle(student);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
@Override
public void update(final Student student) {
__db.assertNotSuspendingTransaction();
__db.beginTransaction();
try {
__updateAdapterOfStudent.handle(student);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
@Override
public List<Student> getAll() {
final String _sql = "select * from Student";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
__db.assertNotSuspendingTransaction();
final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
try {
final int _cursorIndexOfUid = CursorUtil.getColumnIndexOrThrow(_cursor, "uid");
final int _cursorIndexOfName = CursorUtil.getColumnIndexOrThrow(_cursor, "name");
final int _cursorIndexOfPassword = CursorUtil.getColumnIndexOrThrow(_cursor, "pwd");
final int _cursorIndexOfAddressId = CursorUtil.getColumnIndexOrThrow(_cursor, "addressId");
final List<Student> _result = new ArrayList<Student>(_cursor.getCount());
while (_cursor.moveToNext()) {
final Student _item;
final String _tmpName;
_tmpName = _cursor.getString(_cursorIndexOfName);
final String _tmpPassword;
_tmpPassword = _cursor.getString(_cursorIndexOfPassword);
final int _tmpAddressId;
_tmpAddressId = _cursor.getInt(_cursorIndexOfAddressId);
_item = new Student(_tmpName, _tmpPassword, _tmpAddressId);
final int _tmpUid;
_tmpUid = _cursor.getInt(_cursorIndexOfUid);
_item.setUid(_tmpUid);
_result.add(_item);
}
return _result;
} finally {
_cursor.close();
_statement.release();
}
}
}