我已将我的应用程序和数据库上下文删除到最简单的位。我有两张桌子,地图和标记。每张地图都有许多标记。有了现有的地图,我似乎无法插入新的标记;我收到了默认的错误回调。
跟踪jaydata.js,我在exec
函数中的SqLiteProvider.js文件中收到错误。这是一个SQL失败,并且正在尝试将Map(使用主键集)插入到表中,该表失败。我做错了什么?
我的背景:
$data.Entity.extend("$org.types.Marker", {
Id: { type: "int", key: true, computed: true },
Left: { type: "int", required: true },
Top: { type: "int", required: true },
Color: { type: "string", required: true },
Name: { type: "string", required: true },
Map: { type: "$org.types.Map", inverseProperty: "Markers" }
});
$data.Entity.extend("$org.types.Map", {
Id: { type: "int", key: true, computed: true },
Title: { type: "string", required: true },
Src: { type: "string", required: true },
Height: { type: "int", required: true },
Width: { type: "int", required: true },
Markers: { type: "Array", elementType: "$org.types.Marker", inverseProperty: "Map" }
});
$data.EntityContext.extend("$org.types.OrgContext", {
Maps: { type: $data.EntitySet, elementType: $org.types.Map },
Markers: { type: $data.EntitySet, elementType: $org.types.Marker },
});
var DB = new $org.types.OrgContext({ name: "webSql", databaseName: "Testing"});
我的测试代码:
DB.Maps.single( function (map) { return map.Id == 1; }, {}, function(map) {
var marker = new $org.types.Marker({
Left: 250,
Top: 350,
Color: 'green',
Name: 'Example',
Map: map});
DB.Markers.add(marker);
DB.saveChanges(function() {
alert(marker.Id);
});
});
答案 0 :(得分:1)
该示例未插入地图对象。如果您已经拥有它,这不是问题。
存在一个常见问题,多次被遗忘:在使用提供商访问数据之前应使用context.onReady()
。
这不能解决问题本身,在保存ne标记对象之前应该添加一行:
DB.Maps.attach(map);
这是将对象移动到上下文范围并将map的entityState属性设置为$ data.EntityState.Unchanged所必需的。如果从数据库中读取实体,则entityState将是未知的,并且提供程序会尝试将其另存为新记录。尝试将地图实体保存为新记录会导致SQL错误,因为存在ID = 1的现有记录。
更新的代码如下所示:
var DB = new $org.types.OrgContext({ name: "webSql", databaseName: "Testing" });
DB.onReady(function () {
DB.Maps.single(function (map) { return map.Id == 1; }, {}, function (map) {
DB.Maps.attach(map); //this sets map.entityState = $data.EntityState.Unchanged;
var marker = new $org.types.Marker({
Left: 250,
Top: 350,
Color: 'green',
Name: 'Example',
Map: map
});
DB.Markers.add(marker);
DB.saveChanges(function () {
alert(marker.Id)
});
});
});
更新:如果使用新的Map实体保存新的Maker,则无需附加,并且您的代码只需要DB.onReady()