吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenHarmony關系型數據庫概述

ITMING ? 來源:ITMING ? 作者:ITMING ? 2023-03-28 18:08 ? 次閱讀

1 概述

關系型數據庫(Relational Database, 以下簡稱RDB)是一種基于關系模型來管理數據的數據庫,是在SQLite基礎上提供一套完整的對本地數據庫進行管理的機制,為開發者提供無需編寫原生SQL語句即可實現數據增、刪、改、查等接口,同時開發者也可以直接運行原生SQL語句來滿足復雜的場景需要。關系型數據庫在應用卸載之后,才會被自動清除。

2 運作機制

RDB對外提供通用的接口,底層使用SQLite作為持久化存儲引擎,支持SQLite具有的所有數據庫特性。SQLite是一個進程內的庫,具有自給自足、無服務、零配置、事務性特性的SQL數據庫引擎。RDB包括但不限于事務、索引、視圖、觸發器、外鍵、參數化查詢和預編譯SQL語句。

3 使用場景

  • 通訊錄
  • 記事本
  • 計算器歷史記錄
  • App用戶登錄信息
  • App主題
  • ...

4 流程

5 詳細步驟

RDB對開發者提供的接口大部分為異步接口,均有callbackPromise兩種返回形式,接下來將會一一介紹。

5.1 導入模塊

import relationalStore from '@ohos.data.relationalStore';

5.2 配置數據庫相關信息

創建數據庫時需要配置數據庫相關信息,RDB提供管理關系型數據庫配置的StoreConfig接口,其參數如表5-1所示:

表5-1 關系型數據庫配置參數

名稱 類型 必填 說明
name string 數據庫文件名
securityLevel SecurityLevel(詳見表5-2) 設置數據庫安全級別
encrypt boolean 指定數據庫是否加密。true:加密。false:非加密。

表5-2 數據庫的安全級別枚舉

名稱 說明
S1 1 數據庫安全級別為低級別,當數據泄露時會產生較低影響。如包含壁紙等系統數據的數據庫。
S2 2 數據庫安全級別為中級別,當數據泄露時會產生較大影響。如包含錄音、視頻等用戶生成數據或通話記錄等信息的數據庫。
S3 3 數據庫安全級別為高級別,當數據泄露時會產生重大影響。如包含用戶運動、健康、位置等信息的數據庫。
S4 4 數據庫安全級別為關鍵級別,當數據泄露時會產生嚴重影響。如包含認證憑據、財務數據等信息的數據庫。
const store_config = {
    name: "RdbSample.db",
    securityLevel: relationalStore.SecurityLevel.S4,
    encrypt: true
}

5.3 創建數據庫

和MySQL、Oracle等數據庫類似,在使用之前需要先創建數據庫,RDB提供了getRdbStore()方法用于創建數據庫,該方法需要傳入應用上下文Context和數據庫配置信息StoreConfig兩個參數,該方法有callbackPromise兩種返回形式,如表5-3所示。

表5-3 數據庫創建方法

方法名 描述
getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback): void 獲得一個相關的RdbStore,操作關系型數據庫。context: 應用上下文config: 數據庫配置信息callback: 回調函數,返回RdbStore對象
getRdbStore(context: Context, config: StoreConfig): Promise 獲得一個相關的RdbStore,操作關系型數據庫。context: 應用上下文config: 數據庫配置信息Promise: Promise對象,返回RdbStore對象
// callback形式
relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, rdbStore) => {
  if (err) {
    Log.error(TAG, "Get RdbStore fialed, err: " + JSON.stringify(err))
    return;
  }
  // rdbStore相關操作
  Log.info(TAG, "Get RdbStore successfully.");
})

// Promise形式
relationalStore.getRdbStore(this.context, STORE_CONFIG).then((rdbStore) => {
  // rdbStore相關操作
  Log.info(TAG, "Get RdbStore successfully.");
}).catch((err) => {
  Log.error(TAG, "Get RdbStore fialed, err: " + JSON.stringify(err))
})

注:RDB不僅提供了數據庫創建的方法,同時還提供了刪除數據庫方法,可以調用deleteRdbStore()方法進行數據庫刪除,使用方式和getRdbStore()方法類似。

5.4 數據表操作

創建數據庫后,獲取到RdbStore實例。RdbStore提供管理RDB方法的接口,在使用其增、刪、改、查等接口之前,需要使用executeSql接口初始化數據表結構和相關數據。

5.4.1 創建數據表

executeSql()方法執行包含指定參數但不返回值得SQL語句,有callbackPromise兩種形式,如表5-4所示。

