在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS開(kāi)發(fā)案例:【搭建關(guān)系型數(shù)據(jù)庫(kù)】(4)

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-11 10:27 ? 次閱讀

本節(jié)將介紹如何調(diào)用關(guān)系型數(shù)據(jù)庫(kù)接口在本地搭建數(shù)據(jù)庫(kù),并讀寫(xiě)相應(yīng)的用戶(hù)數(shù)據(jù)。

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

要使用關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)用戶(hù)數(shù)據(jù),首先要進(jìn)行數(shù)據(jù)庫(kù)的創(chuàng)建,并提供基本的增、刪、查、改接口。

導(dǎo)入關(guān)系型數(shù)據(jù)庫(kù)模塊:

import data_rdb from '@ohos.data.rdb';

開(kāi)發(fā)前請(qǐng)熟悉鴻蒙開(kāi)發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]
關(guān)系型數(shù)據(jù)庫(kù)提供以下兩個(gè)基本功能:

獲取RdbStore

首先要獲取一個(gè)RdbStore來(lái)操作關(guān)系型數(shù)據(jù)庫(kù),代碼如下:

// RdbHelperImp.ets
getRdb(context: Context): Promise< RdbHelper > {
  this.storeConfig = {
    name: this.mDatabaseName, securityLevel: dataRdb.SecurityLevel.S1
  };
  return new Promise< RdbHelper >((success, error) = > {
    dataRdb.getRdbStore(context, this.storeConfig).then(dbStore = > {
      this.rdbStore = dbStore;
      success(this);
    }).catch((err: Error) = > {
      Logger.error(`initRdb err : ${JSON.stringify(err)}`);
      error(err);
    })
  })
}

封裝增、刪、改、查接口

關(guān)系型數(shù)據(jù)庫(kù)接口提供的增、刪、改、查操作均有callback和Promise兩種異步回調(diào)方式,本Codelab使用了callback異步回調(diào),其中插入數(shù)據(jù)使用了insert()接口,實(shí)現(xiàn)代碼如下:

// RdbHelperImp.ets
insert(tableName: string, values: dataRdb.ValuesBucket | Array< dataRdb.ValuesBucket >): Promise< number > {
  return new Promise< number >((success, error) = > {
    Logger.info(`insert tableName : ${tableName}, values : ${JSON.stringify(values)}`);
    if (!values) {
      Logger.info(`insert failed, values is undefined`);
      error(0);
      return;
    }
    if (values instanceof Array) {
      Logger.info(`insert values isArray = ${values.length}`);
      this.rdbStore.beginTransaction();
      this.saveArray(tableName, values).then(data = > {
        Logger.info(`insert success, data : ${JSON.stringify(data)}`);
        success(data);
        this.rdbStore.commit();
      }).catch((err: Error) = > {
        Logger.error(`insert failed, err : ${err}`);
        error(err);
        this.rdbStore.commit();
      })
    } else {
      this.rdbStore.insert(tableName, values).then(data = > {
        Logger.info(`insert success id : ${data}`);
        success(data);
        his.rdbStore.commit();
      }).catch((err: Error) = > {
        Logger.error(`insert failed, err : ${JSON.stringify(err)}`);
        error(err);
        this.rdbStore.commit();
      })
    }
  })
}

刪除數(shù)據(jù)使用了delete()接口,實(shí)現(xiàn)代碼如下:

// RdbHelperImp.ets
delete(rdbPredicates: dataRdb.RdbPredicates): Promise< number > {
  Logger.info(`delete rdbPredicates : ${JSON.stringify(rdbPredicates)}`);
  return this.rdbStore.delete(rdbPredicates);
}

更新數(shù)據(jù)使用了update()接口,實(shí)現(xiàn)代碼如下:

// RdbHelperImp.ets
update(values: dataRdb.ValuesBucket, rdbPredicates: dataRdb.RdbPredicates): Promise< number > {
  return this.rdbStore.update(values, rdbPredicates);
}

