好的,首先,对不起我的英语.
我在一个web项目中工作,显示当我在输入框中键入内容时,但我想使用IndexedDB来提高Firefox中的查询速度.
使用WebSQL我有这句话:
db.transaction(function (tx) {
var SQL = 'SELECT "column1",
"column2"
FROM "table"
WHERE "column1" LIKE ?
ORDER BY "sortcolumn" DESC
LIMIT 6';
tx.executeSql(SQL, [searchTerm + '%'], function(tx, rs) {
// Process code here
});
});
Run Code Online (Sandbox Code Playgroud)
我想用IndexedDB做同样的事情,我有这个代码:
db.transaction(['table'], 'readonly')
.objectStore('table')
.index('sortcolumn')
.openCursor(null, 'prev')
.onsuccess = function (e) {
e || (e = event);
var cursor = e.target.result;
if (cursor) {
if (cursor.value.column1.substr(0, searchTerm.length) == searchTerm) {
// Process code here
} else {
cursor.continue();
}
}
};
Run Code Online (Sandbox Code Playgroud)
但是速度太慢而且我的代码有问题......我想知道有没有更好的方法来做到这一点.
谢谢回复.
我试图通过浏览器中的缓存(IndexedDB)制作离线地图.我理解这个概念是我在连接到互联网时首先下载并存储地图的图块.
然后我必须在逻辑上离线加载磁贴.
但是,我无法弄明白.
如何存储它们以及如何在逻辑上再次加载它们?我被困在这里 我正在使用 leaflet APIfor maps.如何实施?
现在大多数浏览器都支持IndexedDB将数据/文件直接存储为File,Blob或ArrayBuffer.
此代码将IDB密钥"File1"保存为文件
<input type="file" id="userfile" />
var a = document.getElementById("userfile");
var b = a.files[0];
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用以下代码直接将此文件保存到IDB
//LocalForage is a library for indexedDB developed by Mozilla
//Note: localforage._config.driver=asyncStorage (IDB method)
function run(){
//"File1" = IDB data table key and b=value
localforage.setItem("File1", b, function(err, value) {
console.log(err)
});
}
a.onchange = function(){
run()
}
Run Code Online (Sandbox Code Playgroud)
此代码将IDB密钥"BlobFile"保存为Blob
mb = new Blob([b],{type:b.type});
function runB(){
localforage.setItem("BlobFile", mb, function(err, value){
console.log(err)
});
}
a.onchange = function(){
runB()
}
Run Code Online (Sandbox Code Playgroud)
我想知道将文件存储到IDB的最佳做法是什么.(文件/斑点/ ArrayBuffer) …
我想在我的IndexedDB的objectstore中保存约35000个对象.我使用下面的代码插入.
AddListings = function (x2j_list_new, callback) {
var transaction = db.transaction(["listings"], IDBTransaction.READ_WRITE);
var count = 0;
transaction.oncomplete = function (event) {
if (callback) {
console.log('x2jShowListing Added ' + count + '/' + x2j_list_new.length);
callback([count, x2j_list_new.length]);
}
};
transaction.onerror = function (e) {
console.log("myError: ", e);
if (callback) {
callback(false);
}
};
var store = transaction.objectStore("listings");
$.each(x2j_list_new, function (index0, item0) {
var request = store.put(item0);
request.onsuccess = function (event) {
count++;
// event.target.result
};
});
});
};
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但循环和插入约35000个对象使UI无响应约200秒.我想也许我可以使用WebWorkers,但是WebWorkers中没有IndexedDB.我试图找到批量插入的方法,找不到一个.有关如何在不阻止UI的情况下插入大量对象的任何想法?
当我试图在IndexedDB的Chrome的非对应的斑点,我发现我可以作为arraybuffer通过AJAX读取图像,将其存储在索引资料,提取它,将其转换为一个blob,然后使用显示它在一个元素来创建一个解决方法以下代码:
var xhr = new XMLHttpRequest(),newphoto;
xhr.open("GET", "photo1.jpg", true);
xhr.responseType = "arraybuffer";
xhr.addEventListener("load", function () {
if (xhr.status === 200) {
newphoto = xhr.response;
/* store "newphoto" in IndexedDB */
...
}
}
document.getElementById("show_image").onclick=function() {
var store = db.transaction("files", "readonly").objectStore("files").get("image1");
store.onsuccess = function() {
var URL = window.URL || window.webkitURL;
var oMyBlob = new Blob([store.result.image], { "type" : "image\/jpg" });
var docURL = URL.createObjectURL(oMyBlob);
var elImage = document.getElementById("photo");
elImage.setAttribute("src", docURL);
URL.revokeObjectURL(docURL);
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.但是,如果我尝试相同的过程,但这次装载的视频(.MP4)我不能表现出来:
...
var oMyBlob = new Blob([store.result.image], …Run Code Online (Sandbox Code Playgroud) 我很好奇是否有一个库或项目为IndexedDB或WebSQL提供通用接口,具体取决于用户的浏览器支持.如果他们使用Chrome/Safari,请使用WebSQL,如果他们使用的是Firefox或Internet Explorer,请使用IndexedDB.
这个问题的海报似乎有自己开发的解决方案,但没有提供任何源代码.
我想从WebSql更改为Indexeddb.但是,如何进行SQL查询
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com'
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com' and age = 30
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com' and name = 'Bill'
etc
Run Code Online (Sandbox Code Playgroud)
使用IndexedDB?例如,我在阅读indexedDb 的文档时注意到,所有示例当时只查询一个索引.所以你可以做到
var index = objectStore.index("ssn");
index.get("444-44-4444").onsuccess = function(event) {
alert("Name is " + event.target.result.name);
};
Run Code Online (Sandbox Code Playgroud)
但我需要同时查询多个索引!
我还发现了一些关于复合索引的有趣帖子,但它们只有在查询复合索引中的所有字段时才有效.
有没有办法检查IndexedDB数据库是否已经存在?当程序尝试打开不存在的数据库时,将创建数据库.我能想到的唯一方法是如下所示,我测试objectStore是否已经存在,如果没有,则删除数据库:
var dbexists=false;
var request = window.indexedDB.open("TestDatabase");
request.onupgradeneeded = function(e) {
db = e.target.result;
if (!db.objectStoreNames.contains('todo')) {
db.close();
indexedDB.deleteDatabase("TestDatabase");
} else {
dbexists=true;
}
}
Run Code Online (Sandbox Code Playgroud) 我刚开始使用indexeddb并转换Web SQL.
我尝试使用add和put在数据存储中添加一些数据.我真的不知道使用这两个函数的区别是什么/是什么.
我想我必须知道差异所以我可以适当地使用它们.
谢谢你
我正在编写一个我想在iOS应用商店中发布的HTML5应用程序.使用PhoneGap或包装在UIWebView控件中.
我在为应用程序存储数据方面有什么选择,我有点困惑.
是否使用适合在此类应用程序中存储应用程序数据的localStorage,WebSQL或IndexedDB技术?我将存储JSON和XML数据.
请记住,如果用户无意中删除了这些数据,那么他们将失去工作,这显然是我不想发生的.
我知道减轻这种风险的唯一真正方法是将数据同步到"云"或其他在线系统 - 我可以在将来的版本中执行此操作,但现在不能.最初我只想在本地存储数据,如果这是一种合理稳定的做事方式.
根据我的理解,当清除cookie时,浏览器也将清除任何localStorage数据.因此,我可以看到用户意外地执行此操作的规则.
WebSQL看起来很不错 - 用户无法在iOS上无意中删除它.他们实际上必须进入浏览器设置并手动删除数据库.
但是WebSQL的缺点在于,未来我可能不会支持它.
使用IndexedDB,我不清楚何时清除该数据.删除cookie时是否也会删除它,或者Safari设置中的"数据库"选项是否会控制它?
IndexedDB是更好的解决方案,因为它将来会比WebSQL提供更好的支持吗?
还有其他更合适的解决方案我不知道吗?
indexeddb ×10
javascript ×6
web-sql ×3
blob ×2
html5 ×2
ajax ×1
filereader ×1
ios ×1
leaflet ×1
offline ×1