鴻蒙開發(fā)實戰(zhàn)系列之五:鴻蒙系統(tǒng)原生數(shù)據(jù)庫

鴻蒙開發(fā)實戰(zhàn)系列之一:鴻蒙開發(fā)實戰(zhàn)系列之一:圓角

鴻蒙開發(fā)實戰(zhàn)系列之二:鴻蒙開發(fā)實戰(zhàn)系列之二:事件總線EventBus/RxBus

鴻蒙開發(fā)實戰(zhàn)系列之三:鴻蒙開發(fā)實戰(zhàn)系列之三:網(wǎng)絡請求(原生+ Retrofit)

鴻蒙開發(fā)實戰(zhàn)系列之四:鴻蒙開發(fā)實戰(zhàn)系列之四:數(shù)據(jù)庫NoSQL-ObjectBox的使用

前言

上文介紹了ObjectBox垄潮,屬于神器,但是作為一個合格的碼農(nóng)胡桃,上的了廳堂鹉勒,下得了豬圈脯倚,神器好用锹淌,菜刀也是要會使的嘛辞色,這篇我們就來介紹下鴻蒙系統(tǒng)的數(shù)據(jù)庫如何使用
鴻蒙的關系型數(shù)據(jù)庫是基于SQLite的實現(xiàn)鸽嫂,官方提供了關系型數(shù)據(jù)庫實現(xiàn)和基于對象的關系型數(shù)據(jù)庫兩種數(shù)據(jù)庫操作泥从,本文會指導大家如何分別使用這兩種數(shù)據(jù)庫操作句占,來對數(shù)據(jù)庫進行簡單的CRUD操作。

關系型數(shù)據(jù)庫

關系型數(shù)據(jù)庫(Relational Database躯嫉,RDB)是一種基于關系模型來管理數(shù)據(jù)的數(shù)據(jù)庫纱烘。HarmonyOS關系型數(shù)據(jù)庫基于SQLite組件提供了一套完整的對本地數(shù)據(jù)庫進行管理的機制,對外提供了一系列的增祈餐、刪擂啥、改、查接口帆阳,也可以直接運行用戶輸入的SQL語句來滿足復雜的場景需要哺壶。運作機制如圖:

image.png

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

//設置數(shù)據(jù)庫為RdbStore.db
StoreConfig config = StoreConfig.newDefaultConfig("RdbStore.db");    
DatabaseHelper helper = new DatabaseHelper(getContext());
RdbStore rdbStore = helper.getRdbStore(config, 1, new RdbOpenCallback() {
    @Override
    public void onCreate(RdbStore rdbStore) {
        //創(chuàng)建表
        rdbStore.executeSql("create table if not exists User(userId integer primary key autoincrement,userName text)");
        //更多建表語句可以在這里寫
    }

    @Override
    public void onUpgrade(RdbStore rdbStore, int i, int i1) {
        //升級數(shù)據(jù)庫操作
    }
});

2蜒谤、插入數(shù)據(jù)

//使用鍵值對方式插入數(shù)據(jù)庫rdbCreateDb()獲取的就是創(chuàng)建的時候生成的rdbStore
ValuesBucket values = new ValuesBucket();
values.putInteger("userId",1);
values.putString("userName","name1");
long id = rdbCreateDb().insert("User",values);

//使用最原始的sql語句插入數(shù)據(jù)
rdbCreateDb().executeSql("insert into User (userId,userName) values (2,'name2')");

3山宾、刪除數(shù)據(jù)

RdbPredicates rdbPredicates = new RdbPredicates("User").equalTo("userName","name1");
int i = rdbCreateDb().delete(rdbPredicates);

4、查詢數(shù)據(jù)

String[] columns = new String[]{"userId","userName"};
RdbPredicates rdbPredicates = new RdbPredicates("User");//構建查詢謂詞
ResultSet resultSet = rdbCreateDb().query(rdbPredicates,columns);
while (resultSet.goToNextRow()){
    int userId = resultSet.getInt(resultSet.getColumnIndexForName("userId"));
    String userName = resultSet.getString(resultSet.getColumnIndexForName("userName"));
    HiLog.warn(new HiLogLabel(HiLog.LOG_APP, 0, "===demo==="), "查詢到userId=" + userId + "  userName=" +userName);
}

5鳍徽、修改數(shù)據(jù)

RdbPredicates rdbPredicates = new RdbPredicates("User").equalTo("userName","name2");
ValuesBucket values = new ValuesBucket();
values.putString("userName","name3");
//更新數(shù)據(jù)
rdbCreateDb().update(values,rdbPredicates);

增刪改查操作都可以通過rdbStore的executeSql方法资锰,直接執(zhí)行sql語句執(zhí)行。語句語法采用SQLite的語法阶祭。

對象關系型數(shù)據(jù)庫

HarmonyOS對象關系映射(Object Relational Mapping绷杜,ORM)數(shù)據(jù)庫是一款基于SQLite的數(shù)據(jù)庫框架直秆,屏蔽了底層SQLite數(shù)據(jù)庫的SQL操作,針對實體和關系提供了增刪改查等一系列的面向?qū)ο蠼涌诒廾恕瞄_發(fā)者不必再去編寫復雜的SQL語句圾结, 以操作對象的形式來操作數(shù)據(jù)庫,提升效率的同時也能聚焦于業(yè)務開發(fā)齿诉。運作機制如圖:

image1.png

1筝野、環(huán)境配置

1、添加相應的jar包到模塊libs里面粤剧,相關文件可以在demo中找到遗座。


image2.png

2、在模塊的build.gradle中的對應添加注解引用

//開啟注解
ohos {
    compileOptions {
        annotationEnabled true
    }
}

//添加注解處理引用
dependencies {
    annotationProcessor files("./libs/orm_annotations_java.jar", "./libs/orm_annotations_processor_java.jar")
}

2俊扳、初始化數(shù)據(jù)庫配置

1、新建數(shù)據(jù)庫實現(xiàn)類

//entities里放置的是表對應的javabean猛遍,version對應數(shù)據(jù)庫版本
@Database(entities = {OrmUser.class}, version = 1)
public abstract class OrmDBTest extends OrmDatabase {
    @Override
    public RdbOpenCallback getHelper() {
        return new RdbOpenCallback() {
            @Override

            public void onCreate(RdbStore rdbStore) {
                //創(chuàng)建成功后執(zhí)行操作
            }

            @Override
            public void onUpgrade(RdbStore rdbStore, int oldVersion, int newVersion) {
               //數(shù)據(jù)庫升級需要執(zhí)行的操作
            }
        };
    }
}

2馋记、新建表對應的JavaBean

//對應的數(shù)據(jù)庫表名寫在注解里,另外記得get/set要寫齊全
@Entity(tableName = "OrmUser")
public class OrmUser extends OrmObject {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private int userId;
    private String userName;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
}

3懊烤、ORM對數(shù)據(jù)庫的基本操作

1梯醒、創(chuàng)建數(shù)據(jù)庫上下文操作對象

private OrmContext ormCreateDb() {
    DatabaseHelper databaseHelper = new DatabaseHelper(getContext());
    OrmContext ormContext = databaseHelper.getOrmContext("OrmDBTest", "OrmDBTest.db", OrmDBTest.class);
    return ormContext;
}

2、增

OrmUser ormUser = new OrmUser();
ormUser.setUserId(1);
ormUser.setUserName("name1");
boolean isSuccess = ormCreateDb().insert(ormUser);
ormCreateDb().flush();

3腌紧、查

//查詢userId = 1的數(shù)據(jù)
OrmPredicates ormPredicates = ormCreateDb().where(OrmUser.class).equalTo("userId","1");
List<OrmUser> ormUsers =  ormCreateDb().query(ormPredicates);

4茸习、改

//將查詢出來的數(shù)據(jù)值修改后更新到數(shù)據(jù)庫
OrmUser ormUser = ormQuery();
if (ormUser == null){
    return;
}
ormUser.setUserName("name2");
ormCreateDb().update(ormUser);
ormCreateDb().flush();

5、刪

//將查詢出來的數(shù)據(jù)值從數(shù)據(jù)庫中刪除
OrmUser ormUser = ormQuery();
if (ormUser == null){
    return;
}
ormCreateDb().delete(ormUser);
ormCreateDb().flush();

總結(jié)

數(shù)據(jù)庫中連接池的最大數(shù)量是4個壁肋,同一時間只能支持一個寫操作号胚!對象關系型數(shù)據(jù)的數(shù)據(jù)庫類型只支持基礎數(shù)據(jù)類型及Date、Time浸遗、Timestamp猫胁、Calendar、Blob(二進制大對象)跛锌、Clob(字符大對象)
文中相關的代碼在git:https://github.com/maolinnan/HarmonyosClass

這是本系列的第五篇弃秆,后面還會為大家?guī)砀嗟镍櫭筛韶洠凑埰诖?.....髓帽。

如果文章對您有一點啟發(fā)的話菠赚,希望您能點個贊,來一波關注郑藏。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衡查,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子译秦,更是在濱河造成了極大的恐慌峡捡,老刑警劉巖击碗,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異们拙,居然都是意外死亡稍途,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門砚婆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來械拍,“玉大人,你說我怎么就攤上這事装盯】缆牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵埂奈,是天一觀的道長迄损。 經(jīng)常有香客問我,道長账磺,這世上最難降的妖魔是什么芹敌? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮垮抗,結(jié)果婚禮上氏捞,老公的妹妹穿的比我還像新娘。我一直安慰自己冒版,他們只是感情好液茎,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辞嗡,像睡著了一般捆等。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上续室,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天楚里,我揣著相機與錄音,去河邊找鬼猎贴。 笑死班缎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的她渴。 我是一名探鬼主播达址,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趁耗!你這毒婦竟也來了沉唠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤苛败,失蹤者是張志新(化名)和其女友劉穎满葛,沒想到半個月后径簿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嘀韧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年篇亭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锄贷。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡译蒂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谊却,到底是詐尸還是另有隱情柔昼,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布炎辨,位于F島的核電站捕透,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碴萧。R本人自食惡果不足惜激率,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勿决。 院中可真熱鬧,春花似錦招盲、人聲如沸低缩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咆繁。三九已至,卻和暖如春顶籽,著一層夾襖步出監(jiān)牢的瞬間玩般,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工礼饱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坏为,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓镊绪,卻偏偏與公主長得像匀伏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蝴韭,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容