查找數(shù)據(jù)使用了query()接口,實(shí)現(xiàn)代碼如下:

// RdbHelperImp.ets
query(rdbPredicates: dataRdb.RdbPredicates, columns?: Array< string >): Promise< dataRdb.ResultSet > {
  Logger.info(`query rdbPredicates : ${JSON.stringify(rdbPredicates)}`);
  return this.rdbStore.query(rdbPredicates, columns);
}

數(shù)據(jù)庫(kù)表結(jié)構(gòu)

根據(jù)健康生活A(yù)PP的使用場(chǎng)景和業(yè)務(wù)邏輯,定義了三個(gè)數(shù)據(jù)對(duì)象,并使用三張數(shù)據(jù)表來(lái)存儲(chǔ),分別是健康任務(wù)信息表、每日信息表和全局信息表。

健康任務(wù)信息表

目前健康生活應(yīng)用提供了6個(gè)基本的健康任務(wù),分別是早起、喝水、吃蘋(píng)果、每日微笑、睡前刷牙和早睡。用戶(hù)可以選擇開(kāi)啟或關(guān)閉某個(gè)任務(wù),開(kāi)啟的任務(wù)可以選擇是否開(kāi)啟提醒,在指定的時(shí)間段內(nèi)提醒用戶(hù)進(jìn)行打卡。任務(wù)也可以選擇開(kāi)啟的頻率,如只在周一到周五開(kāi)啟等。需要記錄每項(xiàng)任務(wù)的目標(biāo)值和實(shí)際完成值,在用戶(hù)打卡后判斷任務(wù)是否已經(jīng)完成,并記錄在數(shù)據(jù)庫(kù)中。因此,需要?jiǎng)?chuàng)建一張存儲(chǔ)每天的健康任務(wù)信息的表,表頭如下:

每日信息表

在主頁(yè)面,用戶(hù)可以查看當(dāng)天健康任務(wù)的完成進(jìn)度,需要?jiǎng)?chuàng)建一張表記錄當(dāng)天開(kāi)啟的任務(wù)個(gè)數(shù)和已經(jīng)完成的任務(wù)個(gè)數(shù),表頭如下:

全局信息表

用戶(hù)連續(xù)多日打卡完成所有創(chuàng)建的任務(wù)可以獲得相應(yīng)的成就,因此,需要有一張表記錄連續(xù)打卡天數(shù)和已達(dá)成的成就項(xiàng)。另外,考慮應(yīng)用多日未打開(kāi)的情況,需要記錄應(yīng)用第一次打開(kāi)的日期和最后一次打開(kāi)的日期以向數(shù)據(jù)庫(kù)回填數(shù)據(jù),表頭如下:

創(chuàng)建數(shù)據(jù)表

根據(jù)6.2中設(shè)計(jì)的表結(jié)構(gòu),創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)表,實(shí)現(xiàn)對(duì)相應(yīng)數(shù)據(jù)的讀寫(xiě)操作。

健康任務(wù)信息數(shù)據(jù)表

在獲取RdbStore后,需要使用executeSql接口執(zhí)行SQL語(yǔ)句來(lái)創(chuàng)建相應(yīng)的表結(jié)構(gòu)和初始化數(shù)據(jù),SQL語(yǔ)句如下:

CREATE TABLE IF NOT EXISTS taskInfo(
  id INTEGER PRIMARY KEY AUTOINCREMENT, 
  date TEXT NOT NULL, 
  taskID INTEGER, 
  targetValue TEXT NOT NULL, 
  isAlarm BOOLEAN, 
  startTime TEXT NOT NULL, 
  endTime TEXT NOT NULL, 
  frequency TEXT NOT NULL, 
  isDone BOOLEAN, 
  finValue TEXT NOT NULL, 
  isOpen BOOLEAN
)