表5-4 創建數據表方法

方法名 描述
executeSql(sql: string,bindArgs: Array, callback: AsyncCallback): void 執行包含指定參數但不返回值得SQL語句。sql: 指定要執行得SQL語句bindArgs: SQL語句中參數的值callback: 回調函數
executeSql(sql: string,bindArgs: Array): Promise 執行包含指定參數但不返回值得SQL語句。sql: 指定要執行得SQL語句bindArgs: SQL語句中參數的值Promise: 無返回結果的Promise對象

注:表中的ValueType用于表示允許的數據字段類型,當前僅支持表示值類型為數字的number,表示值類型為字符的string,表示值類型為布爾值的boolean

const sql = "CREATE TABLE IF NOT EXISTS USER (ID INTEGER PRIMARY KEY AUTOINCREMENT, USERNAME TEXT NOT NULL, PASSWORD TEXT NOT NULL)"
// callback形式
rdbStore.executeSql(sql, null, (err) {
  if (err) {
    Log.error(TAG, "ExecuteSql failed, err: " + JSON.stringify(err));
    return;
  }
  Log.info(TAG, "Create table done.");
})
// Promise形式
rdbStore.executeSql(sql, null).then(() => {
  Log.info(TAG, "Create table done.");
}).catch((err) => {
  Log.error(TAG, "ExecuteSql failed, err: " + JSON.stringify(err));
})

5.4.2 新增數據

RdbStore提供了單條數據插入和批量數據插入兩種為數據表新增數據的方法,如表5-5所示。

表5-5 新增數據方法

方法名 描述
insert(table: string, values: ValuesBucket, callback: AsyncCallback):void 向表中插入一行數據。table: 插入數據的目標表名稱values: 插入到表中的數據行callback: 回調函數。插入成功,返回行ID,否則返回-1
insert(table: string, values: ValuesBucket): Promise 向表中插入一行數據。table: 插入數據的目標表名稱values: 插入到表中的數據行Promise: Promise對象。插入成功,返回行ID,否則返回-1
batchInsert(table: string, values: Array, callback: AsyncCallback):void 向表中插入一組數據table: 插入數據的目標表名稱插入到表中的一組數據callback: 回調函數。插入成功,返回插入的數據個數,否則返回-1
batchInsert(table: string, values: Array):Promise 向表中插入一組數據table: 插入數據的目標表名稱插入到表中的一組數據Promise: Promise對象。插入成功,返回插入的數據個數,否則返回-1

注:表5-5中ValuesBucket是用于存儲鍵值對的類型,其鍵為string類型,值類型可為ValueType|Uint8Array|null

const tableName = "USER";
const valueBacket = {
  "USERNAME": "Admin",
  "PASSWORD": "123456"
}
// insert callback形式
rdbStore.insert(tableName, valueBucket, (err, rowId) => {
  if (err) {
    Log.error(TAG, "Insert data failed, err: " + JSON.stringify(err));
    return;
  }
  Log.info(TAG, "Insert data successful, rowId = " + rowId);
})
// insert Promise形式
rdbStore.insert(tableName, valueBucket).then((rowId) => {
  Log.info(TAG, "Insert data successful, rowId = " + rowId);
}).catch((err) => {
  Log.error(TAG, "Insert data failed, err: " + JSON.stringify(err));
})

const valueBuckets = [{
  "USERNAME": "aaa",
  "PASSWORD": "123456"
}, {
  "USERNAME": "bbb",
  "PASSWORD": "123456"
}]
// batchInsert callback形式
rdbStore.batchInsert(tableName, valueBuckets, (err, count) => {
  if (err) {
    Log.error(TAG, "batchInsert data failed, err: " + JSON.stringify(err));
    return;
  }
  Log.info(TAG, "batchInsert data successful, count = " + count);
})
// batchInsert Promise形式
rdbStore.batchInsert(tableName, valueBuckets).then((count) => {
  Log.info(TAG, "batchInsert data successful, count = " + count);
}).catch((err) => {
  Log.error(TAG, "batchInsert data failed, err: " + JSON.stringify(err));
})

5.4.3 更新數據

RdbStore提供了根據RdbPredicates指定實例對象和根據DataSharePredicates指定實例對象兩種方式更新數據表中的數據,兩種方式均有callbackPromise形式,如表5-6所示。

RdbPredicatesDataSharePredicates均用于數據表中用來代表數據實體的性質、特征或者數據實體之間關系的詞項,主要用于定義數據表的操作條件。如設置根據賬號查找用戶信息的條件,或者根據賬號修改用戶密碼的條件。兩者區別在于使用前者需要先指定操作的數據表名稱,同時前者為分布式數據操作做了擴充。使用后者需要導入新模塊import dataSharePredicates from '@ohos.data.dataSharePredicates';

