Flutter Azure Cosmos DB操作插件dart_azure_cosmosdb的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter Azure Cosmos DB操作插件dart_azure_cosmosdb的使用

Dart包用于Azure Cosmos数据库

目录

1 特性

dart_azure_cosmosdb 提供与Azure CosmosDB SQL API的交互。 更多详细信息,请参阅Microsoft CosmosDB文档

2 开始使用

2.1 Android设置

此包使用HTTP包并需要访问互联网,在AndroidManifest.xml中需要启用网络权限。

<manifest xmlns:android...>
    ...
    <uses-permission android:name="android.permission.INTERNET" />
    <application ...
</manifest>

2.2 iOS设置

iOS无需任何步骤。

2.3 macOS设置

此包使用HTTP包并需要访问互联网,在.entitlements中需要启用网络权限。

<key>com.apple.security.network.client</key>
<true/>

2.4 Windows设置

Windows无需任何步骤。

2.5 Linux设置

Linux无需任何步骤。

3 使用

3.1 CosmosDB实例创建和配置

首先,你需要创建一个CosmosDB类的实例,如下所示:

final cosmosDb = CosmosDb(
    // 必填 -> Azure CosmosDB的URI。
    connectionUri: 'https://<COSMOS_DB_NAME>.documents.azure.com:443/',
    // 必填 -> CosmosDB的主键。
    primaryKey: '<COSMOS_DB_KEY>',
    // 可选 -> 提供令牌的授权类型。默认:master
    authorizationType: 'master',
    // 可选 -> 提供授权的版本。默认:1.0
    authorizationVersion: '1.0',
    // 可选 -> Azure Cosmos DB服务支持的REST API版本。默认:2018-12-31
    xmsVersion: '2018-12-31',
);

3.2 数据库

每个Azure Cosmos DB帐户支持多个独立命名的数据库。数据库是一个逻辑命名空间,用于集合、用户和权限。

3.2.1 列出数据库

列出数据库帐户下的数据库,对数据库资源执行GET操作。

数据库列表操作返回一个 Future<CosmosDatabaseList>,包含一个 CosmosDatabase 列表或错误对象。 查看3.2.5 CosmosDatabase模型以了解返回模型及其变量的信息。

final CosmosDatabaseList databaseList = await cosmosDb.database.list();

if(databaseList.error.isEmpty) {
    // 如果错误为空,继续...
}

3.2.2 获取数据库

检索数据库资源,对数据库资源执行GET操作。

数据库获取操作返回一个 Future<CosmosDatabase>。 查看3.2.5 CosmosDatabase模型以了解返回模型及其变量的信息。

final CosmosDatabase database = await cosmosDb.database.get(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
);

if (database.error.isEmpty) {
    // 如果错误为空,继续...
}

3.2.3 创建数据库

创建操作在数据库帐户中创建新的数据库。

数据库创建操作返回一个 Future<CosmosDatabase>。 查看3.2.5 CosmosDatabase模型以了解返回模型及其变量的信息。

final CosmosDatabase database = await cosmosDb.database.create(
    // 必填 -> 用户生成的要创建的数据库名称/ID。
    dbId: '<DB_ID>',
);

if (database.error.isEmpty) {
    // 如果错误为空,继续...
}

3.2.4 删除数据库

删除操作删除数据库帐户中的现有数据库。

数据库删除操作返回一个 Future<CosmosDatabase>。 查看3.2.5 CosmosDatabase模型以了解返回模型及其变量的信息。

final CosmosDatabase database = await cosmosDb.database.delete(
    // 必填 -> 用户生成的要删除的数据库名称/ID。
    dbId: '<DB_ID>',
);

if (database.error.isEmpty) {
    // 如果错误为空,继续...
}

3.2.5 CosmosDatabase模型

CosmosDatabase

方法

  • CosmosDatabase.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • CosmosDatabase.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
