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),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
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.重命名