記事のディレクトリ
データベースの部屋のJetpackの組立作業
気持ちが学習のJetpackの私たちの旅にここに、まだ非常に良いですが、Googleはジェットパックライブラリを作成読みます
この記事に含まれるすべてのソースコード- > https://github.com/ddssingsong/AnyTool
簡単な紹介
公式:
ルームの永続化ライブラリ、データベースへのより信頼性の高いアクセスをsqliteののパワーを最大限に活用するために、同時に、sqliteの上の抽象レイヤを提供します。
ライブラリは、アプリケーションを実行しているデバイス上のキャッシュアプリケーションデータを作成するのに役立ちます。このキャッシュは、ユーザーが関係なく、ユーザーがインターネットに接続されているかどうかに、同じアプリケーションの重要な情報のコピーを表示することができ、アプリケーションの唯一の真の源です。
エッセンス:
実際には、ノートの多くを費やして、ORMライブラリは、また、他のコンポーネントのジェットパックと組み合わせて使用することができます。
メインクラス
- @database:@databaseは、クラスに注釈を付けるために使用され、注釈付きクラスがRoomDatabase抽象クラスから継承する必要があります。このクラスの主な役割は、データベースを作成し、DAOS(データアクセスオブジェクト、データアクセスオブジェクト)を作成することです。
- @Entity:エンティティクラスに注釈を付けるために使用される@Entityは、@データベースの参照は、エンティティ@Entityプロパティでクラスを注釈を付けて、テーブルを作成するために、テーブル内の列名とクラスのすべてのフィールドを使用しています。
- @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
- @PrimaryKey:として少なくとも1つの主キーフィールドを定義します
- プロパティセットの自己成長IDの自動生成を使用する場合は@PrimaryKey
- 主キー属性の@Entity組み合わせ@primaryKeys
- ルームは@ColumnInfo(名前=「***」)を使用するように変更される列名にフィールド名としてデフォルトで使用されています
- インデックスを追加するには、プロパティのインデックスを使用して@Entity
- 外部キー制約@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注釈
- あなたはRoomDatabaseを継承しなければなりません
- 方法は、少なくとも@Daoで注釈抽象クラスを含みます
- エンティティは、エンティティリストのパラメータに関連するデータベースに含ま
- 初期の例は、長い時間がかかり、単一の実施形態の例を初期化する必要があります
@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