ジェットパックシリーズ[X] - データベースを操作するルーム

データベースの部屋のJetpackの組立作業

気持ちが学習のJetpackの私たちの旅にここに、まだ非常に良いですが、Googleはジェットパックライブラリを作成読みます

この記事に含まれるすべてのソースコード- > https://github.com/ddssingsong/AnyTool

簡単な紹介

公式:

ルームの永続化ライブラリ、データベースへのより信頼性の高いアクセスをsqliteののパワーを最大限に活用するために、同時に、sqliteの上の抽象レイヤを提供します。

ライブラリは、アプリケーションを実行しているデバイス上のキャッシュアプ​​リケーションデータを作成するのに役立ちます。このキャッシュは、ユーザーが関係なく、ユーザーがインターネットに接続されているかどうかに、同じアプリケーションの重要な情報のコピーを表示することができ、アプリケーションの唯一の真の源です。

エッセンス:

実際には、ノートの多くを費やして、ORMライブラリは、また、他のコンポーネントのジェットパックと組み合わせて使用​​することができます。

メインクラス

  1. @database:@databaseは、クラスに注釈を付けるために使用され、注釈付きクラスがRoomDatabase抽象クラスから継承する必要があります。このクラスの主な役割は、データベースを作成し、DAOS(データアクセスオブジェクト、データアクセスオブジェクト)を作成することです。
  2. @Entity:エンティティクラスに注釈を付けるために使用される@Entityは、@データベースの参照は、エンティティ@Entityプロパティでクラスを注釈を付けて、テーブルを作成するために、テーブル内の列名とクラスのすべてのフィールドを使用しています。
  3. @Dao:インタフェースまたは抽象メソッドに@Daoアノテーションは、このような効果は、データベースにアクセスするための方法を提供することです。与えられたクラス@database使用注釈は、パラメータを指定せずにクラスを注釈付きメソッドの戻り方法を有する@Dao

頼ります

implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
// test
androidTestImplementation "android.arch.persistence.room:testing:1.1.1"

定義されたエンティティクラス

本明細書で定義される@Entityアノテーション、エンティティ・クラスを使用し、2つのクラスのUserInfo MessageBean

  1. @PrimaryKey:として少なくとも1つの主キーフィールドを定義します
  2. プロパティセットの自己成長IDの自動生成を使用する場合は@PrimaryKey
  3. 主キー属性の@Entity組み合わせ@primaryKeys
  4. ルームは@ColumnInfo(名前=「***」)を使用するように変更される列名にフィールド名としてデフォルトで使用されています
  5. インデックスを追加するには、プロパティのインデックスを使用して@Entity
  6. 外部キー制約@ForeignKey

ユーザー情報


// @Entity(primaryKeys = {"userId", "userName"})  // 组合主键
// @Entity(indices = {@Index(name = "userName", value = {"name"}), @Index(name = "email", value = {"email"})})                              // 创建索引

@Entity(tableName = "user_info")
public class UserInfo {
    @PrimaryKey
    @ColumnInfo(name = "userId")
    private long userId;
    @ColumnInfo(name = "userName")
    private String userName;
    @ColumnInfo(name = "nickName")
    private String nickName;
    @ColumnInfo(name = "avatar")
    private String avatar;
    @ColumnInfo(name = "email")
    private String email;
 }
    

MessageBean

// 外键的写法
//@Entity(foreignKeys = {
//        @ForeignKey(entity = UserInfo.class, parentColumns = {"userId"}, childColumns = //        {"userId"}),
//        @ForeignKey(entity = UserInfo.class, parentColumns = {"userId"}, childColumns = //        {"fromId"})})
  
@Entity(tableName = "message")
public class MessageBean {
    @ColumnInfo(name = "msgId")
    private long msgId;
    @ColumnInfo(name = "userId")
    private long userId;
    @ColumnInfo(name = "fromId")
    private long fromId;
    @ColumnInfo(name = "content")
    private String content;
    @ColumnInfo(name = "mediaFilePath")
    private String mediaFilePath;
    @ColumnInfo(name = "updateTime")
    private long updateTime;
    @ColumnInfo(name = "msgType")
    private int msgType;

データへのアクセス

主データベースCRUD用DAOコアデータ定義

@Dao
public interface UserDao {

    @Query("Select * from user_info")
    List<UserInfo> getAll();

    @Insert
    void insert(UserInfo users);

    @Delete
    void delete(UserInfo users);

    @Update
    void update(UserInfo users);
}

データベースを作成します。

主クラスは、特定の条件注釈を満たすために必要なデータホルダークラスで使用@database注釈

  1. あなたはRoomDatabaseを継承しなければなりません
  2. 方法は、少なくとも@Daoで注釈抽象クラスを含みます
  3. エンティティは、エンティティリストのパラメータに関連するデータベースに含ま
  4. 初期の例は、長い時間がかかり、単一の実施形態の例を初期化する必要があります
@Database(entities = {UserInfo.class, MessageBean.class}, version = 1)
public abstract class AppDataBase extends RoomDatabase {
    // 用户信息操作类
    public abstract UserDao getUserDao();
    // 消息列表操作类
    public abstract MessageDao getMessageDao();
}

実施形態は、外向きに単を用いる方法を提供します

  private static final String DB_NAME = "room_db";
    // 静态内部类
    private static class Holder {
        private volatile static AppDataBase appDataBase = null;

        static AppDataBase getInstance(Context context) {
            if (appDataBase == null) {
                synchronized (AppDataBase.class) {
                    if (appDataBase == null) {
                        appDataBase = buildDatabase(context);
                    }
                }
            }
            return appDataBase;
        }

        private static AppDataBase buildDatabase(Context context) {
            return Room.databaseBuilder(context, AppDataBase.class, DB_NAME)
                    .addCallback(new RoomDatabase.Callback() {
                        @Override
                        public void onCreate(@NonNull SupportSQLiteDatabase db) {
                            super.onCreate(db);
                            // 第一次创建数据库会回调此方法,可以做初始化数据之类的操作
                            Log.e(DB_NAME, "room_db 数据库第一次创建成功!");
                            
                        }

                        @Override
                        public void onOpen(@NonNull SupportSQLiteDatabase db) {
                            super.onOpen(db);
                            Log.e(DB_NAME, "room_db 数据库 onOpen!");
                        }
                    })
                    .build();
        }
    }
    // 向外提供方法
    public static AppDataBase getAppDataBase(Context context) {
        return Holder.getInstance(context);
    }

データの挿入

  UserInfo userInfo = new UserInfo();
    userInfo.setUserId(new Random().nextInt(10000));
    userInfo.setUserName("大大帅");
    userInfo.setNickName("屠~~");
    userInfo.setAvatar("jpeg");
    userInfo.setEmail("[email protected]");
                AppDataBase.getAppDataBase(RoomActivity.this).getUserDao().insert(userInfo);

データを削除します。

UserInfo userInfo = new UserInfo();
userInfo.setUserId(4934); // 主键
AppDataBase.getAppDataBase(RoomActivity.this).getUserDao().delete(userInfo);

データの更新

UserInfo userInfo = AppDataBase.getAppDataBase(RoomActivity.this).getUserDao().getUser();
userInfo.setUserName("小小帥");
                AppDataBase.getAppDataBase(RoomActivity.this).getUserDao().update(userInfo);

継続するには...

ヒント

この記事に含まれるコードのすべて:https://github.com/ddssingsong/AnyTool

おすすめ

転載: blog.csdn.net/u011077027/article/details/92655922