Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JayData:尝试以1对多的方式插入,得到默认错误回调_Javascript_Sqlite_Jaydata - Fatal编程技术网

Javascript JayData:尝试以1对多的方式插入,得到默认错误回调

Javascript JayData:尝试以1对多的方式插入,得到默认错误回调,javascript,sqlite,jaydata,Javascript,Sqlite,Jaydata,我已将应用程序和数据库上下文精简到最简单的部分。我有两张桌子,地图和记号笔。每个地图都有许多标记。对于现有地图,我似乎无法插入新标记;我得到了默认的错误回调 通过jaydata.js进行跟踪,我在SqLiteProvider.js文件的exec函数中发现一个错误。这是一个SQL故障,正在尝试将映射(设置了主键)插入表中,但失败。我做错了什么 我的背景: $data.Entity.extend("$org.types.Marker", { Id: { type: "int", key: t

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

通过jaydata.js进行跟踪,我在SqLiteProvider.js文件的
exec
函数中发现一个错误。这是一个SQL故障,正在尝试将映射(设置了主键)插入表中,但失败。我做错了什么

我的背景:

$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);
        });

    });

该示例不插入贴图对象。如果你已经有了,这不是问题

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

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

DB.Maps.attach(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)
                });
            });
        });

更新:如果使用新地图实体保存新Maker,则无需附加,代码只需DB.onReady()

谢谢;关键部分是
attach()
。同样感谢您对entityState属性的解释——这完全有道理。我想补充一点,文档对
context.onReady()
-我已经浏览了几周的JayData文档,这是我第一次读到这方面的内容!谢谢你的反馈,我必须完全同意你的文件,我们开始在网站上对此进行改进。太棒了。我认为JayData是一个非常有用的ORM,我很喜欢使用它。@Robesz每个人都在为文档和使用JayData的几个例子而苦恼。这是一个强大的工具,但人们必须知道如何使用它。顺便说一句,请看我最近的问题。我需要一些关于jay数据的指导。。谢谢。@DontVodeMeDown:您可以在这里找到更多示例:。这是我第一次听到大家对医生的不满,请提出具体问题,团队会帮助你。