前言
记录安卓学习
一、Room框架
Room框架是谷歌开发的一款用于 *** 作数据库的框架,和之前记录的Litepal有一点相似,怎么说呢,因为目前水平不够,无法阅读源码,不好细说,但是就个人理解,它也是利用封装的做法来简化 *** 作。另外,Room对比Litepal或者greenDao来说,他几乎具有他们所有的优点,并且他还支持返回数据类型为observeable和LiveData,这就使得其可以配合Rxjava和MVVM来一起使用,这就大大的将程序解耦,对于后期的维护提供了便捷。
二、入门 *** 作 1.引入库代码如下(示例):
引入依赖吗,最新依赖可以上安卓开发者官网去查询
dependencies {
def room_version = "2.4.2" java
implementation "androidx.room:room-runtime:$room_version" java
annotationProcessor "androidx.room:room-compiler:$room_version" java
// optional - RxJava2 support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version" java
// optional - Paging 3 Integration
implementation "androidx.room:room-paging:2.5.0-alpha01"
}
注意,其中的option是可选择的,java用上面标注的4个就行了
2.建表 2.1 Entity——这个注解表示一个实例,也就是表代码如下(示例):
@Entity(tableName = "Book") //这里不写就默认将类名作为表名
public class Book {
@PrimaryKey(autoGenerate = true)//自增长的行号id
private int id;
@ColumnInfo(name = "bookName") //这个标注可以理解为列,后面的名称通常是来匹配网络传输的数据的
private String bookName;
@ColumnInfo(name = "price")
private double price;
//还需要一个有参构造
public Book(int id, String bookName, double price) {
this.id = id;
this.bookName = bookName;
this.price = price;
}
//注意,一个类只能有一个有参构造,如果添加无参或者其他方法,要用@Ignore标志这个字段,意思是不将这个作为列
//比如
@Ignore
public Book() {
}
//还需要对应的get和set
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
2.2 建立数据 *** 作类Dao
Dao相当一个用于 *** 作数据库的接口,一般命名为class+Dao,
@androidx.room.Dao
public interface Dao {
//这里用SQL语句作为注解,让系统为我们生成对应的代码来匹配我们的方法
@Insert
void insertBook();
@Update
void updateBook();
@Delete
void deleteBool();
@Query("select bookName from Book")
List queryAllBooksByName();
//还可以返回LiveData类型
@Query("select * from Book")
LiveData> queryAllBooks();
}
2.3 建立数据库类
@Database(entities = {Book.class},version = 1,exportSchema = false)
//这里的注解说明一下,第一个是类,第二个是版本,单个是默认的
public abstract class BookDatabase extends RoomDatabase {
//我们对数据的 *** 作为了避免被滥用实例化,使用单例模式,singleTon,并且加锁
private static BookDatabase INSTANCE;
//创建一个方法,这个方法返回一个BookDatabase
public static BookDatabase getDatabase(Context context){
if (INSTANCE==null){
//如果为创建这个数据库,那么就呼叫builder来创建数据库
INSTANCE = Room.databaseBuilder(context,BookDatabase.class,"BOOK_DATABASE")
.allowMainThreadQueries()//这个是强制运行在主线程 *** 作,这个一般不推荐,都是需要重开子线程来 *** 作的
.build();
}
return INSTANCE;
}
//另外我们还需要通过一个抽象方法来获取Dao
public abstract Dao getDao();
}
这样准备工作就做好了
3.主活动中创建数据库并获取Daopublic class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BookDatabase bookDatabase = BookDatabase.getDatabase(this);
BookDao dao = bookDatabase.getDao();
//接下来就可以使用Dao中的方法来实现 *** 作了
//========注意在下面的升级数据库中我们会屏蔽掉这一段,通常我们也是使用上面的 *** 作
BookDatabase bookDatabase1 = Room.databaseBuilder(this,BookDatabase.class,"book_database")
.allowMainThreadQueries()
.build();
//====================================
BookDao dao1 = bookDatabase1.getDao();
Button button = findViewById(R.id.insert);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book("小说",29.0);
dao.insertBook(book);
dao1.insertBook(book);
}
});
}
}
三、进阶 *** 作之升级数据库
1.新增字段(列),升级数据库
首先我们在实体类里添加一个字段,比如
@ColumnInfo(name = "price")
private double price;
//这个类中添加对应的get和set哦,构造方法可以不用改
2.修改BookDatabase类,首先将类的标注,对应的版本号加1
接着修改内容,提供一个静态方法Migration,在重写的方法中使用SQL语句来添加字段,再修改上面的getDatabase方法,如下
public abstract class BookDatabase extends RoomDatabase {
//我们对数据的 *** 作为了避免被滥用实例化,使用单例模式,singleTon,并且加锁
private static BookDatabase INSTANCE;
//创建一个方法,这个方法返回一个BookDatabase
public synchronized static BookDatabase getDatabase(Context context){
if (INSTANCE==null){
//如果为创建这个数据库,那么就呼叫builder来创建数据库
INSTANCE = Room.databaseBuilder(context,BookDatabase.class,"BOOK_DATABASE")
.allowMainThreadQueries()//这个是强制运行在主线程 *** 作,这个一般不推荐,都是需要重开子线程来 *** 作的
.addMigrations(MIGRATION_2_3)//===============================这句是添加的
.build();
}
return INSTANCE;
}
//另外我们还需要通过一个抽象方法来获取Dao
public abstract BookDao getDao();
//这个方法我们也可以单独开一个类继承Migration
static final Migration MIGRATION_2_3 = new Migration(2,3) { //=============新增方法
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE Book ADD COLUMN pager varchar");
}
};
}
四、进阶 *** 作之升级数据库(减少字段)
这个相对于增加字段来说麻烦的多,我们这里按照上面说的,将Migration类拿出来,单独创建,记得先将实体类中不想要的字段删除先
public class myMigration extends Migration {
/**
* Creates a new migration between {@code startVersion} and {@code endVersion}.
*
* @param startVersion The start version of the database.
* @param endVersion The end version of the database after this migration is applied.
*/
public myMigration(int startVersion, int endVersion) {
super(startVersion, endVersion);
}
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//以下全部用SQL语句
//1.在这里先创建一个新表,把不想要的那个字段去除
database.execSQL("CREATE TABLE Bookdelete (id INTEGER PRIMARY KEY NOT NULL,bookName TEXT,price double)");
//2.把数据拷贝到新表中
database.execSQL("INSERT INTO Bookdelete (id,bookName,bookName)" +
"SELECT id,bookName,bookName FROM Book");
//3.删除旧表
database.execSQL("DROP TABLE Book");
//4.将备份表名称再改为原来的名称
database.execSQL("ALTER TABLE Bookdelete RENAME TO Book");
}
//接着修改BookDatabase类
//1.先改版本号
//2.再修改方法,注意如果一起修改过,痕迹最好保留
五、多表链接(感觉目前学的不好,后面再补吧)
总结
继续学习,每天一小步,实现一大步。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)