Android Jetpack-Room数据库简单使用


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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是关于Android Room数据库简单介绍和使用方法: Android Room是一种SQLite数据库的对象映射库,它提供了一种简单的方法来访问SQLite数据库,而无需编写复杂的SQL查询。它是Google推出的一种Jetpack组件,旨在帮助Android开发者更加简便地使用SQLite数据库。 下面是使用Android Room数据库的基本步骤: 1. 添加依赖项:在app/build.gradle文件中添加以下依赖项: ``` dependencies { def room_version = "2.3.0" // Room components implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" // 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. 创建实体:创建一个Java类或Kotlin数据类,用于表示数据库表中的一行数据。示例代码: ``` @Entity(tableName = "users") data class User( @PrimaryKey val id: Int, @ColumnInfo(name = "user_name") val userName: String, @ColumnInfo(name = "user_age") val userAge: Int ) ``` 3. 创建DAO:创建一个接口,其中包含用于访问数据库的方法。示例代码: ``` @Dao interface UserDao { @Query("SELECT * FROM users") fun getAllUsers(): List<User> @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertUser(user: User) @Delete fun deleteUser(user: User) } ``` 4. 创建数据库:创建一个继承自RoomDatabase的抽象类,并在其中声明用于访问DAO的抽象方法。示例代码: ``` @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } ``` 5. 初始化数据库:在应用程序的入口点处初始化数据库,并使用它来获取DAO实例。示例代码: ``` val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build() val userDao = db.userDao() ``` 6. 使用DAO:使用DAO中定义的方法来访问数据库。示例代码: ``` val allUsers = userDao.getAllUsers() userDao.insertUser(user) userDao.deleteUser(user) ``` 这些是使用Android Room数据库的基本步骤。当然,还有许多其他的高级用法和配置选项,可以根据具体需求进行学习和使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值