您好,我的应用程序(目前仍在开发中)是一个索引数据库,在一个集合中有400条记录。
索引包括:id,vendor,price,model和subCategoryID。
以下是记录样本:
{
id: 199,
bundles: [235,548,983,918],
categoryID:0 ,
subCategoryID: 7,
imageUrl : "/mock/mobiles/Alcatel-One-Touch-Pop-S7.png"
model: "One Touch pop S7"
vendor: "Alcatel",
price: [213.4],
tag:[],
productTexture: "data:image/png;base64,iVBORw......",
alphaMap: "data:image/jpeg;base64,/9j/4AAQSk...."
}
(productTexture和alphamap是base64图像字符串,用于三个目的)。
我正在实施产品过滤的用户界面,我想要使用特定的" subCategoryID"来检索集合中的所有产品。我用以下方法完成了这个:
Store.prototype.getSubCategoryProducts = function ( subCategoryID, callback ) {
console.time( "getSubCategoryProducts" );
var results = [];
var transaction = this.db.transaction( [ this.config.collection ], "readonly" );
var store = transaction.objectStore( this.config.collection );
var index = store.index( "subCategoryID" );
index.openCursor().onsuccess = function ( evt ) {
var cursor = evt.target.result;
if ( cursor ) {
if ( cursor.value.subCategoryID === subCategoryID ) {
results.push( cursor.value );
}
cursor.continue();
} else {
console.timeEnd( "getSubCategoryProducts" );
callback( results );
}
};
};
然而,在我测试我的方法之后我观察到的是它非常慢......
我的控制台中输出console.TimeEnd()
:getSubCategoryProducts: 11759.143ms
我相信12秒真的很慢。 是否有我遗漏的东西或我在这里做错的任何事情,还是因为每个对象都有base64图像字符串?即便如此,我想12秒是不可接受的。
如果我的方法有问题或者有任何改进的余地,请告诉我。
更新
经过一番思考后,我添加了一个导致改进的范围。请求现在 需要3秒但仍然很慢。
以下是新方法:
Store.prototype.getSubCategoryProducts = function ( subCategoryID, callback ) {
console.time( "getSubCategoryProducts" );
var results = [];
var transaction = this.db.transaction( [ this.config.collection ], "readonly" );
var store = transaction.objectStore( this.config.collection );
var boundKeyRange = IDBKeyRange.only( subCategoryID );
var index = store.index( "subCategoryID" );
index.openCursor( boundKeyRange ).onsuccess = function ( evt ) {
var cursor = evt.target.result;
if ( cursor ) {
results.push( cursor.value );
cursor.continue();
} else {
console.timeEnd( "getSubCategoryProducts" );
callback( results );
}
};
};
答案 0 :(得分:1)
您遇到的问题是将文件存储在数据库中,这肯定会降低Indexeddb
性能,尤其是在移动设备上。
有两种不同的解决方案,我可以想到:
productTexture
和alphaMap
),并将它们存储在磁盘上的某个位置,并在数据库中保留它的链接。 productTexture
和alphaMap
存储在与其他数据不同的表中。然后,获取类别中的产品的查询将非常快速地执行,显示占位符,以便用户感觉某些东西正在移动应用程序,然后向存储图像的表格发出多个请求,并在加载时显示它们。 / LI>