安卓学习之Room *** 作数据库

安卓学习之Room *** 作数据库,第1张

安卓学习之Room *** 作数据库

文章目录 安卓学习之Room *** 作数据库 前言一、Room框架二、入门 *** 作1.引入库2.建表2.1 Entity——这个注解表示一个实例,也就是表2.2 建立数据 *** 作类Dao2.3 建立数据库类 3.主活动中创建数据库并获取Dao 三、进阶 *** 作之升级数据库1.新增字段(列),升级数据库2.修改BookDatabase类,首先将类的标注,对应的版本号加1 四、进阶 *** 作之升级数据库(减少字段)五、多表链接(感觉目前学的不好,后面再补吧)总结


前言

记录安卓学习


一、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.主活动中创建数据库并获取Dao
public 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.再修改方法,注意如果一起修改过,痕迹最好保留
五、多表链接(感觉目前学的不好,后面再补吧) 总结

继续学习,每天一小步,实现一大步。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992600.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存