gpt4 book ai didi

Android:在 SQLite 数据库上写入多线程

转载 作者:IT王子 更新时间:2023-10-29 06:28:59 25 4
gpt4 key购买 nike

在我的主要 Activity 的 onCreate() 方法中,我调用了我的 dbManager 的构造函数,我调用了创建 SQLiteOpenHelper 实例的 open 函数,然后我对其调用 getWritableDatabase()。在 UIThread 中,我将记录添加到数据库并将这些记录保存到 ArrayList。另外两个线程检查 ArrayList 做的事情,而不是更新列表和数据库。现在我想在 UI 中添加一个按钮,以使用 AsyncTask 删除数据库和列表记录。我读到 SqliteOpenHelper 对象持有一个数据库连接。因此,如果有一个帮助程序实例,则只有一个数据库连接。可以从多个线程使用此连接,并且 SqliteDatabase 对象使用 java 锁来保持访问序列化。那么如果我有多个线程写数据库,一个线程会等到前一个线程完成他的操作吗?
添加新功能(删除所有)可能会产生问题,因为我必须避免两个线程之一可能会尝试编辑不再存在的记录。我怎样才能实现我的目标?谢谢。

最佳答案

数据库:

只要你只使用一个助手,你就是线程安全的,不需要做任何事情。
在多线程应用程序中,您只需要在创建助手时使用 synchronized。您可以使用 transacion如果你想定义一个临界区(多个原子操作)。
getWritableDatabase()close(false) 包装每个调用:

public void doSomething() {
SQLiteDatabase tdb = getWritableDatabase();
dbInstance.writeSomething(tdb, 1);
close(false);
}

通过这种方式,我有多个线程读取和写入数据库没有任何问题。

您的应用逻辑:

使用内存来跟踪对象状态,并仅使用数据库作为存储。因此,如果一个线程从数据库中删除行 - 您可以立即更新内存中的对象,并相应地处理您的用户界面。
如果您的数据非常大,那么您可以只在内存中保留脏行 ID 的 SparseArray
在这里同步一些操作可能会有用。

关于Android:在 SQLite 数据库上写入多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16301946/

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