我一直在尝试在基于webkit的浏览器中使用web sql数据库api.我一直在主ui线程和web worker中使用async api.两个线程都访问同一个数据库(你知道这是sqlite的继承)
一切都表现良好,但偶尔交易丢失或一次交易失败,似乎是时机/竞争条件.似乎对底层sqlite数据库的访问不是线程安全的.
多一点背景.我的Web工作者只是对一个表执行查询,该表可能从主ui线程中插入了一条记录.
我想知道是否实际记录了哪些本地/网络存储可以安全地从ui线程和Web工作线程访问?我已经读过某个地方,indexeddb api是线程安全的,但是这对我现在没有帮助,因为浏览器支持它对于我所针对的浏览器来说很少/不存在(至少我是这么认为的 - 我从http获取我的信息)://caniuse.com)
任何见解都会感激不尽
我正在编写一个非常简单的数据库应用程序,我想在本地存储(而不是查找远程数据库).我喜欢用于设计界面的HTML/Javascript,而且它们是跨平台的(每个人都有浏览器!),所以我真的想把网页写成前端.不应涉及客户端/服务器交互 - 我只希望用户能够使用浏览器而不是本机程序与数据库进行交互.
但是,我可以看到从浏览器访问数据库的唯一方法是使用WebSQL或IndexedDB之类的东西.但是,这两者都抽象出了管理数据库文件本身的过程,并将其存储在某个用户设置中.我想将数据库文件本身与应用程序一起分发.
简而言之:有没有办法使用HTML/Javascript来修改本地SQLite数据库文件?或者HTML不是我应该用于此类应用程序的工具?
编辑: 可能相关
我们开发了一个iPad应用程序(使用Sencha Touch和Phonegap),使用websql db在本地存储数据.在同步过程中会在db中插入数千条记录,但有时由于内存使用率过高,应用程序会在进程中间崩溃.运行应用程序,Xcode Instruments工具显示"VM:SQLite页面缓存"分配的大约80mb内存.问题是:有没有办法清除这个"页面缓存",或关闭与db的连接?我已经阅读了一些关于pragma的线程,用于在SQLite中设置缓存大小,但我没有找到使用websql db做到这一点的方法.
我使用HTML5 + WebSQL开发了一个应用程序,它将数据从本地数据库同步到服务器.
删除数据时,sqlite数据库文件的大小保持不变.我知道这包含空的空间,并且在插入新数据时它将被填充但我希望由于限制而保持尽可能小的尺寸.
我知道sqlite中的VACUUM命令可以压缩数据库并删除未使用的空间,但是当我尝试从JavaScript在WebSQL数据库上运行它时它失败并显示错误"逻辑错误或缺少数据库".从浏览器外部运行命令工作正常.
我的问题是:
可以通过JavaScript以某种方式执行VACUUM命令吗?
浏览器是否自动实现并最终调用?(找不到任何关于此的文档)
谢谢你的帮助.
我即将开始一个针对平板电脑设备的项目 - 基本上是一堆需要离线工作的"调查" .
约束:
因此,有几种选择......例如
答:我可以使用像PhoneGap这样的框架,这样我就可以部署到多个平台并获得包装器的扩展优势.
B.)我可以完全原生,但是需要为多个平台编写重复的代码,而我没有桌面版本
c.)我使用HTML5(离线和WebSQL/localStorage)(是的我知道WebSQL/IndexedDB的争论,但是现在"在基于webkit的浏览器上工作"就足够了)
我非常依赖选项(C),因为我真的想将它作为基于Web的应用程序运行 - 但我还没有涉足到离线支持/ WebSQL.我在StackOverflow上读到了类似的问题,表明localStorage的上限为5Mb,我试图创建8或15Mb数据库提示(在iOS/Safari上)的用户分别允许10Mb或50Mb的简短测试 - 我认为足够的空间.
在我深入研究这个HTML5方向之前,我想知道其他人已经冒了这些水,如果有任何已知的问题我应该知道吗?
1.)DB有多大规模让其他开发人员成功推进?
2.)用户是否可以不小心删除数据库,localStorage或缓存并自行搜索?
3.)是否有任何平板电脑设备应该"理论上"能够处理实际存在问题的平板设备?
我做了一个演示chrome扩展来比较websql和indexeddb,并了解它们如何更详细地工作.
令我惊讶的是,它表明,与最天真的sql命令相比,indexeddb要慢得多.
由于不推荐使用websql而支持indexeddb,因此假设indexeddb与websql一样快或者更快.
我假设我在indexeddb代码中做错了什么.因为自嘲的东西是要快得多将是愚蠢的,我以为他们知道有利于IndexedDB的自嘲的时候的WebSQL他们在做什么.
sql搜索代码:
// Search entries
var term = search_query;
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM places', [], function (tx, results) {
console.log("sql search");
var count = 0;
var wm = WordsMatch.init(term.trim().toLowerCase());
var len = results.rows.length
for (var i = 0; i < len; ++i) {
var item = results.rows.item(i);
if (wm.search(item.url.toLowerCase())) {
//console.log(item.id, item.url);
++count;
}
}
console.log("Search matches:", count);
console.log("\n");
});
}, reportError);
Run Code Online (Sandbox Code Playgroud)
indexeddb搜索代码:
PlacesStore.searchPlaces(search_query, function(places) {
console.log("indexedDB search");
var count = places.length;
console.log("Search matches:", count);
console.log("\n"); …Run Code Online (Sandbox Code Playgroud) 我用以下代码调用函数db.transaction:
db.transaction(createSheetDB, function(){alert("Sheet creation error!")}, function(){alert("Sheet created!")});
Run Code Online (Sandbox Code Playgroud)
函数createSheetDB是一个回调函数,由db.transaction()隐式调用,它也传递一个参数tx.我已经实现了这样的函数createSheetDB(tx):
function createSheetDB(tx) {
var nextId = getNextId();
tx.executeSql("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')", [],
function(){alert("Sheet row inserted!")},
function(tx, err){alert("Sheet row insertion Error: "+err.message+" "+err.code)}
);}
Run Code Online (Sandbox Code Playgroud)
现在问题是sheetName和desc的值仅在调用函数中可用.如何将它们传递给函数createSheetDB(tx)?
在普通的Android Web应用程序中,WebSQL数据库的最大大小通常约为8MB.在我正在制作的混合网络应用程序中,我想增加此限制.我该怎么做呢?
似乎WebStorage可能与它有关,但是我可以在那里看到的似乎设置大小的唯一方法setQuotaForOrigin被标记为已弃用.
欢迎示例代码(不推荐使用):)
我的应用程序中有以下代码:
openDatabase('main', '1.0', 'Database display name', 50 * 1024 * 1024)
Run Code Online (Sandbox Code Playgroud)
在Apple推出Safari 7之前它运行良好.现在它失败了,但有以下异常:
SecurityError:DOM异常18:尝试突破用户代理的安全策略.
有谁知道如何解决?
我有 JavaScript 函数,它从我的本地数据库返回选定值的数组。
var dataBase = {
select : selectFunction
}
var db = openDatabase(..);
var data=[ ];
function selectFunction() {
db.transaction(function (t) {
t.executeSql("SELECT * FROM Table", [], function (t, results) {
for (i = 0; i < results.rows.length; i++) {
data.push(results.rows.item(i));
}
});
});
return data;//return "stackoverflow" //works fine
}
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情
var getSelect = dataBase.select();
alert(getSelect);
Run Code Online (Sandbox Code Playgroud)
如果我返回像“stackoverflow”这样的字符串,这会正常工作
alert result: stackoverflow
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试返回“数据”,则该函数返回未定义
我注意到 db.transaction在 return 语句之后执行,我不知道如何解决这个问题。