Android 常用的数据存储方式(三)- Room Database

Google文档:https://developer.android.com/training/data-storage/room/ 


上例子:在主页面输入用户的ID、姓名、地址点击save按钮保存到数据库,然后在第二个页面输入想查询的用户ID,点击Read按钮显示出来。

效果图:
 

User (我们的model, Entity)

@Entity(tableName = "user", indices = {@Index("uid")})
public class User {
    @PrimaryKey
    public int uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;

    @ColumnInfo(name = "address")
    public String address;

    public void setUid(int uid) {
        this.uid = uid;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getUid() {
        return uid;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getAddress() {
        return address;
    }
}

使用Entity时需在build.gradle(app) dependencies中加入(看例子):

dependencies {

    implementation 'android.arch.persistence.room:runtime:1.1.1'
    annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    annotationProcessor 'android.arch.lifecycle:compiler:1.1.1'
    implementation 'android.arch.persistence.room:rxjava2:1.1.1'
    testImplementation 'android.arch.persistence.room:testing:1.1.1'
}


UserDao (访问数据库的方法)

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
            "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Query("SELECT * FROM user WHERE uid = :userIds LIMIT 1")
    User findById(Integer userIds);

    @Insert
    void insertAll(User... usersList);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(User user);

    @Delete
    void delete(User user);
}

AppDatabase 

@Database(entities = {User.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {

    public abstract UserDao userDao();
}

获取数据库实例:

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name")
        .build();

编译时出现报错: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.(无法访问主线程上的数据库,因为它可能会长时间锁定UI)。
报错原因:Room确保永远不会在主线程上访问Database,因为它可能会锁定主线程并触发ANR(当Android应用程序的UI线程被阻止太长时,会触发“应用程序无响应”(ANR)错误)错误。
如果需要从主线程访问数据库,则应始终使用异步备选或手动将调用移至后台线程。这里我们调用allowMainThreadQueries()来禁用Room的主线程查询检查。

example:

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name")
        .allowMainThreadQueries()
        .build();

Room database magration 数据库迁移:比如为Entity新增了一列,AppDatabase version 从1升为2。

mAppDatabase = Room.databaseBuilder(getApplicationContext(),
                AppDatabase.class, DB_NAME)
                .addMigrations(MIGRATION_1_2)
                .allowMainThreadQueries()
                .build();

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE user "
                    + " ADD COLUMN address TEXT");
        }
    };

 

详细代码请看:https://github.com/JereChen11/RoomDatabase-master

请指教、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值