Android使用Room操作數(shù)據(jù)庫(kù)流程詳解
Room的三個(gè)主要組件:
- 數(shù)據(jù)庫(kù)類,用于保存數(shù)據(jù)庫(kù)并作為應(yīng)用持久性數(shù)據(jù)底層連接的主要訪問(wèn)點(diǎn)。
- 數(shù)據(jù)實(shí)體,@Entity,表示數(shù)據(jù)庫(kù)中的表。
- 數(shù)據(jù)訪問(wèn)對(duì)象 (DAO),@Dao,提供查詢、更新、插入和刪除數(shù)據(jù)的方法。
build.gradle添加
dependencies {
def room_version = "2.4.3"implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"implementation "android.arch.persistence.room:rxjava2:$room_version"
testImplementation "android.arch.persistence.room:testing:$room_version"
}
1. 創(chuàng)建實(shí)體類User
@Entity(tableName = "users") public class User { @PrimaryKey public int uid; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; }
@Entity實(shí)體類,users表的名稱,不加默認(rèn)user
@ColumnInfo列名
@PrimaryKey主鍵
2. 創(chuàng)建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(onConflict = OnConflictStrategy.REPLACE) void insertAll(User... users); @Delete void delete(User user); }
增,刪,改:將實(shí)例與表的主鍵進(jìn)行匹配
查詢結(jié)果將自動(dòng)映射到對(duì)應(yīng)類型的字段,若未映射將報(bào)警告
3. 數(shù)據(jù)庫(kù)
抽象類AppDatabase 定義數(shù)據(jù)庫(kù)配置,并作為應(yīng)用對(duì)持久性數(shù)據(jù)的主要訪問(wèn)點(diǎn),擴(kuò)展了RommDataBase
@Database(entities = {User.class}, version = 1, exportSchema = false) public abstract class AppDataBase extends RoomDatabase { public abstract UserDao userDao(); }
4. 使用
AppDataBase db = Room.databaseBuilder(getApplicationContext(), AppDataBase.class, "database-name").build(); for (int i = 0; i < 10; i++) { User user = new User(); user.uid = i; user.firstName = "Shell" + i; user.lastName = "Hub" + i; db.userDao().insertAll( user); List<User> userList = db.userDao().getAll(); for(User user1 : userList) { Log.d("mip",""+user1.firstName); } }
為了節(jié)約獲取數(shù)據(jù)庫(kù)的時(shí)間和資源,采取單例模式
簡(jiǎn)單實(shí)現(xiàn):
public class Utils { private static AppDataBase db = null; private static Context context = null; public static AppDataBase getDb(){ if( db == null) { db = Room.databaseBuilder(context, AppDataBase.class, "database-name").build(); } return db; } public static void setContext(Context context){ Utils.context = context; } }
調(diào)用
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Utils.setContext(getApplicationContext()); new Thread(new Runnable() { @Override public void run() { AppDataBase db = Utils.getDb(); for (int i = 0; i < 10; i++) { User user = new User(); user.uid = i; user.firstName = "Shell" + i; user.lastName = "Hub" + i; db.userDao().insertAll( user); List<User> userList = db.userDao().getAll(); for(User user1 : userList) { Log.d("mip",""+user1.firstName); } } } }).start(); } }
路過(guò)的大佬們有更好的單例實(shí)現(xiàn)請(qǐng)告訴我一下,
到此這篇關(guān)于Android使用Room操作數(shù)據(jù)庫(kù)流程詳解的文章就介紹到這了,更多相關(guān)Android Room內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)socket通信統(tǒng)一接口的方法
這篇文章主要介紹了Android實(shí)現(xiàn)socket通信統(tǒng)一接口?,實(shí)現(xiàn)了統(tǒng)一接口之后確實(shí)可以使后續(xù)修改實(shí)現(xiàn)更加方便,程序結(jié)構(gòu)也更加工程化,需要的朋友可以參考下2021-12-12Android實(shí)現(xiàn)九宮格橫向左右滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)九宮格橫向左右滑動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Android開(kāi)發(fā)騰訊驗(yàn)證碼遇到的坑
這篇文章主要介紹了Android開(kāi)發(fā)騰訊驗(yàn)證碼遇到的坑,需要的朋友可以參考下2017-12-12Android用過(guò)TextView實(shí)現(xiàn)跑馬燈效果的示例
本篇文章主要介紹了Android用過(guò)TextView實(shí)現(xiàn)跑馬燈效果的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Android自定義控件之圓形/圓角的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android自定義控件之圓形/圓角的實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-03-03