使用JayData从WebSql / IndexedDb表中删除所有记录的最快方法

时间:2013-08-20 19:36:33

标签: indexeddb web-sql jaydata

我有一个应用程序可能在一个WebSql表中保存600k +记录。

我在JayData中搜索并搜索了一种快速删除表中所有记录的方法,但我找到的唯一选项是实际首先检索记录,从集合中删除它们,以及然后在集合上调用saveChanges()

你可以想象,这是非常缓慢的(需要几分钟)。我发现很难相信无法从WebSql截断IndexedDbJayData表格。我错了吗或有更简单的方法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

有一种方法可以达到这个要求,简单的情况是你想要从所有表中删除所有记录并从一个干净的数据库开始。

EntityContext的构造函数接受dbCreation参数:

var context = new Northwind({ name: 'webSql', databaseName: 'Northwind', dbCreation: $data.storageProviders.DbCreationType.DropAllExistingTables });

DropAllExistingTables创建类型指示JayData不仅删除所有记录,还删除所有表 - 并在所有上下文创建期间重新创建它。这样,您可以在应用程序启动时丢失整个数据库,因此不要将此dbCreation指定为“主”上下文,而是仅在需要清理数据库时创建一个新的 - 并将上下文实例引用设置为主上下文

var context = new Nortwind({name: 'webSql', databaseName: 'Northwind'});
//... your app logic ...
var cleanContext = new Nortwind({name: 'webSql', databaseName: 'Northwind', dbCreation: $data.storageProviders.DbCreationType.DropAllExistingTables});
context = cleanContext;
// ...

如果您使用IndexedDB,则应在创建cleanContext之前关闭现有上下文:

if (context.storageProvider.db) {
    context.storageProvider.db.close();
}

如果你想保留一些数据,那就很棘手了,因为在这种情况下你需要两个模式,两个DB,两个上下文,只清理包含可删除记录的模式。

答案 1 :(得分:0)

他们有两种方法可以使用本机javascript或jaydata 你需要从任何控制器调用波纹管功能

 DropTable("fav_master",fav_master);

你必须在控制器中编写这个函数,只有函数代码如下所示

方法1

        function DropTable(TableName,TableObj){
        var db = window.openDatabase("ROW_DB", "", "Cordova Demo", 200000);
        db.transaction(function (tx) {
            tx.executeSql("update sqlite_sequence set seq = 0 where name ='"+ TableName +"'");
            tx.executeSql("delete from '"+ TableName +"'");

            }); 
        }
       }

这里我给出了数据库空白版本,因为在创建时

方法2

       function DropTable(TableName,TableObj){
        var db = window.openDatabase("ROW_DB", "", "Cordova Demo", 200000);
        db.transaction(function (tx) {
            tx.executeSql("update sqlite_sequence set seq = 0 where name ='"+ TableName +"'");


            });

        var search;
        var promise =  TableObj.readAll();
        promise.then(function (dataset) {
            $scope.$apply(function () {
                $scope.DataSet = dataset;
                for (var x=0;x<$scope.DataSet.length;x++){
                    //console.log("Data"+$scope.DataSet[x].Id);
                    datarow=$scope.DataSet[x];
                    datarow.remove()
                    .then(function() {
                        $scope.$apply(function() {
                           var dataset = $scope.DataSet;
                           dataset.splice(dataset.indexOf(datarow), 1);
                        });
                    })
                   .fail(function(err) {
                       alert("Error deleting item");
                   });
                }
            });
        }); 
    }