我有一个应用程序,它可能在一个WebSql
表中容纳600k多条记录。
我在JayData
中搜索了一种快速从表中删除所有记录的方法,但我找到的唯一选项是首先检索记录,将其从集合中删除,然后在集合上调用saveChanges()
。
正如你所能想象的,这是非常缓慢的(需要几分钟)。我发现很难相信没有办法从JayData
截断WebSql
或IndexedDb
表。我错了吗?还是有更简单的方法?
谢谢。
有一种方法可以实现这一要求,简单的情况是,如果您想从所有表中删除所有记录,并从一个干净的数据库开始。
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");
});
}
});
});
}