起因事情是这样的,我发表上一篇文章我通过了华为鸿蒙的开发者高级认证真的可以遥遥领先后,居然有同学找我给他做个鸿蒙的留言板demo,他说就是DataAbility的增删改查的.

DataAbility是什么?考试也没考这玩意啊??
作为一个被高级认证的开发者怎么能不会?于是我搜索的一圈居然被我找到demo,代码都有

这岂不是含泪血赚,这样让我想到了

还有这个

于是我假装很难为情并且很复杂的样子,报价300!!!
然后经过一番讨价还价最终成交180,真的是大砍刀

于是我去官方demo clone了一份,一切都很顺利, 当clone一份之后我不出意外的话就出意外了,居然是用java写的,作为一个华为的高级开发者必须要拥抱ArkTS

各位女菩萨先来看看我实现的样子

接下来就是纯干货,请各位女菩萨做好准备 首先分析下这个需求是一个留言板的DataAbility的demo,可以确定一下几个知识点
- DataAbility(数据的增删改查)
- 留言板展示(List组件,State监听数据列表的变化,@ObjectLink+@Observed 监听每个item数据变化)
说干就干,由于DataAbility是Fa类型的项目所以我们先创建一个Fa项目,然后我们定义MessageBoard数据对象
js
@Observed
export class MessageBoard {
mId: string;
name: string;
content: string;
dateTime: string;
constructor(name: string = "", content: string = "", dateTime: string = "",mId: string = '',) {
this.name = name;
this.content = content;
this.dateTime = dateTime
this.mId = mId
}
}
然后定义Item组件

js
import { CustomDialogExample } from './CustomDialog';
import { MessageBoard } from './MessageBoard';
@Preview
@Component
export struct MessageCard {
action: (o: MessageBoard) => void
@ObjectLink
mItem: MessageBoard;
//弹框组件
dialogController = new CustomDialogController({
builder: CustomDialogExample({
action: this.update.bind(this),
// @ts-ignore
message: this.mItem,
update: true
}),
autoCancel: true,
customStyle: false,
})
build() {
Column() {
Text(this.mItem.name)
.fontSize('30px')
.fontColor('#463100')
Text(this.mItem.content)
.margin({ top: '20px', bottom: '20px' })
.fontSize('40px')
.fontColor('#463100')
Text(this.mItem.dateTime)
.width('100%')
.fontSize('25px')
.textAlign(TextAlign.End)
.fontColor('#999')
}
.onClick(() => {
this.dialogController.open()
})
.padding('20px')
.margin('20px')
.alignItems(HorizontalAlign.Start)
.border({ width: '1px', style: BorderStyle.Solid, color: '#936800', radius: '10px', })
.backgroundColor('#fbeace')
.shadow({ radius: 5, color: '#eee', offsetX: 10, offsetY: 10 })
}
update(item: MessageBoard) {
this.mItem.content = item.content
this.mItem.name = item.name
this.mItem.dateTime = item.dateTime
this.action(item)
}
}
下面将他们放在List组件里面,这里还加了侧滑删除
js
build() {
Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
List() {
ForEach(this.messageBoards, (item: MessageBoard, index) => {
ListItem() {
MessageCard({ action: this.clickSave.bind(this), mItem: item })
}.swipeAction({ end: this.itemEnd(item, index) })//侧滑删除
}, (item: MessageBoard) => item.mId)
}
.width('100%')
.padding({ top: '40px', right: '40px', left: '40px' })
.flexGrow(1)
Button('+', { type: ButtonType.Circle, stateEffect: true })
.borderRadius('72px')
.backgroundColor(0x317aff)
.margin('20px')
.fontSize('120px')
.onClick(() => {
this.dialogController.open()
})
}
.width('100%')
.height('100%')
}
好了我们下面我们讲下dataAbility,直接创建 file->new->Ability->DataAbility,然后将官网DataAbility的代码copy进来改改(dataAbility可以理解为android中的数据共享,可以供其他应用访问,还有就是数据库的功能)
js
import hilog from '@ohos.hilog';
import featureAbility from '@ohos.ability.featureAbility'
import dataAbility from '@ohos.data.dataAbility'
import dataRdb from '@ohos.data.rdb'
const TABLE_NAME = 'message'//表名
const STORE_CONFIG = { name: 'message.db' }//数据库名
//建表语句
const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS message(id INTEGER PRIMARY KEY AUTOINCREMENT,mId TEXT NOT NULL, name TEXT NOT NULL, content TEXT NOT NULL,dateTime TEXT NOT NULL)'
let rdbStore: dataRdb.RdbStore = undefined
export default {
onInitialized(abilityInfo) {
hilog.info(0x0000, 'testTag', '%{public}s', 'DataAbility onInitialized');
console.info('DataAbility onInitialized, abilityInfo:' + abilityInfo.bundleName)
let context = featureAbility.getContext()
dataRdb.getRdbStore(context, STORE_CONFIG, 1, (err, store) => {
console.info('DataAbility getRdbStore callback')
store.executeSql(SQL_CREATE_TABLE, [])
rdbStore = store
});
},
insert(uri, valueBucket, callback) {
console.info('DataAbility insert start')
rdbStore.insert(TABLE_NAME, valueBucket, callback)
},
batchInsert(uri, valueBuckets, callback) {
console.info('DataAbility batch insert start')
for (let i = 0;i < valueBuckets.length; i++) {
console.info('DataAbility batch insert i=' + i)
if (i < valueBuckets.length - 1) {
rdbStore.insert(TABLE_NAME, valueBuckets[i], (err: any, num: number) => {
console.info('DataAbility batch insert ret=' + num)
})
} else {
rdbStore.insert(TABLE_NAME, valueBuckets[i], callback)
}
}
},
query(uri, columns, predicates, callback) {
console.info('DataAbility query start')
let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
rdbStore.query(rdbPredicates, columns, callback)
},
update(uri, valueBucket, predicates, callback) {
console.info('DataAbilityupdate start')
let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
rdbStore.update(valueBucket, rdbPredicates, callback)
},
delete(uri, predicates, callback) {
console.info('DataAbilitydelete start')
let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
rdbStore.delete(rdbPredicates, callback)
}
};
主要注意以下几点
- 使用的时候路径是三个斜杠
js
urivar = "dataability:///com.cornflower.myapplication.DataAbility"
DAHelper = featureAbility.acquireDataAbilityHelper(this.urivar)
- 对数据操作时候的predicates,这个可以自定义查询条件如下
js
var pre = new ohos_data_ability.DataAbilityPredicates().equalTo("mId", o.mId)
this.DAHelper.update(this.urivar, va, pre, (error, res) => {
hilog.debug(0x0001, 'DAHelper', '%{public}s', res);
})
最后说下韩国电影有句台词:"钱就是熨斗,可以熨平生活的一切褶皱"