健康任務(wù)信息數(shù)據(jù)表需要提供插入數(shù)據(jù)的接口,以在用戶(hù)當(dāng)天第一次打開(kāi)應(yīng)用時(shí)創(chuàng)建當(dāng)天的健康任務(wù)信息,實(shí)現(xiàn)代碼如下:

// TaskInfoApi.ets
insertData(taskInfo: TaskInfo, callback: Function): void {
  // 根據(jù)輸入數(shù)據(jù)創(chuàng)建待插入的數(shù)據(jù)行
  const valueBucket = generateBucket(taskInfo);
  RdbUtils.insert('taskInfo', valueBucket).then(result = > {
    callback(result);
  });
  Logger.info('TaskInfoTable', `Insert taskInfo {${taskInfo.date}:${taskInfo.taskID}} finished.`);
}

其中g(shù)enerateBucket()代碼如下:

// TaskInfoApi.ets
function generateBucket(taskInfo: TaskInfo): dataRdb.ValuesBucket {
  let valueBucket = {} as dataRdb.ValuesBucket;
  Const.TASK_INFO.columns?.forEach((item: string) = > {
    if (item !== 'id') {
      switch (item) {
        case 'date':
          valueBucket[item] = taskInfo.date;
          break;
        case 'taskID':
          valueBucket[item] = taskInfo.taskID;
          break;
        case 'targetValue':
          valueBucket[item] = taskInfo.targetValue;
          break;
        case 'isAlarm':
          valueBucket[item] = taskInfo.isAlarm;
          break;
        case 'startTime':
          valueBucket[item] = taskInfo.startTime;
          break;
        case 'endTime':
          valueBucket[item] = taskInfo.endTime;
          break;
        case 'frequency':
          valueBucket[item] = taskInfo.frequency;
          break;
        case 'isDone':
          valueBucket[item] = taskInfo.isDone;
          break;
        case 'finValue':
          valueBucket[item] = taskInfo.finValue;
          break;
        case 'isOpen':
          valueBucket[item] = taskInfo.isOpen;
          break;
        default:
          break;
      }
    }
  });
  return valueBucket;
}

用戶(hù)開(kāi)啟和關(guān)閉任務(wù),改變?nèi)蝿?wù)的目標(biāo)值、提醒時(shí)間、頻率等,用戶(hù)打卡后修改任務(wù)的實(shí)際完成值都是通過(guò)更新數(shù)據(jù)接口來(lái)實(shí)現(xiàn)的,代碼如下:

// TaskInfoApi.ets
updateDataByDate(taskInfo: TaskInfo, callback: Function): void {
  const valueBucket = generateBucket(taskInfo);
  let tableName = Const.TASK_INFO.tableName;
  if (!tableName) {
    return;
  }
  let predicates = new dataRdb.RdbPredicates(tableName);
  // 根據(jù)date和taskID匹配要更新的數(shù)據(jù)行
  predicates.equalTo('date', taskInfo.date).and().equalTo('taskID', taskInfo.taskID);
  RdbUtils.update(valueBucket, predicates).then((result: number) = > {
    callback(result);
  });
  Logger.info('TaskInfoTable', `Update data {${taskInfo.date}:${taskInfo.taskID}} finished.`);
}

用戶(hù)可以查看當(dāng)天和以前某日的健康任務(wù)信息,需要提供查找數(shù)據(jù)接口,實(shí)現(xiàn)代碼如下:

