mirror of
https://github.com/openharmony/applications_calendar_data.git
synced 2026-07-01 20:14:02 -04:00
@@ -34,6 +34,17 @@ public:
|
||||
* @return Returns the index of the inserted data record.
|
||||
*/
|
||||
int Insert(const Uri &uri, const DataShare::DataShareValuesBucket &value);
|
||||
|
||||
/**
|
||||
* @brief batch insert data records into the database.
|
||||
*
|
||||
* @param uri Indicates the path of the data to operate.
|
||||
* @param values Indicates the data records to insert. If this parameter is null, a blank row will be inserted.
|
||||
*
|
||||
* @return Returns the index of the inserted data count.
|
||||
*/
|
||||
int BatchInsert(const Uri &uri, const std::vector<DataShare::DataShareValuesBucket> &values);
|
||||
|
||||
/**
|
||||
* @brief Updates data records in the database.
|
||||
*
|
||||
|
||||
@@ -38,6 +38,15 @@ int DataShareHelperManager::Insert(const Uri &uri, const DataShareValuesBucket &
|
||||
return dataShareHelper->Insert(const_cast<Uri &>(uri), value);
|
||||
}
|
||||
|
||||
int DataShareHelperManager::BatchInsert(const Uri &uri, const std::vector<DataShare::DataShareValuesBucket> &values)
|
||||
{
|
||||
if (!dataShareHelper) {
|
||||
LOG_ERROR("dataShareHelper null");
|
||||
return -1;
|
||||
}
|
||||
return dataShareHelper->BatchInsert(const_cast<Uri &>(uri), values);
|
||||
}
|
||||
|
||||
int DataShareHelperManager::Update(const Uri &uri, const DataSharePredicates &predicates,
|
||||
const DataShareValuesBucket &value)
|
||||
{
|
||||
|
||||
@@ -71,11 +71,14 @@ int Calendar::AddEvent(const Event& event)
|
||||
return eventId;
|
||||
}
|
||||
// insert attendee
|
||||
auto valueAttendees = std::vector<DataShare::DataShareValuesBucket>();
|
||||
for (const auto &attendee : event.attendees) {
|
||||
auto valueAttendee = BuildAttendeeValue(attendee, eventId);
|
||||
auto index = DataShareHelperManager::GetInstance().Insert(*(m_attendeeUri.get()), valueAttendee);
|
||||
LOG_INFO("Insert attendee index %{public}d", index);
|
||||
valueAttendees.emplace_back(valueAttendee);
|
||||
}
|
||||
auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_attendeeUri.get()), valueAttendees);
|
||||
LOG_INFO("batchInsert attendees count %{public}d", count);
|
||||
|
||||
// insert reminder
|
||||
if (event.reminderTime.has_value()) {
|
||||
InsertReminders(eventId, event.reminderTime.value());
|
||||
@@ -176,12 +179,14 @@ bool Calendar::UpdateEvent(const Event& event)
|
||||
auto ret = DataShareHelperManager::GetInstance().Delete(*(m_attendeeUri.get()), predicates);
|
||||
LOG_INFO("Delete attendee num %{public}d", ret);
|
||||
}
|
||||
auto valueAttendees = std::vector<DataShare::DataShareValuesBucket>();
|
||||
for (const auto &attendee : event.attendees) {
|
||||
auto valueAttendee = BuildAttendeeValue(attendee, eventId);
|
||||
auto index = DataShareHelperManager::GetInstance().Insert(*(m_attendeeUri.get()), valueAttendee);
|
||||
LOG_INFO("Update attendee index %{public}d", index);
|
||||
valueAttendees.emplace_back(valueAttendee);
|
||||
}
|
||||
|
||||
auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_attendeeUri.get()), valueAttendees);
|
||||
LOG_INFO("batchInsert attendees count %{public}d", count);
|
||||
|
||||
{
|
||||
// delete reminder
|
||||
DataShare::DataSharePredicates predicates;
|
||||
|
||||
@@ -33,6 +33,17 @@ export interface DatabaseProcessor {
|
||||
*/
|
||||
insertByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function);
|
||||
|
||||
/**
|
||||
* 高权限批量插入接口
|
||||
*
|
||||
* @param rdbStore rdb数据库
|
||||
* @param uri DataShare的uri
|
||||
* @param values 插入的数据
|
||||
* @param callback 回调方法
|
||||
*/
|
||||
batchInsertByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string,
|
||||
values: data_rdb.ValuesBucket[], callback: Function): void;
|
||||
|
||||
/**
|
||||
* 低权限插入接口
|
||||
*
|
||||
@@ -43,6 +54,17 @@ export interface DatabaseProcessor {
|
||||
*/
|
||||
insertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function);
|
||||
|
||||
/**
|
||||
* 低权限批量插入接口
|
||||
*
|
||||
* @param rdbStore rdb数据库
|
||||
* @param uri DataShare的uri
|
||||
* @param values 插入的数据
|
||||
* @param callback 回调方法
|
||||
*/
|
||||
batchInsertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string,
|
||||
values: data_rdb.ValuesBucket[], callback: Function): void;
|
||||
|
||||
/**
|
||||
* 高权限删除接口
|
||||
*
|
||||
|
||||
@@ -67,10 +67,20 @@ export class DefaultProcessor implements DatabaseProcessor, Observable {
|
||||
this.doInsert(rdbStore, uri, values, callback);
|
||||
}
|
||||
|
||||
batchInsertByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket[],
|
||||
callback: Function) {
|
||||
this.doBatchInsert(rdbStore, uri, values, callback);
|
||||
}
|
||||
|
||||
insertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function) {
|
||||
this.doInsert(rdbStore, uri, values, callback);
|
||||
}
|
||||
|
||||
batchInsertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket[],
|
||||
callback: Function) {
|
||||
this.doBatchInsert(rdbStore, uri, values, callback);
|
||||
}
|
||||
|
||||
deleteByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
|
||||
this.doDelete(rdbStore, uri, predicates, callback);
|
||||
}
|
||||
@@ -120,6 +130,31 @@ export class DefaultProcessor implements DatabaseProcessor, Observable {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量插入的公共方法
|
||||
*
|
||||
* @param rdbStore rdb数据库
|
||||
* @param uri DataShare的uri
|
||||
* @param values 插入的数据
|
||||
* @param callback 回调方法
|
||||
*/
|
||||
doBatchInsert(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket[], callback: Function) {
|
||||
const table = getTableByUri(uri);
|
||||
rdbStore.batchInsert(table, values, (err, rowId) => {
|
||||
Log.log(this.logTag, `insert ${table} before callback`);
|
||||
callback(err, rowId);
|
||||
if (hasNoError(err)) {
|
||||
Log.log(this.logTag, `insert ${table} after callback: rowId = ` + rowId);
|
||||
if (!this.isFromMigrate) {
|
||||
notifyProviderChange(table, OPERATION_INSERT);
|
||||
this.notifyAlertsChanges(INSERT_OPERATION_NAME, table, values);
|
||||
}
|
||||
} else {
|
||||
Log.warn(this.logTag, `insert get err:${err?.code}, ${err?.message}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除的公共方法
|
||||
*
|
||||
@@ -215,7 +250,7 @@ export class DefaultProcessor implements DatabaseProcessor, Observable {
|
||||
})
|
||||
}
|
||||
|
||||
notifyAlertsChanges(operationName: string, table: string, values?: data_rdb.ValuesBucket) {
|
||||
notifyAlertsChanges(operationName: string, table: string, values?: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]) {
|
||||
let message = new AlertsMessage();
|
||||
message.setOperationName(operationName);
|
||||
message.setTableName(table);
|
||||
|
||||
@@ -25,7 +25,7 @@ import { ObserverMessage } from '@ohos/common/src/main/ets/observer/Observer';
|
||||
export class AlertsMessage extends ObserverMessage {
|
||||
private mOperationName: string;
|
||||
private mTableName: string;
|
||||
private mValues: data_rdb.ValuesBucket;
|
||||
private mValues: data_rdb.ValuesBucket | data_rdb.ValuesBucket[];
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
@@ -42,7 +42,7 @@ export class AlertsMessage extends ObserverMessage {
|
||||
this.mTableName = mTableName;
|
||||
}
|
||||
|
||||
setValues(mValues: data_rdb.ValuesBucket) {
|
||||
setValues(mValues: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]) {
|
||||
this.mValues = mValues;
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ export class AlertsMessage extends ObserverMessage {
|
||||
return this.mTableName;
|
||||
}
|
||||
|
||||
getValues(): data_rdb.ValuesBucket {
|
||||
getValues(): data_rdb.ValuesBucket | data_rdb.ValuesBucket[] {
|
||||
return this.mValues;
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ function isNeedToUpdateAlerts(message: AlertsMessage): boolean {
|
||||
// 传入的参数为操作名称和具体操作细节
|
||||
let operationName: string = message.getOperationName();
|
||||
let tableName: string = message.getTableName();
|
||||
let values: data_rdb.ValuesBucket = message.getValues();
|
||||
let values: data_rdb.ValuesBucket | data_rdb.ValuesBucket[] = message.getValues();
|
||||
|
||||
// 策略模式+工厂模式:根据operationName使用不同的判断逻辑生产不同实例,扩展不同场景只需要额外增加多的AlarmNeedUpdateJudger类即可
|
||||
let alarmNeedUpdateJudgerFactory = new AlertsUpdateJudgerFactory();
|
||||
|
||||
@@ -29,5 +29,5 @@ export default interface AlertsUpdateJudger {
|
||||
* @Param values 修改操作的更新值
|
||||
* @Return 是否需要更新 Alerts 表
|
||||
*/
|
||||
isNeedToUpdateAlerts(tableName: string, values: data_rdb.ValuesBucket): boolean;
|
||||
isNeedToUpdateAlerts(tableName: string, values: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]): boolean;
|
||||
}
|
||||
@@ -27,6 +27,7 @@ import delegate from './DataShareAbilityDelegate'
|
||||
import data_rdb from '@ohos.data.relationalStore';
|
||||
import dataSharePredicates from '@ohos.data.dataSharePredicates';
|
||||
import { BusinessError } from '@ohos.base';
|
||||
import { ValuesBucket } from '@ohos.data.ValuesBucket';
|
||||
|
||||
const TAG = "DataShareAbilityAuthenticateProxy";
|
||||
|
||||
@@ -60,7 +61,7 @@ class DataShareAbilityAuthenticateProxy {
|
||||
return isDatabaseInitComplete;
|
||||
}
|
||||
|
||||
async insertByProxy(uri: string, value: data_rdb.ValuesBucket, permission: Permissions, callback: Function) {
|
||||
async insertByProxy(uri: string, value: data_rdb.ValuesBucket | data_rdb.ValuesBucket[], permission: Permissions, callback: Function) {
|
||||
let insertDataParameter = new InsertDataParameter(value);
|
||||
insertDataParameter.operationName = INSERT_BY_PROXY_OPERATION_NAME;
|
||||
let verifyFlag = await verifyByUri(uri, insertDataParameter, PERMISSIONS_WRITE_WHOLE_CALENDAR,
|
||||
@@ -204,10 +205,14 @@ async function dataOperateSelectorByHighAuthority(uri: string, dataParameter: Da
|
||||
let callback = dataParameter.callback;
|
||||
switch (operationName) {
|
||||
case INSERT_BY_PROXY_OPERATION_NAME:
|
||||
delegate.insertByHighAuthority(uri, value, callback);
|
||||
if (value instanceof Array) {
|
||||
delegate.batchInsertByHighAuthority(uri, value as ValuesBucket[], callback);
|
||||
break;
|
||||
}
|
||||
delegate.insertByHighAuthority(uri, value as ValuesBucket, callback);
|
||||
break;
|
||||
case UPDATE_BY_PROXY_OPERATION_NAME:
|
||||
delegate.updateByHighAuthority(uri, value, predicates, callback);
|
||||
delegate.updateByHighAuthority(uri, value as ValuesBucket, predicates, callback);
|
||||
break;
|
||||
case DELETE_BY_PROXY_OPERATION_NAME:
|
||||
delegate.deleteByHighAuthority(uri, predicates, callback);
|
||||
@@ -234,10 +239,14 @@ async function dataOperateSelectorByLowAuthority(uri: string, dataParameter: Dat
|
||||
let callback = dataParameter.callback;
|
||||
switch (operationName) {
|
||||
case INSERT_BY_PROXY_OPERATION_NAME:
|
||||
delegate.insertByLowAuthority(uri, value, callback);
|
||||
if (value instanceof Array) {
|
||||
delegate.batchInsertByLowAuthority(uri, value as ValuesBucket[], callback);
|
||||
break;
|
||||
}
|
||||
delegate.insertByLowAuthority(uri, value as ValuesBucket, callback);
|
||||
break;
|
||||
case UPDATE_BY_PROXY_OPERATION_NAME:
|
||||
delegate.updateByLowAuthority(uri, value, predicates, callback);
|
||||
delegate.updateByLowAuthority(uri, value as ValuesBucket, predicates, callback);
|
||||
break;
|
||||
case DELETE_BY_PROXY_OPERATION_NAME:
|
||||
delegate.deleteByLowAuthority(uri, predicates, callback);
|
||||
@@ -258,7 +267,7 @@ async function dataOperateSelectorByLowAuthority(uri: string, dataParameter: Dat
|
||||
abstract class DataParameter {
|
||||
operationName: string = '';
|
||||
|
||||
value: data_rdb.ValuesBucket = {} as data_rdb.ValuesBucket;
|
||||
value: data_rdb.ValuesBucket | data_rdb.ValuesBucket[] = {};
|
||||
|
||||
columns: Array<string> = [];
|
||||
|
||||
@@ -274,7 +283,7 @@ abstract class DataParameter {
|
||||
* @since 2022-12-28
|
||||
*/
|
||||
class InsertDataParameter extends DataParameter {
|
||||
constructor(value: data_rdb.ValuesBucket) {
|
||||
constructor(value: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@@ -63,6 +63,25 @@ class DataShareAbilityDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
batchInsertByHighAuthority(uri: string, value: data_rdb.ValuesBucket[], callback: Function) {
|
||||
if (!rdbStore) {
|
||||
this.getDb();
|
||||
Log.warn(TAG, `insert uri: ${uri} rdbStore is null`)
|
||||
return;
|
||||
}
|
||||
Log.info(TAG, `insert uri: ${uri}`);
|
||||
let table = getTableByUri(uri);
|
||||
Log.info(TAG, `insert table: ${table}`);
|
||||
|
||||
const processor = factory.getDatabaseProcessor(table);
|
||||
if (processor !== null && processor !== undefined) {
|
||||
processor.batchInsertByHighAuthority(rdbStore, uri, value, callback);
|
||||
return;
|
||||
} else {
|
||||
Log.error(TAG, 'insert with invalid processor');
|
||||
}
|
||||
}
|
||||
|
||||
async getDb() {
|
||||
rdbStore = await CalendarDataHelper.getInstance().getRdbStore() as data_rdb.RdbStore;
|
||||
}
|
||||
@@ -86,6 +105,26 @@ class DataShareAbilityDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
batchInsertByLowAuthority(uri: string, value: data_rdb.ValuesBucket[], callback: Function) {
|
||||
|
||||
if (!rdbStore) {
|
||||
Log.warn(TAG, `insert uri: ${uri} rdbStore is null`)
|
||||
this.getDb();
|
||||
return;
|
||||
}
|
||||
Log.info(TAG, `insert uri: ${uri}`);
|
||||
let table = getTableByUri(uri);
|
||||
Log.info(TAG, `insert table: ${table}`);
|
||||
|
||||
const processor = factory.getDatabaseProcessor(table);
|
||||
if (processor !== null && processor !== undefined) {
|
||||
processor.batchInsertByLowAuthority(rdbStore, uri, value, callback);
|
||||
return;
|
||||
} else {
|
||||
Log.error(TAG, 'insert with invalid processor');
|
||||
}
|
||||
}
|
||||
|
||||
deleteByHighAuthority(uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
|
||||
if (!rdbStore) {
|
||||
this.getDb();
|
||||
|
||||
@@ -102,6 +102,16 @@ export default class DataShareExtAbility extends Extension {
|
||||
Log.info(TAG, '[insert] leave');
|
||||
}
|
||||
|
||||
doBachInsert(uri: string, value: relationalStore.ValuesBucket[], callback: Function) {
|
||||
Log.info(TAG, '[insert] enter');
|
||||
try {
|
||||
dataShareProxy.insertByProxy(uri, value, WRITE_CALENDAR, callback);
|
||||
} catch (err) {
|
||||
Log.error(TAG, `err=${err?.message}`);
|
||||
}
|
||||
Log.info(TAG, '[insert] leave');
|
||||
}
|
||||
|
||||
doDelete(uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
|
||||
Log.info(TAG, '[delete] enter');
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user