0

我已经将我的应用程序和数据库上下文剥离到最简单的部分。我有两张桌子,地图和标记。每张地图都存在许多标记。使用现有的地图,我似乎无法插入新的标记;我得到了默认的错误回调。

跟踪 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);
        });

    });
4

1 回答 1

1

该示例不插入地图对象。如果您已经拥有它,这不是问题。

有一个普遍的问题,被遗忘了很多次:context.onReady()应该在使用提供者访问数据之前使用。

这本身并不能解决问题,在保存 ne 标记对象之前应该添加一行:

DB.Maps.attach(map);

这是将对象移动到上下文范围并将映射的 entityState 属性设置为 $data.EntityState.Unchanged 所必需的。如果您从 DB 中读取实体,则 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)
                });
            });
        });

更新:如果您使用新的地图实体保存新的制造商,则无需附加,您的代码只需要 DB.onReady()

于 2013-02-08T12:21:39.060 回答