Room

ORMLite、GreenDAO

Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:

  • 针对 SQL 查询的编译时验证。
  • 可最大限度减少重复和容易出错的样板代码的方便注解。
  • 简化了数据库迁移路径。

出于这些方面的考虑,我们强烈建议您使用 Room,而不是直接使用 SQLite API

1.添加依赖

app build.gradle

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    implementation("androidx.room:room-runtime:2.4.3")
    annotationProcessor("androidx.room:room-compiler:2.4.3")
}

2.主要组件

1.数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。
2.数据实体,用于表示应用的数据库中的表。
3.数据访问对象(DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。


image.png

3.数据实体

@Entity
public class User {
    @PrimaryKey
    public int uid;

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

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

4.数据访问对象(DAO)

@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);

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

    @Delete
    void delete(User user);
}

5.数据库

@Database(entities = {User.class, Student.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
    public abstract StudentDao studentDao();
}

6.使用

AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
UserDao userDao = db.userDao();
new Thread(
    () -> {
        userDao.insertALL(new User("zhang", 20));
        List<User> all = userDao.getAll();
        System.out.println(all);

        userDao.delete(all.get(0));
        List<User> all2 = userDao.getAll();
        System.out.println(all2);

        System.out.println("------student----");
        StudentDao studentDao = db.studentDao();
        studentDao.insert(new Student(2, "li", 98));
        List<Student> all3 = studentDao.getAll();
        System.out.println(all3);
    }
).start();

7.Dao月LiveData联合使用

@Query("SELECT * FROM student")
public LiveData<List<Student>> getAllLive();

8.数据库升级

MyDatabase.class里(version=2),数据库版本从1升级到2,
 mInstance = Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "my_db.db")
                            .addMigrations(MIGRATION_1_2)//添加MIGRATION_1_2
                            .build();

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE student ADD COLUMN sex INTEGER NOT NULL DEFAULT 1");
        }
    };

同步去修改Student表,增加sex字段

升级是逐步升级 1->2, 2->3

9.销毁重建

修改表的字段类型,需要
1.新建一个temp,
2.复制数据,
3.删除原表,
4.重命名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容