我尝试使用localStorage将外部应用与浏览器集成。
在浏览器中运行的javascript在localStorage上写入值,外部应用程序从sqlite DB(localstorage)读取值并删除记录。
问题是,当我从localStorage DB中删除记录时,浏览器不会更新,因为它会在内存中保留已从localStorage中删除的旧值。这样,如果外部应用程序已经读取了该值,我就无法跟上。
那么,如何让浏览器重新加载localstorageDB? 如果不可能,您能为这个问题提出替代方案吗?
答案 0 :(得分:1)
浏览器和外部应用是否使用相同的浏览器导航到同一网页?如果没有,那么这不会很好。
您的外部应用程序是什么写的?外部应用程序可能更容易创建一个小型Web服务器(即如果它用nodejs编写,您可以使用express来创建一个小型Web服务器),并且您的浏览器中的javascript可以向localhost发出请求:8080(或任何端口)你绑定到),你可以通过浏览器的http请求通过这种机制进行通信=>外部应用程序。
答案 1 :(得分:1)
首先,WebSQL是abandoned。 它不太可能由其他浏览器实施,Chrome将来planning将其删除。 Chrome也可以随时自由移动/重组。
您不能要求浏览器永远支持每个原型技术,同时保持浏览器的快速和免费。 所有浏览器都削减功能 不推荐使用的非标准功能是第一个。
Macmee建议让外部程序打开网络服务器是有道理的。 可以使用There are many个嵌入式Java Web服务器, 控制服务器时,交叉原点不是问题。
至于你的问题,也许就是你读它的方式,因为我无法复制。 以下代码从数据库中读取一个计数,我使用外部SQLite浏览器进行更改。
var db = openDatabase('mydb', '1.0', 'Test DB', 1 * 1024 * 1024);
db.transaction( ( tx ) => {
tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (count int)');
tx.executeSql('DELETE FROM LOGS');
tx.executeSql('INSERT INTO LOGS (count) VALUES (0)');
});
setInterval( () => {
db.readTransaction( ( tx ) => {
tx.executeSql( 'SELECT count FROM LOGS', null, ( tx, rs ) => {
document.querySelector( 'div' ).textContent = rs.rows[0].count;
});
});
}, 500 );

Count: <div>?</div>
&#13;
有效。 每次在从db浏览器修改计数后写到磁盘时,Chrome都可以立即读取更改。 (Chrome版本47.0.2526.73 beta-m)
那么也许您可以仔细检查一下您是否已将更改实际写入外部程序中的磁盘,并且您的js实际上是在新事务中读取?
(如果你保持相同的交易,你将看不到新的提交,这是transaction的用途。)