webOS项目中如何定义多个Kind并实现区分识别?
在webOS的db8数据库中,你完全可以创建多个独立的Kind来区分movie、music这类不同的数据类型,核心是为每种数据类型生成以appId为前缀的专属Kind ID,而不是局限于:1这类后缀。具体实现步骤如下:
1. 为不同数据类型创建独立的Kind
针对movie和music分别调用putKind,使用不同的Kind ID(比如my.db8.example:movie和my.db8.example:music),并根据数据特性定义对应的schema和索引:
创建Movie的Kind
var appId = "my.db8.example"; var movieKindId = appId + ":movie"; webOS.service.request("luna://com.palm.db", { method: "putKind", parameters: { id: movieKindId, owner: appId, schema: { path: { type: "string" }, genre: { type: "string" }, releaseYear: { type: "integer" } // 电影专属字段 }, indexes: [ { name: "movieGenreIdx", props: [{ name: "genre" }] }, { name: "movieYearIdx", props: [{ name: "releaseYear" }] } ] }, onSuccess: () => printLog("[putKind Movie] 成功"), onFailure: () => printLog("[putKind Movie] 失败") });
创建Music的Kind
var musicKindId = appId + ":music"; webOS.service.request("luna://com.palm.db", { method: "putKind", parameters: { id: musicKindId, owner: appId, schema: { path: { type: "string" }, genre: { type: "string" }, artist: { type: "string" } // 音乐专属字段 }, indexes: [ { name: "musicArtistIdx", props: [{ name: "artist" }] }, { name: "musicGenreIdx", props: [{ name: "genre" }] } ] }, onSuccess: () => printLog("[putKind Music] 成功"), onFailure: () => printLog("[putKind Music] 失败") });
2. 插入数据时指定对应Kind ID
插入电影数据时使用movieKindId,插入音乐数据时使用musicKindId:
插入电影数据
webOS.service.request("luna://com.palm.db", { method: "put", parameters: { objects: [ { _kind: movieKindId, path: "/movies/xxx.mp4", genre: "Action", releaseYear: 2024 } ] }, onSuccess: (res) => printLog("[put Movie] 成功"), onFailure: (res) => printLog(`[put Movie] 失败: ${res.errorText}`) });
插入音乐数据
webOS.service.request("luna://com.palm.db", { method: "put", parameters: { objects: [ { _kind: musicKindId, path: "/music/yyy.mp3", genre: "Rock", artist: "BandName" } ] }, onSuccess: (res) => printLog("[put Music] 成功"), onFailure: (res) => printLog(`[put Music] 失败: ${res.errorText}`) });
3. 查询时通过from指定目标Kind
查询不同类型的数据时,在from字段中传入对应的Kind ID即可:
查询所有电影
webOS.service.request("luna://com.palm.db", { method: "find", parameters: { from: movieKindId, query: { where: [{ prop: "genre", op: "=", val: "Action" }] } }, onSuccess: (res) => printLog(`找到 ${res.results.length} 部动作电影`), onFailure: (res) => printLog(`[find Movie] 失败: ${res.errorText}`) });
查询所有音乐
webOS.service.request("luna://com.palm.db", { method: "find", parameters: { from: musicKindId, query: { where: [{ prop: "artist", op: "=", val: "BandName" }] } }, onSuccess: (res) => printLog(`找到 ${res.results.length} 首该乐队的歌曲`), onFailure: (res) => printLog(`[find Music] 失败: ${res.errorText}`) });
关键说明
db8对Kind ID的要求是必须以你的appId作为前缀,后缀可以自定义(字符串、数字都可以),这样既满足系统的权限校验,又能实现不同数据类型的隔离。你之前误以为只能用:1,其实这只是常见的版本号命名方式,完全可以根据业务需求用更语义化的后缀来区分不同Kind。
内容的提问来源于stack exchange,提问作者akoel
相关产品推荐
相关产品推荐