// TaskInfoApi.ets
query(date: string, isOpen: boolean = true, callback: Function): void {
  let tableName = Const.TASK_INFO.tableName;
  if (!tableName) {
    return;
  }
  let predicates = new dataRdb.RdbPredicates(tableName);
  predicates.equalTo('date', date);
  // 如果isOpen為true,則只查找開(kāi)啟的任務(wù) 
  if (isOpen) {
    predicates.equalTo('isOpen', true);
  }
  predicates.orderByAsc('taskID');  // 查找結(jié)果按taskID排序
  RdbUtils.query(predicates).then(resultSet = > {
    let count = resultSet.rowCount;
    // 查找結(jié)果為空則返回空數(shù)組,否則返回查找結(jié)果數(shù)組
    if (count === 0 || typeof count === 'string') {
      Logger.error('TaskInfoTable', `${date} query no results!`);
      const result: TaskInfo[] = [];
      callback(result);
    } else {
      resultSet.goToFirstRow();
      const result: TaskInfo[] = [];
      for (let i = 0; i < count; i++) {
        let tmp = new TaskInfo(0, '', 0, '', false, '', '', '', false, '');
        tmp.isOpen = resultSet.getDouble(resultSet.getColumnIndex('isOpen')) ? true : false;
        tmp.id = resultSet.getDouble(resultSet.getColumnIndex('id'));
        tmp.date = resultSet.getString(resultSet.getColumnIndex('date'));
        tmp.taskID = resultSet.getDouble(resultSet.getColumnIndex('taskID'));
        tmp.targetValue = resultSet.getString(resultSet.getColumnIndex('targetValue'));
        tmp.isAlarm = resultSet.getDouble(resultSet.getColumnIndex('isAlarm')) ? true : false;
        tmp.startTime = resultSet.getString(resultSet.getColumnIndex('startTime'));
        tmp.endTime = resultSet.getString(resultSet.getColumnIndex('endTime'));
        tmp.frequency = resultSet.getString(resultSet.getColumnIndex('frequency'));
        tmp.isDone = resultSet.getDouble(resultSet.getColumnIndex('isDone')) ? true : false;
        tmp.finValue = resultSet.getString(resultSet.getColumnIndex('finValue'));
        result[i] = tmp;
        resultSet.goToNextRow();
      }
      callback(result);
    }
  });
}

每日信息數(shù)據(jù)表

創(chuàng)建每日信息數(shù)據(jù)表的SQL語(yǔ)句如下:

CREATE TABLE IF NOT EXISTS dayInfo(
  date TEXT NOT NULL PRIMARY KEY, 
  targetTaskNum INTEGER, 
  finTaskNum INTEGER
)

在當(dāng)天第一次打開(kāi)應(yīng)用時(shí)需要初始化每日信息數(shù)據(jù),頁(yè)面需要根據(jù)用戶(hù)編輯任務(wù)和打卡的情況來(lái)更新當(dāng)天目標(biāo)任務(wù)個(gè)數(shù)和完成任務(wù)個(gè)數(shù),所以需要提供插入數(shù)據(jù)和更新數(shù)據(jù)的接口,寫(xiě)法與上一條中相應(yīng)接口類(lèi)似,不再贅述。

頁(yè)面需要查找對(duì)應(yīng)日期的目標(biāo)任務(wù)個(gè)數(shù)和完成任務(wù)個(gè)數(shù)用以在頁(yè)面顯示任務(wù)進(jìn)度,因此需要查找數(shù)據(jù)的接口。且頁(yè)面在打開(kāi)時(shí)需要顯示當(dāng)周每天任務(wù)的完成情況,因此需要允許一次調(diào)用查找一周的每日任務(wù)信息。實(shí)現(xiàn)代碼如下:

