gpt4 book ai didi

android - SQLiteOpenHelper onCreate 运行两次?

转载 作者:行者123 更新时间:2023-11-29 17:46:38 25 4
gpt4 key购买 nike

在我的数据库处理程序类(扩展 SQLiteOpenHelper)中,我有 onCreate() 方法:

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_TASKS);
db.execSQL(CREATE_TABLE_CONTACTS);
}

有时(很少,但仍然如此)这会导致崩溃,因为显然第一个表已经存在。显然我可以(并且确实)将 IF NOT EXISTS 添加到语句中来解决这个问题,但我想知道的是在什么情况下 onCreate() 会运行如果表已经存在。这通常是不应该发生的,所以我可能搞砸了,但我不知道是什么。

最佳答案

I want to know is what are the circumstances where onCreate() would be run if the table already exists

竞争条件:多个线程试图通过 getReadableDatabase()getWritableDatabase() 获取数据库。

特别是如果线程在 code 中的 getVersion()setVersion() 之间交错:

242            final int version = db.getVersion();
243 if (version != mNewVersion) {
...
251 if (version == 0) {
252 onCreate(db);
253 } else {
254 if (version > mNewVersion) {
255 onDowngrade(db, version, mNewVersion);
256 } else {
257 onUpgrade(db, version, mNewVersion);
258 }
259 }
260 db.setVersion(mNewVersion);

有大量的处理和涉及的一些磁盘 I/O,因此两个线程在这场竞争中结束并不难。

可能的解决方案:

  • 同步:使用 Java 同步原语来防止其他线程同时尝试创建数据库。

  • 具有同步功能的单例。确保只有一个数据库助手。

  • 仅在单线程中访问数据库。

关于android - SQLiteOpenHelper onCreate 运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127147/

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