Android(安卓)Jetpack-Room数据库简单使用
16lz
2021-01-25
文章目录
- 1 添加依赖
- 2 表的结构信息
- 3 数据访问对象接口
- 4 定义数据库
- 5 使用
- 6 查看结果
- 7 生成的代码
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 表的结构信息
/** * 这就相当于表的结构信息 */@Entitypublic 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 */@Daopublic 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(); } }}
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android面试题整理(1)
- android 自定义 3D View
- Android硬编解码MediaCodec使用笔记
- toolbar自定义右边的菜单注意
- 查看远程android设备数据库
- contentProvider操作