• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 網(wǎng)絡(luò)知識 > 網(wǎng)絡(luò)技術(shù) >

    Android-Room數(shù)據(jù)庫的使用方法教程

    時間: 加城1195 分享

      Room是一個持久性數(shù)據(jù)庫,提供了SQLite的抽象層,以便在充分利用SQLite的同時允許流暢的數(shù)據(jù)庫訪問。這篇文章主要介紹了詳細介紹Android-Room數(shù)據(jù)庫的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。

      為什么會選擇Room?

      前面我也說到了現(xiàn)在也有不少開源的數(shù)據(jù)庫給大家使用,那為什么我們還要去學(xué)習(xí)使用這個庫呢?當(dāng)然不是我前面說的“正不正統(tǒng)”的原因了。

      因為Room有下面幾個優(yōu)點:

      ① SQL查詢在編譯時就會驗證 - 在編譯時檢查每個@Query和@Entity等,這就意味著沒有任何運行時錯誤的風(fēng)險可能會導(dǎo)致應(yīng)用程序崩潰(并且它不僅檢查語法問題,還會檢查是否有該表)

      ② 較少的模板代碼

      ③ 與 LiveData 集成

      該如何使用它?

      1、在app/build.gradle中添加以下依賴

      implementation 'android.arch.persistence.room:runtime:1.0.0'

      annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

      你可以點擊這里查看最新依賴版本號

      2、創(chuàng)建JavaBean

      @Entity

      public class User {

      @PrimaryKey(autoGenerate = true)//主鍵是否自動增長,默認為false

      private int id;

      private String name;

      private int age;

      public int getId() {

      return id;

      }

      public void setId(int id) {

      this.id = id;

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      public int getAge() {

      return age;

      }

      public void setAge(int age) {

      this.age = age;

      }

      //這里的getter/setter方法是必須的

      }

      這里需要使用 @Entity 來注解該類

      至少要有一個主鍵 @PrimaryKey

      3、創(chuàng)建Dao

      接下來,需要為我們的實體創(chuàng)建DAO。 DAO代表數(shù)據(jù)訪問對象,所以它是告訴我們的數(shù)據(jù)庫如何操作數(shù)據(jù)的一種方式:

      @Dao

      public interface UserDao {

      @Query("SELECT * FROM user")

      List getAllUsers();

      @Insert

      void insert(User... users);

      @Update

      void update(User... users);

      @Delete

      void delete(User... users);

      }

      使用 @Dao 注解該接口

      @Insert , @Update , @Delete , @Query 代表我們常用的 插入 、 更新 、 刪除 、 查詢 數(shù)據(jù)庫操作

      @Insert , @Update , @Delete 可以傳入多種不同的參數(shù)。例如:

      @Insert

      void insert(User... users);

      @Insert

      void insert(User user);

      @Insert

      void insert(List userLists);

      同理, @Query 也可以返回多種不同的類型。

      @Query("SELECT * FROM user")

      List getAllUsers();

      @Query("SELECT * FROM user WHERE id=:id")

      User getUser(int id);

      @Query("SELECT * FROM user")

      Cursor getUserCursor();

      當(dāng)然,除了這些我們還可以傳入一些限制符進去。例如,

      @Query("SELECT * FROM user WHERE age=:age")

      List getUsersByAge(int age);

      @Query("SELECT * FROM user WHERE age=:age LIMIT :max")

      List getUsersByAge(int max, int... age);

      4、創(chuàng)建數(shù)據(jù)庫

      @Database(entities = { User.class }, version = 1,exportSchema = false)

      public abstract class UserDatabase extends RoomDatabase {

      private static final String DB_NAME = "UserDatabase.db";

      private static volatile UserDatabase instance;

      static synchronized UserDatabase getInstance(Context context) {

      if (instance == null) {

      instance = create(context);

      }

      return instance;

      }

      private static UserDatabase create(final Context context) {

      return Room.databaseBuilder(

      context,

      UserDatabase.class,

      DB_NAME).build();

      }

      public abstract UserDao getUserDao();

      }

      這里使用 @Database 注解該類并添加了 表名 、 數(shù)據(jù)庫版本 (每當(dāng)我們改變數(shù)據(jù)庫中的內(nèi)容時它都會增加),所以這里使用 exportSchema = false

      注意:除了添加表映射的類以及和數(shù)據(jù)庫版本外,還要添加 exportSchema = false 否則會報警告。

      Error:(10, 17) 警告: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false.

      我們抽象了 getUserDao() 方法,這是必要的。

      5、使用數(shù)據(jù)庫

      我們終于能夠操作我們的數(shù)據(jù)庫了。但是所有的操作必須在后臺線程中完成。你可以通過使用 AsyncTask , Thread , Handler , RxJava 或其它方式來完成。

      如果沒有在后臺線程執(zhí)行,并且也沒有說明可以在主線程操作的話,就會報以下錯誤。

      Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

      例如,我們可以像下面這樣插入數(shù)據(jù)

      User user=new User();

      user.setName("name1");

      user.setAge(18);

      UserDatabase

      .getInstance(context)

      .getUserDao()

      .insert(user);

      或者這樣

      List allUsers = UserDatabase

      .getInstance(RoomActivity.this)

      .getUserDao()

      .getAllUsers();

      好了,基本的使用的方式就這些了。

      補充:MySQL 數(shù)據(jù)庫常用命令

      create database name; 創(chuàng)建數(shù)據(jù)庫

      use databasename; 進入數(shù)據(jù)庫

      drop database name 直接刪除數(shù)據(jù)庫,不提醒

      show tables; 顯示表

      describe tablename; 查看表的結(jié)構(gòu)

      select 中加上distinct去除重復(fù)字段

      mysqladmin drop databasename 刪除數(shù)據(jù)庫前,有提示。

      顯示當(dāng)前mysql版本和當(dāng)前日期

      select version(),current_date;

      數(shù)據(jù)庫維護方法

      在MySQL使用的過程中,在系統(tǒng)運行一段時間后,可能會產(chǎn)生碎片,造成空間的浪費,所以有必要定期的對MySQL進行碎片整理。

      當(dāng)刪除id=2的記錄時候,發(fā)生的現(xiàn)象

      這個時候發(fā)現(xiàn)磁盤的空間并沒有減少。這種現(xiàn)象就叫做碎片化(有一部分的磁盤空間在數(shù)據(jù)刪除以后(空),還是無法被操作系統(tǒng)所使用。)

      常見的優(yōu)化:

      # alter table xxx engine myisam;

      # optimize table t1;

      注意: 在實際開發(fā)的過程中,上面兩個語句盡量少使用,因為在使用的過程中,MySQL的表的結(jié)構(gòu)會整體全部重新整理,需要消耗很多的資源,建議在凌晨兩三點鐘的時候執(zhí)行。(在linux下有定時器腳本可以執(zhí)行,crontab)


    數(shù)據(jù)庫相關(guān)文章:

    1.excel怎么將表格連入數(shù)據(jù)庫

    2.把Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫的方法

    3.數(shù)據(jù)庫中default的用法

    4.linux下mysql關(guān)閉數(shù)據(jù)庫命令行

    5.excel數(shù)據(jù)導(dǎo)入SQL數(shù)據(jù)庫的教程

    4015367 主站蜘蛛池模板: 本子库全彩无遮挡无翼乌触手| 韩国18福利视频免费观看| 欧美人与动人物姣配xxxx| 九九电影院理论片| 苏玥马强百文择| 婷婷丁香六月天| 亚洲欧美色一区二区三区| 亚洲人配人种jizz| 日本精品高清一区二区2021| 含羞草实验研所入口| chinese国产xxxx实拍| 欧美成人在线影院| 国产成人av一区二区三区在线观看| 久久91亚洲人成电影网站| 精品久久久久久无码中文字幕 | 波多野吉衣视频| 国产福利片在线观看| 久久国产欧美日韩精品| 精品无码久久久久久久动漫| 在线日韩av永久免费观看| 亚洲伦理一二三四| 色妞色视频一区二区三区四区 | 一区二区三区高清在线 | 亚洲人成网站18禁止久久影院| 高清国产av一区二区三区| 无码国模国产在线观看| 先锋影音男人资源| 日本三级韩国三级欧美三级| 无码人妻精品一区二区三区蜜桃 | 一级做a爰全过程免费视频| 欧美极品JIZZHD欧美| 国产另ts另类人妖| www.91亚洲| 明星造梦一区二区| 公与2个熄乱理在线播放| 男女一进一出无遮挡黄| 成黄色激情视频网站| 亚洲成a人片在线看| 翁止熄痒禁伦短文合集免费视频 | 偷自拍亚洲视频在线观看99 | 国产一区日韩二区欧美三区|