ORMLite蛤袒、GreenDAO
Room 持久性庫(kù)在 SQLite 上提供了一個(gè)抽象層,以便在充分利用 SQLite 的強(qiáng)大功能的同時(shí)葫录,能夠流暢地訪問(wèn)數(shù)據(jù)庫(kù)阀湿。具體來(lái)說(shuō),Room 具有以下優(yōu)勢(shì):
- 針對(duì) SQL 查詢的編譯時(shí)驗(yàn)證瑰妄。
- 可最大限度減少重復(fù)和容易出錯(cuò)的樣板代碼的方便注解陷嘴。
- 簡(jiǎn)化了數(shù)據(jù)庫(kù)遷移路徑。
出于這些方面的考慮间坐,我們強(qiáng)烈建議您使用 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.數(shù)據(jù)庫(kù)類竹宋,用于保存數(shù)據(jù)庫(kù)并作為應(yīng)用持久性數(shù)據(jù)底層連接的主要訪問(wèn)點(diǎn)劳澄。
2.數(shù)據(jù)實(shí)體,用于表示應(yīng)用的數(shù)據(jù)庫(kù)中的表蜈七。
3.數(shù)據(jù)訪問(wèn)對(duì)象(DAO)秒拔,提供您的應(yīng)用可用于查詢、更新飒硅、插入和刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)的方法砂缩。
image.png
3.數(shù)據(jù)實(shí)體
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
4.數(shù)據(jù)訪問(wèn)對(duì)象(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.數(shù)據(jù)庫(kù)
@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聯(lián)合使用
@Query("SELECT * FROM student")
public LiveData<List<Student>> getAllLive();
8.數(shù)據(jù)庫(kù)升級(jí)
MyDatabase.class里(version=2),數(shù)據(jù)庫(kù)版本從1升級(jí)到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字段
升級(jí)是逐步升級(jí) 1->2, 2->3
9.銷毀重建
修改表的字段類型,需要
1.新建一個(gè)temp雀监,
2.復(fù)制數(shù)據(jù)双吆,
3.刪除原表,
4.重命名