id id myId1 资源的唯一用户生成名称,最多255个字符。
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
ts _ts 1446192371 系统生成属性。它指定资源的最后更新时间戳。值是一个时间戳。
self _self dbs/qicAAA==/ 系统生成属性。它是资源的唯一可寻址URI。
etag _etag 00001800-… 系统生成属性,表示所需的资源etag,用于乐观并发控制。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
colls _colls colls/ 它是系统生成的属性,指定集合资源的可寻址路径。
users _users users/ 它是系统生成的属性,指定用户资源的可寻址路径。
CosmosDatabaseList

方法

  • CosmosDatabaseList.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • CosmosDatabaseList.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
count _count 3 这个属性显示了作为列表操作返回的资源数量。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
databases Databases [] CosmosDB数据库列表。List<CosmosDatabase>

3.3 集合

集合是JSON文档和相关JavaScript应用程序逻辑(如存储过程、触发器和用户定义函数)的容器。

3.3.1 列出集合

对特定数据库的集合资源执行GET操作,即colls URI路径,返回该数据库中的集合列表。

集合列表操作返回一个 Future<CollectionList>,包含一个 Collection 列表或错误对象。 查看3.3.5 Collection模型以了解返回模型及其变量的信息。

final CollectionList collectionList = await cosmosDb.collection.list(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
);

if (collectionList.error.isEmpty) {
    // 如果错误为空,继续...
}

3.3.2 获取集合

对特定集合资源执行GET操作,检索集合的属性。

集合获取操作返回一个 Future<Collection>。 查看3.3.5 Collection模型以了解返回模型及其变量的信息。

final Collection collection = await cosmosDb.collection.get(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 现有集合的名称。
    collectionId: '<COLLECTION_ID>',
);

if (collection.error.isEmpty) {
    // 如果错误为空,继续...
}

3.3.3 创建集合

创建操作在数据库中创建新的集合。

集合创建操作返回一个 Future<Collection>。 查看3.3.5 Collection模型以了解返回模型及其变量的信息。

final Collection collection = await cosmosDb.collection.create(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 要创建的集合名称。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 用于将数据分区到多个分区的分区键。
    partitionKey: '/id',
    // 必填 -> 设置为2以使用大分区键,否则设置为1。
    version: 1,
);

if (collection.error.isEmpty) {
    // 如果错误为空,继续...
}

3.3.4 删除集合

删除操作删除数据库中的现有集合。

集合删除操作返回一个 Future<Collection>。 查看3.3.5 Collection模型以了解返回模型及其变量的信息。

final Collection collection = await cosmosDb.collection.delete(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>', 
    // 必填 -> 要删除的集合名称。
    collectionId: '<COLLECTION_ID>',
);

if (collection.error.isEmpty) {
    // 如果错误为空,继续...
}

3.3.5 Collection模型

Collection

方法

  • Collection.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • Collection.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
