0

アプリケーションとデータベースのコンテキストを最も単純なものにまで落とし込みました。マップとマーカーの 2 つのテーブルがあります。各マップには多数のマーカーが存在します。既存のマップでは、新しいマーカーを挿入できないようです。デフォルトのエラー コールバックを取得しています。

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

    });
4

1 に答える 1

1

この例では、マップ オブジェクトは挿入されません。すでに持っている場合は問題ありません。

何度も忘れられている一般的な問題がありcontext.onReady()ます。プロバイダーでデータにアクセスする前に を使用する必要があります。

これ自体では問題は解決しません。ne マーカー オブジェクトを保存する前に、次の 1 行を追加する必要があります。

DB.Maps.attach(map);

これは、オブジェクトをコンテキストのスコープに移動し、マップの entityState プロパティを $data.EntityState.Unchanged に設定するために必要です。DB からエンティティを読み取ると、entityState は不明になり、プロバイダーはそれを新しいレコードとして保存しようとします。ID=1 の既存のレコードがあったため、マップ エンティティを新しいレコードとして保存しようとすると、SQL エラーが発生しました。

更新されたコードは次のようになります。

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

UPDATE : 新しい Maker を新しい Map エンティティで保存する場合、アタッチする必要はなく、コードには DB.onReady() のみが必要です。

于 2013-02-08T12:21:39.060 に答える