在网站上工作是对iOS应用程序的补充,我缺乏javascript知识,我可以提供一些指导。
我的CloudKit数据库至少有两个记录类型:事件和组织,每个记录类型都有多个字段。组织记录类型包含对特定事件记录名称的引用。我正在尝试对一个顺序查询进行编码,以便在调用每个事件后,其recordName将用于筛选组织的查询,以便我可以获取引用该事件的组织的相关名称、徽标等字段。
这种方法适用于iOS代码(XCode 7,Swift 2)。我可以成功地调用knockoutjs代码中的每个recordType,所以我知道对数据库的访问是可以的
下面的代码目前是为第一个函数(fetchRecords)设置的,用于调用第二个函数(fetchRecords2),然后合并这两组记录。我确信这是一个糟糕的结构,但我已经尝试了不同的方法,现在有点不知所措。
self.fetchRecords = function() {
var query = { recordType: 'Events' };
return publicDB.performQuery(query).then(function (response) {
if(response.hasErrors) {
console.error(response.errors[0]);
return;
}
var records = response.records;
var numberOfRecords = records.length;
if (numberOfRecords === 0) {
console.error('No matching items');
return;
}
self.events(records);
self.fetchRecords2();
if (self.organization() != "") {
self.events.push(self.organization);
self.organization("");
}
});
};
self.fetchRecords2 = function() {
var query2 = { recordType: 'Organization', filterBy: [{
fieldName: 'events',
comparator: 'EQUALS',
fieldValue: {value: self.events.recordName}
}] };
return publicDB.performQuery(query2).then(function (response2) {
if(response2.hasErrors) {
console.error(response2.errors[0]);
return;
}
var records2 = response2.records;
var numberOfRecords2 = records2.length;
if (numberOfRecords2 === 0) {
console.error('No matching items');
return;
}
self.organization(records2);
});
};
HTML调用如下:
<div data-bind="foreach: events">
<div class="display">
<h3><span data-bind="text: recordName"></span></h3>
<h3><span data-bind="text: fields.event_title.value"></span></h3>
<h3><span data-bind="text: fields.date_of_event.value"></span></h3>
<h3><span data-bind="text: fields.event_ratings.value"></span></h3>
<h3><span data-bind="text: fields.organization_name.value"></span></h3>
</div>
</div>
我看到了所有的Event字段(前四个),但organization_name(来自organization recordType)导致出现错误。
如有任何协助或建议,我们将不胜感激。
根据您的描述,您似乎有以下模式:
- 记录类型"组织"(具有一个或多个事件CKReference字段)
- 记录类型"事件"
我的建议是颠倒这种关系,即:
- 记录类型"组织"
- 记录类型"事件"(带有指向组织的CKReference字段)
这给您带来以下好处:
- 您可以查询事件,然后获取每个事件的组织
- 您可以使用引用操作:
- "VALIDATE":CloudKit确保事件引用的组织存在
- "DELETE_SELF":CloudKit在删除组织时删除所有相关事件
- 添加新事件不会更改组织的记录ChangeTag
示例-查询事件,然后获取组织:
var organizations = {};
function getOrCreateOrganizationObject(orgRecordName) {
if(!organizations[orgRecordName]) {
//You'll want to create the new object the Knockout way
organizations[orgRecordName] = {};
}
return organizations[orgRecordName];
}
//Query for events
publicDB.performQuery({recordType: 'Event'})
.then(function(response) {
var orgNamesToLookup = [];
var events = response.records.map(function(record) {
var orgRecordName = record.fields.organization.value.recordName;
var organization = getOrCreateOrganizationObject(orgRecordName);
var event = {
recordName: record.recordName,
title: record.fields.event_title.value,
date: record.fields.date_of_event.value,
rating: record.fields.event_ratings.value,
//Note: You probably need some additional plumbing
// for this to work with Knockout
organization: organization
};
return event;
});
//You can already show the list of events at this point, e.g.
//something like: self.events(events)
var orgRecordNames = Object.keys(organizations);
return publicDB.fetchRecords(orgRecordNames)
.then(function(response) {
response.records.forEach(function(orgRecord) {
var organization = getOrCreateOrganizationObject[orgRecord.recordName];
organization.name = orgRecord.fields.name.value;
});
});
})
然后,在你的HTML中,你会有这样的东西:
<div data-bind="foreach: events">
<div class="display">
<h3><span data-bind="text: recordName"></span></h3>
<h3><span data-bind="text: event_title"></span></h3>
<h3><span data-bind="text: date_of_event"></span></h3>
<h3><span data-bind="text: event_ratings"></span></h3>
<h3><span data-bind="text: organization.name"></span></h3>
</div>
</div>
HTH-
附言:在一个真正的应用程序中,你还想处理错误,以及当有比初始查询中返回的事件更多的情况。