表5-6 更新數據方法

方法名 描述
update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback):void 根據RdbPredicates的指定實例對象更新數據庫中的數據。values: 數據表中要更新的數據行predicates: RdbPredicates的實例對象指定的更新條件callback: 回調函數,返回受影響的行數
update(values: ValuesBucket, predicates: RdbPredicates):Promise 根據RdbPredicates的指定實例對象更新數據庫中的數據。values: 數據表中要更新的數據行predicates: RdbPredicates的實例對象指定的更新條件Promise: Promise對象,返回受影響的行數
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback): void 根據DataSharePredicates的指定實例對象更新數據表的數據。table: 更新數據表的名稱values: 數據表中要更新的數據行predicates: DataSharePredicates的實例對象指定的更新條件callback: 回調函數,返回受影響的行數
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates): Promise 根據DataSharePredicates的指定實例對象更新數據表的數據。table: 更新數據表的名稱values: 數據表中要更新的數據行predicates: DataSharePredicates的實例對象指定的更新條件Promise: Promise對象,返回受影響的行數
const tableName = "USER";
const valueBucket = {
  "USERNAME": "aaa",
  "PASSWORD": "123456789"
}

// RdbPredicates
let predicates = new relationalStore.RdbPredicates(tableName);
predicates.equalTo("USERNAME", "aaa");
// update callback形式
rdbStore.update(valueBucket, predicates, (err, rows) => {
  if (err) {
    Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
    return;
  }
  Log.info(TAG, "Updated row count: " + rows);
})
// update Promise形式
rdbStore.update(valueBucket, predicates).then((rows) => {
  Log.info(TAG, "Updated row count: " + rows);
}).catch((err) => {
  Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
})

// DataSharePredicates
let predicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo("USERNAME", "aaa");
// update callback形式
rdbStore.update(tableName, valueBucket, predicates, (err, rows) => {
  if (err) {
    Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
    return;
  }
  Log.info(TAG, "Updated row count: " + rows);
})
// update Promise形式
rdbStore.update(tableName, valueBucket, predicates).then((rows) => {
  Log.info(TAG, "Updated row count: " + rows);
}).catch((err) => {
  Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
})

5.4.4 查詢數據

數據表數據的查詢和更新相似,RdbStore也提供了RdbPredicatesDataSharePredicates兩種方式,如表5-7所示。不同之處在于返回的結果不同,更新數據返回受影響的行數,查詢數據返回的數據結果集ResultSet,關于結果集詳細講解將在下一節介紹。

表5-7 查詢數據方法

