gpt4 book ai didi

java - 维护 GridView 中项目的顺序

转载 作者:行者123 更新时间:2023-12-01 22:50:57 24 4
gpt4 key购买 nike

假设我有一个 GridView ,其中有很多项目。 GridView 内的项目可以通过拖放来重新排列。一旦洗牌完成,我想将项目的顺序存储在数据库中,以便我稍后可以读取它以恢复相同的顺序。

我的思维过程是为每个项目分配顺序,当洗牌完成时,我计划用新顺序更新数据库中的所有相关记录。但运行许多更新查询似乎是一项昂贵的任务。请建议我采用优化技术来完成任务。提前致谢。

最佳答案

SQLite 中的大多数性能问题都来自于在自己的事务中执行每个命令的额外开销。如果你只是做这样的事情:

final SQLiteDatabase database = this.openHelper.getWritableDatabase();
for(Entity entities : viewModels) {

// Perform your updates here
ContentValues contentValues = EntityConverter.toContentValues(entity);
database.update(table, contentValues, "_id = ?", entity.getId());
}

然后,每次调用 update(...) 都会在单独的事务中执行。如果您只想更新 3 或 4 行,那没关系,但如果您想更新数百甚至数千行,额外的开销就会增加,整个过程可能需要很长时间。

<小时/>

解决方案很简单:只需在一个事务中执行所有操作

我怀疑您会以这种方式遇到任何性能问题。尝试这样的事情:

final SQLiteDatabase database = this.openHelper.getWritableDatabase();
try {
// Begin the transaction
database.beginTransaction();

for(Entity entities : viewModels) {

// Perform your updates here
ContentValues contentValues = EntityConverter.toContentValues(entity);
database.update(table, contentValues, "_id = ?", entity.getId());
}

// When everything worked set the transaction successful.
// If you don't call this method the transaction will be rolled back.
database.setTransactionSuccessful();
} finally {
// End the transaction
database.endTransaction();
}

除了极大的性能提升之外,这还有其他优点。想象一下,您想要更新数据库中的 2000 行,您在一个事务中执行所有操作,但应用程序中途崩溃了。如果您在自己的事务中执行了每个命令,那么您现在可能会遇到一个大问题。一半数据已提交,另一半丢失。您的数据库可能已损坏或处于不良状态。但是,如果您在一次交易中完成所有操作,那么您就可以省钱,因为交易可能完全成功,也可能完全失败。如果执行事务时出现错误或异常或任何其他情况,则不会对数据库进行任何更改。只要您使用像我上面解释的那样的事务,您就可以确保事务中的每个命令要么成功执行,要么根本不执行任何命令。

关于java - 维护 GridView 中项目的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24739278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com