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



我有一个应用程序,它可能在一个WebSql表中容纳600k多条记录。

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

正如你所能想象的,这是非常缓慢的(需要几分钟)。我发现很难相信没有办法从JayData截断WebSqlIndexedDb表。我错了吗?还是有更简单的方法?

谢谢。

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

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、两个上下文,并且只清理包含可删除记录的一个。

它们是两种方法,您可以使用本地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");
                   });
                }
            });
        }); 
    }

相关内容

  • 没有找到相关文章

最新更新