方法名 描述
query(predicates: RdbPredicates, columns: Array, callback: AsyncCallback): void 根據RdbPredicates的指定實例對象條件查詢數據表中的數據。predicates: RdbPredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列callback: 回調函數,操作成功,返回ResultSet對象
query(predicates: RdbPredicates, columns: Array): Promise 根據RdbPredicates的指定實例對象條件查詢數據表中的數據。predicates: RdbPredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列Promise: Promise對象,操作成功,返回ResultSet對象
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array, callback: AsyncCallback): void 根據DataSharePredicates的指定實例對象條件查詢數據表中的數據。table: 查詢數據表名稱predicates: DataSharePredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列callback: 回調函數,操作成功,返回ResultSet對象
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array): Promise 根據DataSharePredicates的指定實例對象條件查詢數據表中的數據。table: 查詢數據表名稱predicates: DataSharePredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列Promise: Promise對象,操作成功,返回ResultSet對象
const tableName = "USER";
// RdbPredicates
let predicates = new relationalStore.RdbPredicates(tableName);
predicates.equalTo("USERNAME", "aaa");
// query callback形式
rdbStore.query(predicates, null, (err, resultSet) => {
  if (err) {
    Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
    return;
  }
  Log.info(TAG, "Query successful.");
  Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
})
// query Promise形式
rdbStore.query(predicates, null).then((resultSet) => {
  Log.info(TAG, "Query successful.");
  Log.info(TAG, "ResultSet column count: " + resultSet.columnCoun
}).catch((err) => {
    Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
})

// DataSharePredicates
let predicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo("USERNAME", "aaa");
// query callback形式
rdbStore.query(tableName, predicates, null, (err, resultSet) => {
  if (err) {
    Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
    return;
  }
  Log.info(TAG, "Query successful.");
  Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
})
// query Promise形式
rdbStore.query(tableName, predicates, null).then((resultSet) => {
  Log.info(TAG, "Query successful.");
  Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
}).catch((err) => {
    Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
})

5.4.5 刪除數據

表5-8 刪除數據方法

方法名 描述
delete(predicates: RdbPredicates, callback: AsyncCallback):void 根據RdbPredicates指定實例對象從數據表中刪除數據predicates: RdbPredicates實例對象指定的刪除條件callback: 回調函數,返回受影響的行數
delete(predicates: RdbPredicates):Promise 根據RdbPredicates指定實例對象從數據表中刪除數據predicates: RdbPredicates實例對象指定的刪除條件Promise: Promise對象,返回受影響的行數
delete(table: string, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback):void 根據DataSharePredicates指定實例對象從數據表中刪除數據table: 刪除數據的數據表名稱predicates: DataSharePredicates實例對象指定的刪除條件callback: 回調函數,返回受影響的行數
delete(table: string, predicates: dataSharePredicates.DataSharePredicates):Promise 根據DataSharePredicates指定實例對象從數據表中刪除數據table: 刪除數據的數據表名稱predicates: DataSharePredicates實例對象指定的刪除條件Promise: 回調函數,返回受影響的行數
const tableName = "USER";
// RdbPredicates
let predicates = new relationalStore.RdbPredicates(tableName);
predicates.equalTo("USERNAME", "aaa");
// delete callback
rdbStore.delete(predicates, (err, rows) => {
  if (err) {
    Log.error(TAG, "Delete failed, err: " + JSON.string(err));
    return;
  }
  Log.info(TAG, "Delete rows: " + rows);
})
// delete Promise
rdbStore.delete(predicates).then((rows) => {
  Log.info(TAG, "Delete rows: " + rows);
}).catch((err) => {
  Log.error(TAG, "Delete failed, err: " + JSON.string(err));
})

// DataSharePredicates
let predicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo("USERNAME", "aaa");
// delete callback
rdbStore.delete(tableName, predicates, (err, rows) => {
  if (err) {
    Log.error(TAG, "Delete failed, err: " + JSON.string(err));
    return;
  }
  Log.info(TAG, "Delete rows: " + rows);
})
// delete Promise
rdbStore.delete(tableName, predicates).then((rows) => {
  Log.info(TAG, "Delete rows: " + rows);
}).catch((err) => {
  Log.error(TAG, "Delete failed, err: " + JSON.string(err));
})

6 原生SQL操作數據表

RdbStore不僅提供了適用于增刪改查簡單易操作的接口方法,同時還支持原生SQL語句的操作。

  • querySql()方法支持使用指定SQL語句查詢數據表中的數據
const sql = "select * from user";
rdbStore.querySql(sql).then((resultSet) => {
  Log.info(TAG, "Query successful.");
  Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
}).catch((err) => {
    Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
})

7 小節

當然RdbStore還提供了其他的方法,諸如在開始執行SQL語句之前開啟事務的beginTransaction()方法、提交已執行的SQL語句的commit()方法、回滾已執行的SQL語句的rollBack()方法以及用于其他能力的方法。本節僅對RDB數據庫的簡單使用做了講解,其中涉及到RdbPredicatesDataSharePredicatesResultSet相關的更多內容將在后續封裝RDB工具類中詳細介紹。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3846

    瀏覽量

    64685
  • 關系型數據庫

    關注

    0

    文章

    8

    瀏覽量

    2345
  • OpenHarmony
    +關注

    關注

    25

    文章

    3744

    瀏覽量

    16577
收藏 人收藏

    評論

    相關推薦

    OpenHarmony關系數據庫查詢結果呈現

    `ResultSet`(結果集)是OpenHarmony關系數據庫提供查詢數據表返回結果的方法,提供了多種靈活的
    的頭像 發表于 03-28 18:06 ?1556次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>查詢結果呈現

    HarmonyOS開發案例:【關系數據庫

    使用關系數據庫的相關接口實現了對賬單的增、刪、改、查操作。
    的頭像 發表于 04-22 14:58 ?692次閱讀
    HarmonyOS開發案例:【<b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>】

    HarmonyOS開發案例:【搭建關系數據庫】(4)

    本節將介紹如何調用關系數據庫接口在本地搭建數據庫,并讀寫相應的用戶數據
    的頭像 發表于 05-11 10:27 ?999次閱讀
    HarmonyOS開發案例:【搭建<b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>】(4)

    關系數據庫與非關系數據庫的區別淺析

    關系數據庫的一個劣勢就是 阻抗失諧(impedance mismatch):關系模型和內存中的數據結構之間存在差異
    發表于 06-03 06:03

    什么是關系數據庫

    什么是關系數據庫 關系數據庫簡介   關系
    發表于 06-17 07:38 ?9125次閱讀

    什么是非關系數據庫

    什么是非關系數據庫 談到非關系數據庫設計的難點,朱海峰說:“我們可以從一些場景來看這個問題
    發表于 06-17 15:49 ?3150次閱讀

    關系數據庫是什么?

    關系數據庫是什么? 數字時代伊始,數據庫就一直是商業計算的核心組成部分。事實上,關系數據庫誕生于1970年。那一年,IBM的研究員E.F. Codd撰寫了一篇論文,概述了主
    發表于 07-31 12:26 ?2230次閱讀

    hbase和關系數據庫的區別

    hbase和關系數據庫的區別就是對于傳統數據庫,增加列對于一個項目來講,改變是非常大的。但是對于nosql,插入列和刪除列,跟傳統數據庫
    發表于 12-27 15:51 ?1.1w次閱讀
    hbase和<b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>的區別

    關系數據庫表結構的設計有什么技巧?兩個設計技巧詳細說明

    關系數據庫表結構的設計,有下面兩個設計技巧: 物理主鍵作為關聯的外鍵 關系數據庫,由多個
    發表于 10-16 10:33 ?13次下載

    數據庫學習入門資料之關系數據庫標準語言SQL的詳細資料概述

    本文檔的主要內容詳細介紹的是數據庫學習入門資料之關系數據庫標準語言SQL的詳細資料概述主要內容包括了:1 SQL概述2 數據定義3 查詢4
    發表于 10-25 16:29 ?20次下載

    數據庫教程之關系數據庫知識點總結的詳細資料概述

    本文檔的主要內容詳細介紹的是數據庫教程之關系數據庫知識點總結的詳細資料概述主要內容包括了:1 關系模型概述2
    發表于 11-28 19:44 ?4次下載
    <b class='flag-5'>數據庫</b>教程之<b class='flag-5'>關系數據庫</b>知識點總結的詳細資料<b class='flag-5'>概述</b>

    基于SQLite的鴻蒙的關系數據庫使用

    HarmonyOS關系數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改、查接口,也可以直接運行用戶輸入的SQL語句來滿足復雜的場景需
    的頭像 發表于 01-20 11:48 ?4289次閱讀
    基于SQLite的鴻蒙的<b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>使用

    輕松設計關系數據庫教程

    本文討論關系數據庫設計相關的一些內容,涉及關系模型,表結構設計等內容,以學生選修課程講述設計過程,在盡量講清楚設計要領的前提下,簡化設計內容。 本文基于MySQL數據庫為基礎,適合有一定關系
    的頭像 發表于 07-13 09:13 ?1807次閱讀

    關系數據庫的基本原理(什么是關系數據庫

    什么是關系數據庫關系數據庫,簡稱 RDBMS是由許多
    的頭像 發表于 07-10 09:06 ?1491次閱讀

    關系數據庫和非關系區別

    關系數據庫和非關系數據庫在多個方面存在顯著差異,主機推薦小編為您整理發布
    的頭像 發表于 01-10 09:58 ?121次閱讀
    钱大发888扑克| 百家乐官网网址| 兴隆县| 威尼斯人娱乐场怎么样| 百家乐官网赌博租| 百家乐官网的胜算法| 赌场百家乐是如何| 百家乐官网扎金花斗地主| 988娱乐城| 威尼斯人娱乐城真人赌博| 网上玩百家乐技巧| 百家乐官网怎么稳赢| 百家乐官网玩法秘诀| 威尼斯人娱乐城备用网址| 明溪百家乐官网的玩法技巧和规则 | 百家乐投注软件有用吗| 深圳百家乐官网的玩法技巧和规则 | 天猫百家乐娱乐城| 百家乐试玩平台| 百家乐官网娱乐网官网网| 百家乐官网注册开户| 威尼斯人娱乐网网址| 百家乐代理打| 百家乐桌游| 永利娱乐| 大发888游戏平台hgx2dafa888gw| 百家乐筹码盒| 棋牌百家乐赢钱经验技巧评测网| 杨公24山属性| 百家乐官网百战百胜| 网上百家乐官网是假| 任你博百家乐官网现金网| 武隆县| 百家娱乐城| 99棋牌游戏| 大发888 df登录| 百家乐官网投注程式| 百家乐官网游戏真人游戏| 富易堂百家乐官网娱乐城| 百家乐官网投注心态| 神人百家乐官网赌场|