// DayInfoApi.ets
queryList(dates: string[], callback: Function): void {
  let predicates: dataRdb.RdbPredicates = new dataRdb.RdbPredicates(Const.DAY_INFO.tableName ? Const.DAY_INFO.tableName : '');
  predicates.in('date', dates);  // 匹配日期數(shù)組內(nèi)的所有日期
  RdbUtils.query(predicates).then(resultSet = > {
    let count = resultSet.rowCount;
    if (count === 0) {
      Logger.info('DayInfoTable', 'query no results.');
      let result: DayInfo[] = [];
      callback(result);
    } else {
      resultSet.goToFirstRow();
      let result: DayInfo[] = [];
      for (let i = 0; i < count; i++) {
        let tmp = new DayInfo('', 0, 0);
        tmp.date = resultSet.getString(resultSet.getColumnIndex('date'));
        tmp.targetTaskNum = resultSet.getDouble(resultSet.getColumnIndex('targetTaskNum'));
        tmp.finTaskNum = resultSet.getDouble(resultSet.getColumnIndex('finTaskNum'));
        result[i] = tmp;
        resultSet.goToNextRow();
      }
      callback(result);
    }
  });
}

全局信息數(shù)據(jù)表

創(chuàng)建全局信息數(shù)據(jù)表的SQL語(yǔ)句如下:

CREATE TABLE IF NOT EXISTS globalInfo(
  id INTEGER PRIMARY KEY, 
  firstDate TEXT NOT NULL, 
  lastDate TEXT NOT NULL, 
  checkInDays INTEGER, achievements TEXT NOT NULL
)

全局信息數(shù)據(jù)表同樣需要提供插入數(shù)據(jù)、更新數(shù)據(jù)和查找數(shù)據(jù)的接口,寫(xiě)法與本節(jié)前兩條中相應(yīng)接口類(lèi)似,不再贅述。
HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

搜狗高速瀏覽器截圖20240326151450.png

數(shù)據(jù)庫(kù)初始化

應(yīng)用首次打開(kāi)時(shí),數(shù)據(jù)庫(kù)中沒(méi)有數(shù)據(jù),要做數(shù)據(jù)庫(kù)的初始化,寫(xiě)入一組空數(shù)據(jù)。另外,如果用戶(hù)連續(xù)幾天沒(méi)有打開(kāi)APP,再次打開(kāi)時(shí)需要將數(shù)據(jù)回寫(xiě)至數(shù)據(jù)庫(kù)。因此需要實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)接口,在應(yīng)用打開(kāi)時(shí)調(diào)用,進(jìn)行上述操作。代碼如下:

// DatabaseModel.ets
query(date: string, callback: Function) {
  let result: TaskInfo[] = [];
  let self = this;
  GlobalInfoApi.query((globalResult: GlobalInfo) = > {
    if (!globalResult.firstDate) { // 如果找不到全局信息,則寫(xiě)入
      let globalInfo: GlobalInfo = new GlobalInfo(date, date, 0, '');
      GlobalInfoApi.insertData(globalInfo, (isDone: number) = > {
        if (isDone) {
          Logger.info('AppStart', 'Insert globalInfo success: ' + JSON.stringify(globalInfo));
        }
      });
      self.insertGlobalTask();
      let dayInfo: DayInfo = new DayInfo(date, 0, 0);
      DayInfoApi.insertData(dayInfo, (isDone: number) = > {
        if (isDone) {
          Logger.info('AppStart', 'Insert dayInfo success: ' + JSON.stringify(dayInfo));
        }
      })
      self.insertTask(date);
      callback(result, dayInfo);
    } else { // 如果找到全局信息,則查詢(xún)當(dāng)天的任務(wù)信息
      let newGlobalInfo = globalResult;
      let preDate = globalResult.lastDate;
      newGlobalInfo.lastDate = date;
      GlobalInfoApi.updateData(newGlobalInfo, (isDone: number) = > {
        if (isDone) {
          Logger.info('AppStart', 'update globalInfo success: ' + JSON.stringify(newGlobalInfo));
        }
      });
      self.queryPreInfo(date, preDate, result, callback);
    }
  });
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3877

    瀏覽量

    65502
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2464

    瀏覽量

    43602
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    2005

    瀏覽量

    31747
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS開(kāi)發(fā)案例:【關(guān)系數(shù)據(jù)庫(kù)

    使用關(guān)系數(shù)據(jù)庫(kù)的相關(guān)接口實(shí)現(xiàn)了對(duì)賬單的增、刪、改、查操作。
    的頭像 發(fā)表于 04-22 14:58 ?846次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫(kù)</b>】

    關(guān)系數(shù)據(jù)庫(kù)與非關(guān)系數(shù)據(jù)庫(kù)的區(qū)別淺析

    關(guān)系數(shù)據(jù)庫(kù)的一個(gè)劣勢(shì)就是 阻抗失諧(impedance mismatch):關(guān)系模型和內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)之間存在差異
    發(fā)表于 06-03 06:03

    HarmonyOS數(shù)據(jù)庫(kù)的相關(guān)資料下載

    HarmonyOS數(shù)據(jù)庫(kù)篇之RDB關(guān)系數(shù)據(jù)庫(kù)3、HarmonyOS
    發(fā)表于 03-28 11:13

    HarmonyOS關(guān)系數(shù)據(jù)庫(kù)和對(duì)象關(guān)系數(shù)據(jù)庫(kù)的使用方法

    extends OrmDatabase { }2.表:被開(kāi)發(fā)者用@Entity注解的實(shí)體類(lèi),且繼承了OrmObject的類(lèi),對(duì)應(yīng)關(guān)系數(shù)據(jù)庫(kù)中的表。// 定義了一個(gè)實(shí)體類(lèi)User.j
    發(fā)表于 03-29 14:10

    DCS仿真系統(tǒng)的內(nèi)存-關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)的構(gòu)成

    對(duì)內(nèi)存數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行分析,設(shè)計(jì)完成內(nèi)存—關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),并在實(shí)際的DCS 仿真系統(tǒng)中進(jìn)行使用。本文介紹了所
    發(fā)表于 09-07 15:39 ?15次下載

    什么是關(guān)系數(shù)據(jù)庫(kù)

    什么是關(guān)系數(shù)據(jù)庫(kù) 關(guān)系數(shù)據(jù)庫(kù)簡(jiǎn)介   關(guān)系
    發(fā)表于 06-17 07:38 ?9159次閱讀

    什么是非關(guān)系數(shù)據(jù)庫(kù)

    什么是非關(guān)系數(shù)據(jù)庫(kù) 談到非關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)的難點(diǎn),朱海峰說(shuō):“我們可以從一些場(chǎng)景來(lái)看這個(gè)問(wèn)題
    發(fā)表于 06-17 15:49 ?3193次閱讀

    hbase和關(guān)系數(shù)據(jù)庫(kù)的區(qū)別

    hbase和關(guān)系數(shù)據(jù)庫(kù)的區(qū)別就是對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù),增加列對(duì)于一個(gè)項(xiàng)目來(lái)講,改變是非常大的。但是對(duì)于nosql,插入列和刪除列,跟傳統(tǒng)數(shù)據(jù)庫(kù)
    發(fā)表于 12-27 15:51 ?1.2w次閱讀
    hbase和<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫(kù)</b>的區(qū)別

    數(shù)據(jù)庫(kù)設(shè)計(jì)開(kāi)發(fā)案例教程之數(shù)據(jù)庫(kù)設(shè)計(jì)的資料介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫(kù)設(shè)計(jì)開(kāi)發(fā)案例教程之數(shù)據(jù)庫(kù)設(shè)計(jì)的資料介紹主要內(nèi)容包括了:1 數(shù)據(jù)庫(kù)設(shè)計(jì)概述,2 需求分析,3 概念結(jié)構(gòu)設(shè)計(jì),4
    發(fā)表于 01-11 11:20 ?17次下載
    <b class='flag-5'>數(shù)據(jù)庫(kù)</b>設(shè)計(jì)<b class='flag-5'>開(kāi)發(fā)案</b>例教程之<b class='flag-5'>數(shù)據(jù)庫(kù)</b>設(shè)計(jì)的資料介紹

    基于SQLite的鴻蒙的關(guān)系數(shù)據(jù)庫(kù)使用

    HarmonyOS關(guān)系數(shù)據(jù)庫(kù)基于SQLite組件提供了一套完整的對(duì)本地數(shù)據(jù)庫(kù)進(jìn)行管理的機(jī)制,對(duì)外提供了一系列的增、刪、改、查接口,也可以直
    的頭像 發(fā)表于 01-20 11:48 ?4596次閱讀
    基于SQLite的鴻蒙的<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫(kù)</b>使用

    OpenHarmony關(guān)系數(shù)據(jù)庫(kù)概述

    關(guān)系數(shù)據(jù)庫(kù)(Relational Database, 以下簡(jiǎn)稱(chēng)RDB)是一種基于關(guān)系模型來(lái)管理數(shù)據(jù)數(shù)
    的頭像 發(fā)表于 03-28 18:08 ?1263次閱讀
    OpenHarmony<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫(kù)</b>概述

    關(guān)系數(shù)據(jù)庫(kù)的基本原理(什么是關(guān)系數(shù)據(jù)庫(kù)

    什么是關(guān)系數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù),簡(jiǎn)稱(chēng) RDBMS是由許多數(shù)
    的頭像 發(fā)表于 07-10 09:06 ?1594次閱讀

    鴻蒙HarmonyOS開(kāi)發(fā)實(shí)例:【分布式關(guān)系數(shù)據(jù)庫(kù)

    使用[@ohos.data.relationalStore]接口和[@ohos.distributedDeviceManager]?接口展示了在eTS中分布式關(guān)系數(shù)據(jù)庫(kù)的使用,在增、刪、改、查的基本操作外,還包括分布式
    的頭像 發(fā)表于 04-11 09:52 ?1262次閱讀
    鴻蒙<b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)</b>實(shí)例:【分布式<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫(kù)</b>】

    鴻蒙開(kāi)發(fā)接口數(shù)據(jù)管理:【@ohos.data.rdb (關(guān)系數(shù)據(jù)庫(kù))】

    關(guān)系數(shù)據(jù)庫(kù)(Relational Database,RDB)是一種基于關(guān)系模型來(lái)管理數(shù)據(jù)數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 06-10 18:35 ?1654次閱讀

    關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系區(qū)別

    關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)在多個(gè)方面存在顯著差異,主機(jī)推薦小編為您整理發(fā)布
    的頭像 發(fā)表于 01-10 09:58 ?408次閱讀
    主站蜘蛛池模板: 婷婷丁香九月 | 夜夜操夜夜爱 | 免费看美女禁处爆涌视频 | 九九热在线免费观看 | 国产免费播放 | 日本黄色视屏 | 欧美黄网站 | 黄色片网站日本 | 天天天综合网 | 亚洲欧美v视色一区二区 | 天天干天天舔天天操 | 国产伦精品一区二区三区高清 | 成 黄 色 激 情视频网站 | 国产精品久久久久久久成人午夜 | 六月丁香婷婷综合 | 青楼社区51在线视频视频 | 成年女人毛片免费视频 | 免费观看美女被cao视频 | 亚洲va中文va欧美va爽爽 | 亚洲成人在线播放 | 最新精品 | 天天做天天爱夜夜爽女人爽宅 | 亚洲国产人久久久成人精品网站 | 国产福利你懂的 | 日本视频一区二区 | 美女视频永久黄网站免费观看国产 | 国产精品三级 | 手机看片国产在线 | 四虎国产一区二区三区 | 日本在线视频精品 | 韩国一区二区三区视频 | 成人a毛片视频免费看 | 成年片色大黄全免费 | 国产综合在线观看 | 熟妇毛片 | 影视精品网站入口 | h视频免费网站 | 成人激情在线 | 夜恋秀场欧美成人影院 | 中国一级生活片 | 免费免播放器在线视频观看 |