id id myId1 资源的唯一用户生成名称,最多255个字符。
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
ts _ts 1446192371 系统生成属性。它指定资源的最后更新时间戳。值是一个时间戳。
self _self dbs/qicAAA==/ 系统生成属性。它是资源的唯一可寻址URI。
etag _etag 00001800-… 系统生成属性,表示所需的资源etag,用于乐观并发控制。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
docs _docs docs/ 它是系统生成的属性,指定文档资源的可寻址路径。
sprocs _sprocs sprocs/ 它是系统生成的属性,指定存储过程(sprocs)资源的可寻址路径。
triggers _triggers triggers/ 它是系统生成的属性,指定触发器资源的可寻址路径。
udfs _udfs udfs/ 它是系统生成的属性,指定用户定义函数(udfs)资源的可寻址路径。
conflicts _conflicts conflicts/ 它是系统生成的属性,指定冲突资源的可寻址路径。
partitionKey partitionKey {
“paths”: [ “/AccountNumber” ],
“kind”: “Hash”,
“Version”: 2
}
此值用于配置用于将数据分区到多个分区的分区键。
indexingPolicy indexingPolicy [{
“path”: “/*”,
“indexes”: [{ “dataType”: “String”,
“precision”: -1,
“kind”: “Range” }]
}]
此值用于配置索引策略。默认情况下,索引对于集合内的所有文档路径都是自动的。
uniqueKeyPolicy uniqueKeyPolicy [] 借助唯一键,您可以确保一个或多个值在逻辑分区中是唯一的。默认情况下,唯一键策略是一个空数组或null对象。
geospatialConfig geospatialConfig {
“type”: “Geography”
}
地理空间配置指定如何对空间数据进行索引。指定每容器一个地理空间配置:地理或几何。
CollectionList

方法

  • CollectionList.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • CollectionList.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
count _count 3 这个属性显示了作为列表操作返回的资源数量。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
collections DocumentCollections [] CosmosDB集合列表。List<Collection>

3.4 文档

文档由用户定义的JSON格式内容组成。除了必需的ID属性外,用户可以定义任意元素、结构和层次结构。ID元素是一个用户可设置的唯一字符串,不能超过255个字符。可以在集合中插入、替换、删除、读取、枚举和查询任意JSON文档。

3.4.1 列出文档

对特定集合的文档资源执行GET操作,即docs URI路径,返回集合下的文档列表。

文档列表操作返回一个 Future<CosmosDocumentList>,包含一个 CosmosDocument 列表或错误对象。 查看3.4.7 CosmosDocument模型以了解返回模型及其变量的信息。

final CosmosDocumentList documentList = await cosmosDb.document.list(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 集合的名称/ID。
    collectionId: '<COLLECTION_ID>',
);

if (documentList.error.isEmpty) {
    // 如果错误为空,继续...
}

3.4.2 获取文档

获取操作通过其分区键和文档键检索文档。

集合获取操作返回一个 Future<CosmosDocument>。 查看3.4.7 CosmosDocument模型以了解返回模型及其变量的信息。

final CosmosDocument document = await cosmosDb.document.get(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 集合的名称/ID。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 要检索的文档ID。
    documentId: '<DOCUMENT_ID>',
    // 必填 -> 要接收的文档的分区键值。
    partitionKey: '<DOCUMENT_PARTITION_KEY>',
);

if (document.error.isEmpty) {
    // 如果错误为空,继续...
}

3.4.3 创建文档

创建操作在集合中创建新的文档。

集合创建操作返回一个 Future<CosmosDocument>。 查看3.4.7 CosmosDocument模型以了解返回模型及其变量的信息。

// 示例:创建一个Person实例写入文档。
final Person person = Person(
    id: '01',
    name: 'Jane', 
    familyName: 'Doe', 
    birthDate: '01.01.1970',
);

final CosmosDocument document = await cosmosDb.document.create(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 集合的名称/ID。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 要创建的文档的分区键值。
    // 在本示例中使用分区键/id。
    partitionKey: person.id,
    // 必填 -> 任何带有字符串键和动态值的映射,将添加到文档中。
    // 在本示例中,将Person实例转换为映射。
    body: person.toMap(),
);

if (document.error.isEmpty) {
    // 如果错误为空,继续...
}

3.4.4 替换文档

替换操作替换文档的整个内容。

集合替换操作返回一个 Future<CosmosDocument>。 查看3.4.7 CosmosDocument模型以了解返回模型及其变量的信息。

// 示例:创建一个Person实例来覆盖。
final Person personUpdated = Person(
    id: '02',
    name: 'Jane', 
    familyName: 'Doe', 
    birthDate: '01.01.1970',
);

final CosmosDocument document = await cosmosDb.document.replace(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 集合的名称/ID。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 要创建的文档的分区键值。
    // 在本示例中使用分区键/id。
    partitionKey: person.id,
    // 必填 -> 要替换的文档ID。
    documentId: '01',
    // 必填 -> 任何带有字符串键和动态值的映射,将替换之前的主体。
    // 在本示例中,将Person实例转换为映射。
    body: person.toMap(),
);

if (document.error.isEmpty) {
    // 如果错误为空,继续...
}

3.4.5 删除文档

删除操作删除集合中的现有文档。

集合删除操作返回一个 Future<CosmosDocument>。 查看3.4.7 CosmosDocument模型以了解返回模型及其变量的信息。

final CosmosDocument document = await cosmosDb.document.delete(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 集合的名称/ID。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 要删除的文档的分区键值。
    partitionKey: '<DOCUMENT_PARTITION_KEY>',
    // 必填 -> 要删除的文档ID。
    documentId: '01',
);

if (document.error.isEmpty) {
    // 如果错误为空,继续...
}

3.4.6 查询文档

3.4.7 CosmosDocument模型

CosmosDocument

方法

  • CosmosDocument.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • CosmosDocument.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
id id myId1 资源的唯一用户生成名称,最多255个字符。
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
ts _ts 1446192371 系统生成属性。它指定资源的最后更新时间戳。值是一个时间戳。
self _self dbs/qicAAA==/ 系统生成属性。它是资源的唯一可寻址URI。
etag _etag 00001800-… 系统生成属性,表示所需的资源etag,用于乐观并发控制。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
attachments _attachments attachments/ 它是系统生成的属性,指定附件资源的可寻址路径。
values ... {
“key1”: “val1”,
“key2”: “val2”
}
任何保存或检索文档的键值对映射。
CosmosDocumentList

方法

  • CosmosDocumentList.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • CosmosDocumentList.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
count _count 3 这个属性显示了作为列表操作返回的资源数量。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
documents Documents [] CosmosDB文档列表。List<CosmosDocument>

3.5 存储过程

存储过程是一段用JavaScript编写的业务逻辑,注册并针对集合执行为单个事务。在Azure Cosmos DB中,JavaScript托管在同一内存空间中,因此存储过程中发出的所有请求都在数据库会话的作用域内执行。此过程使Azure Cosmos DB能够保证所有属于单个存储过程的操作的ACID。

3.5.1 列出存储过程

对特定数据库的存储过程资源执行GET操作,即sprocs URI路径,返回集合中的存储过程列表。

存储过程列表操作返回一个 Future<StoredProcedureList>,包含一个 StoredProcedure 列表或错误对象。 查看3.5.5 存储过程模型以了解返回模型及其变量的信息。

final StoredProcedureList storedProcedureList = await cosmosDb.storedProcedure.list(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 存储过程所在的集合名称。
    collectionId: '<COLLECTION_ID>',
);

if (storedProcedureList.error.isEmpty) {
    // 如果错误为空,继续...
}

3.5.2 创建存储过程

创建操作在集合中创建新的存储过程。

存储过程创建操作返回一个 Future<StoredProcedure>。 查看3.5.5 存储过程模型以了解返回模型及其变量的信息。

final StoredProcedure storedProcedure = await cosmosDb.storedProcedure.create(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 存储过程创建的集合名称。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 存储过程的用户生成的唯一名称,最多255个字符。
    storedProcedureId: '<SPROC_ID>',
    // 必填 -> 存储过程的正文作为字符串。
    function: 'function () { ... }',
);

if (storedProcedure.error.isEmpty) {
    // 如果错误为空,继续...
}

3.5.3 替换存储过程

替换操作替换整个存储过程资源。 所有用户可设置的属性,包括ID和正文,都必须在主体中提交以执行替换。

存储过程替换操作返回一个 Future<StoredProcedure>。 查看3.5.5 存储过程模型以了解返回模型及其变量的信息。

final StoredProcedure storedProcedure = await cosmosDb.storedProcedure.replace(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 存储过程更新的集合名称。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 存在的存储过程的用户生成的唯一名称。
    storedProcedureId: '<SPROC_ID>',
    // 必填 -> 存储过程的正文作为字符串,将替换当前函数。
    function: 'function () { ...Updated function... }',
);

if (storedProcedure.error.isEmpty) {
    // 如果错误为空,继续...
}

3.5.4 删除存储过程

删除操作删除集合中的现有存储过程。

存储过程删除操作返回一个 Future<StoredProcedure>。 查看3.5.5 存储过程模型以了解返回模型及其变量的信息。

final StoredProcedure storedProcedure = await cosmosDb.storedProcedure.delete(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 存储过程删除的集合名称。
    collectionId: '<COLLECTION_ID>',
    // 必填 -> 存在的存储过程的用户生成的唯一名称。
    storedProcedureId: '<SPROC_ID>',
);

if (storedProcedure.error.isEmpty) {
    // 如果错误为空,继续...
}

3.5.5 执行存储过程

3.5.6 存储过程模型

StoredProcedure

方法

  • StoredProcedure.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • StoredProcedure.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
id id myId1 资源的唯一用户生成名称,最多255个字符。
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
ts _ts 1446192371 系统生成属性。它指定资源的最后更新时间戳。值是一个时间戳。
self _self dbs/qicAAA==/ 系统生成属性。它是资源的唯一可寻址URI。
etag _etag 00001800-… 系统生成属性,表示所需的资源etag,用于乐观并发控制。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
body body function() { … } 用户可设置的属性。它是存储过程的正文。
StoredProcedureList

方法

  • StoredProcedureList.toMap() -> 将模型转换为Map以供CosmosDB API使用。
  • StoredProcedureList.toMap(Map<String, dynamic> map) -> 将从CosmosDB API获得的Map转换为模型。

变量

名称 Azure API键名 示例 描述
rid _rid qicAAA== 系统生成属性。资源ID(_rid)是一个唯一标识符。它用于内部放置和导航到资源。
count _count 3 这个属性显示了作为列表操作返回的资源数量。
error code, message {
“code”: “…”,
“message”: “…”
}
成功事务时为空的Map,否则包含代码和消息的Map。
storedProcedures StoredProcedures [] CosmosDB存储过程列表。List<StoredProcedure>

3.6 用户定义函数

用户定义函数(UDF)是一段无副作用的应用程序逻辑,用JavaScript编写。它允许开发人员构造查询运算符,从而扩展Cosmos DB查询语言的核心功能。像存储过程一样,UDF生活在集合的范围内,从而将应用程序逻辑限制在集合内。

3.6.1 列出用户定义函数

对特定数据库的触发器资源执行GET操作,返回集合中的触发器列表。

用户定义函数列表操作返回一个 Future<UserDefinedFunctionList>,包含一个 UserDefinedFunction 列表或错误对象。 查看3.6.5 用户定义函数模型以了解返回模型及其变量的信息。

final UserDefinedFunctionList userDefinedFunctionList = await cosmosDb.userDefinedFunctions.list(
    // 必填 -> 用户生成的数据库名称/ID。
    dbId: '<DB_ID>',
    // 必填 -> 用户定义函数所在的集合名称。
    collectionId: '<COLLECTION_ID>',
);

if (userDefinedFunctionList.error.isEmpty) {
    // 如果错误为空,继续...
}

3.6.2 创建用户定义函数

创建操作在集合中创建新的用户定义函数。

用户定义函数创建操作返回一个 Future<UserDefinedFunction>。 查看3.6.5 用户定义函数模型以了解返回模型及其变量的信息。


更多关于Flutter Azure Cosmos DB操作插件dart_azure_cosmosdb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Azure Cosmos DB操作插件dart_azure_cosmosdb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用 dart_azure_cosmosdb 插件在 Flutter 应用中与 Azure Cosmos DB 进行交互的代码示例。这个示例将展示如何连接到 Azure Cosmos DB、创建数据库和容器、以及插入和读取文档。

首先,确保你已经在 pubspec.yaml 文件中添加了 dart_azure_cosmosdb 依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_azure_cosmosdb: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来安装依赖。

接下来,在你的 Flutter 项目中创建一个服务类来处理与 Azure Cosmos DB 的交互。以下是一个示例代码:

import 'package:flutter/material.dart';
import 'package:dart_azure_cosmosdb/dart_azure_cosmosdb.dart';

class CosmosDBService {
  late CosmosClient _client;
  late Database _database;
  late Container _container;

  CosmosDBService(String endpoint, String primaryKey, String databaseId, String containerId) {
    _client = CosmosClient(endpoint, primaryKey);
    _createDatabase(databaseId).then((database) {
      _database = database;
      _createContainer(containerId);
    });
  }

  Future<Database> _createDatabase(String id) async {
    try {
      DatabaseResponse databaseResponse = await _client.databases.createIfNotExists(id: id);
      return databaseResponse.database;
    } catch (e) {
      throw Exception("Failed to create database: $e");
    }
  }

  Future<void> _createContainer(String id) async {
    try {
      ContainerResponse containerResponse = await _database.containers.createIfNotExists(
        id: id,
        partitionKey: PartitionKeyDefinition(paths: ['/id']),
      );
      _container = containerResponse.container;
    } catch (e) {
      throw Exception("Failed to create container: $e");
    }
  }

  Future<void> insertItem(Map<String, dynamic> item) async {
    try {
      ItemResponse<Map<String, dynamic>> itemResponse = await _container.items.create(item);
      print("Inserted item with id: ${itemResponse.resource['id']}");
    } catch (e) {
      throw Exception("Failed to insert item: $e");
    }
  }

  Future<List<Map<String, dynamic>>> getAllItems() async {
    try {
      FeedResponse<Map<String, dynamic>> feedResponse = await _container.items.readAll().toList();
      return feedResponse.resources;
    } catch (e) {
      throw Exception("Failed to get items: $e");
    }
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late CosmosDBService _cosmosDBService;
  List<Map<String, dynamic>> _items = [];

  @override
  void initState() {
    super.initState();
    String endpoint = 'YOUR_COSMOS_DB_ENDPOINT';
    String primaryKey = 'YOUR_COSMOS_DB_PRIMARY_KEY';
    String databaseId = 'yourDatabaseId';
    String containerId = 'yourContainerId';

    _cosmosDBService = CosmosDBService(endpoint, primaryKey, databaseId, containerId);

    // 插入示例文档
    Map<String, dynamic> item = {'id': '1', 'name': 'Test Item', 'value': 42};
    _cosmosDBService.insertItem(item).then((_) {
      // 读取所有文档
      _cosmosDBService.getAllItems().then((items) {
        setState(() {
          _items = items;
        });
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Azure Cosmos DB Flutter Demo'),
        ),
        body: ListView.builder(
          itemCount: _items.length,
          itemBuilder: (context, index) {
            Map<String, dynamic> item = _items[index];
            return ListTile(
              title: Text('ID: ${item['id']}, Name: ${item['name']}, Value: ${item['value']}'),
            );
          },
        ),
      ),
    );
  }
}

说明:

  1. 依赖安装:确保在 pubspec.yaml 文件中添加了 dart_azure_cosmosdb 依赖,并运行 flutter pub get
  2. 服务类CosmosDBService 类封装了对 Azure Cosmos DB 的基本操作,包括创建数据库、创建容器、插入文档和读取文档。
  3. 插入和读取文档:在 MyAppinitState 方法中,我们插入了一个示例文档,并读取了所有文档,然后显示在 UI 上。

注意事项:

  • 替换 YOUR_COSMOS_DB_ENDPOINTYOUR_COSMOS_DB_PRIMARY_KEY 为你自己的 Azure Cosmos DB 终端和主键。
  • 确保 yourDatabaseIdyourContainerId 是你希望创建的数据库和容器的 ID。

这个示例代码展示了如何在 Flutter 应用中使用 dart_azure_cosmosdb 插件与 Azure Cosmos DB 进行基本的操作。根据你的具体需求,你可以进一步扩展这个服务类来处理更多的操作,比如更新和删除文档。

回到顶部