- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在创建一个允许许多不同的应用程序 Activities
从 TabActivity
开始(最多约 25 个)。大多数 Activity 都需要来自 sqlite 数据库的数据,所以当 onCreate
运行,一个AsyncTask
创建一个 SQLiteOpenHelper 对象(它将打开一个可读/可写数据库),运行查询,检索数据,然后关闭所有内容。
我只是想弄乱一下看看我是否可以破坏某些东西,所以我添加了每个 Activity
到 TabActivity's
TabHost
.然后我开始尽可能快地混合每个选项卡。
我注意到我很快就开始在 LogCat 中看到:Caused by: android.database.sqlite.SQLiteException: database is locked: BEGIN EXCLUSIVE;
然后该应用程序继续死亡。
对于 TabHost
,通常只有大约 4-6 个选项卡(无论如何我可以限制用户) .我无法通过少量选项卡来破坏任何东西,但我仍然担心我访问数据库的方式可能很糟糕。
如何防止我的 SQLiteDatabase 对象导致锁定?
如果我创建一个 ContentProvider
这会消除数据库锁定的可能性吗?
对于我可以为从 SQLiteDatabase
访问数据所做的更改,您有什么建议吗? ?
我最终采用了使用 Application
的方法类和存储 1 SQLiteOpenHelper
并尽力保持同步。这似乎工作得很好——我把我所有的 25 个 Activity 都放在 TabHost
中并毫无错误地将它们混搭在一起。
我调用 ((SQLiteDbApplication)getApplication()).setDbHelper(new DBHelper(this, Constants.DB_NAME, null, Constants.DB_VERSION_CODE));
每个 onCreate()
中的方法(如下所示)在我的 Activity 中
对这种方法或我使用此 Application
所做的更改的任何进一步建议类(class)?
import android.app.Application;
import android.database.sqlite.SQLiteDatabase;
public class SQLiteDbApplication extends Application {
private DBHelper dbHelper;
private SQLiteDatabase db;
public synchronized DBHelper getDbHelper() {
db = dbHelper.getDatabase();//returns the already opened database object
while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads());
return dbHelper;
}
public synchronized void closeDb() {
if(null != dbHelper)
dbHelper.close();
if(null != db)
db.close();
}
@Override
protected void finalize() throws Throwable {
if(null != dbHelper)
dbHelper.close();
if(null != db)
db.close();
super.finalize();
}
public synchronized void setDbHelper(DBHelper dbHelper) {
if(null == this.dbHelper) {
this.dbHelper = dbHelper;
this.dbHelper.setDb(this.dbHelper.getWritableDatabase());//creates and sets the database object via getWritableDatabase()
}
}
}
最佳答案
如果您担心所有的数据库连接,请尝试将自己限制在一个 SqliteOpenHelper 上,并确保在其周围包裹一个同步层。
您可以扩展 application类然后调用getApplication并将您获得的对象转换到您的应用程序中。现在你可以在这个应用程序类中存储一个 SqliteOpenHelper 并构建你自己的线程安全访问数据库连接的方法。
如果您在所有 onCreate 方法中都使用 AsyncTask,并且您遇到大量选项卡的问题,这些问题也可能发生在较慢的设备、较快的用户或随着使用时间而变大的数据库上。
根据您应用的用例,您可以选择省事的方式,经历线程和锁定的所有努力和痛苦,或者您可以只发布带有多个从未产生错误的选项卡的应用,并确保捕获数据库异常并向自己发送通知(例如通过谷歌分析)以测试线程问题是否确实发生在应用程序的实际使用中。
关于android - 在创建与 SQLite 数据库交互的方法/Activity 时,我应该多注意线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3755900/
我正在尝试在Elasticsearch中返回的值中考虑地理位置的接近性。我希望近距离比某些字段(例如legal_name)重要,但比其他字段重要。 从文档看来,当前的方法是使用distance_fea
我是Elasticsearch的初学者,今天在进行“多与或”查询时遇到问题。 我有一个SQL查询,需要在Elastic中进行转换: WHERE host_id = 999 AND psh_pid =
智能指针应该/可以在函数中通过引用传递吗? 即: void foo(const std::weak_ptr& x) 最佳答案 当然你可以通过const&传递一个智能指针。 这样做也是有原因的: 如果接
我想执行与以下MYSQL查询等效的查询 SELECT http_user, http_req_method, dst dst_port count(*) as total FROM my_table
我用这两个查询进行测试 用must查询 { "size": 200, "from": 0, "query": { "bool": { "must": [ { "mat
我仍在研究 Pro Android 2 的简短服务示例(第 304 页)同样,服务示例由两个类组成:如下所示的 BackgroundService.java 和如下所示的 MainActivity.j
给定标记 like this : header really_wide_table..........................................
根据 shouldJS 上的文档网站我应该能够做到这一点: ''.should.be.empty(); ChaiJS网站没有使用 should 语法的示例,但它列出了 expect 并且上面的示例似乎
我在 Stack Overflow 上读到一些 C 函数是“过时的”或“应该避免”。你能给我一些这种功能的例子以及原因吗? 这些功能有哪些替代方案? 我们可以安全地使用它们 - 有什么好的做法吗? 最
在 C++11 中,可变参数模板允许使用任意数量的参数和省略号运算符 ... 调用函数。允许该可变参数函数对每个参数做一些事情,即使每个参数的事情不是一样的: template void dummy(
我在我从事的项目之一上将Shoulda与Test::Unit结合使用。我遇到的问题是我最近更改了此设置: class MyModel :update end 以前,我的(通过)测试看起来像这样: c
我该如何做 or使用 chai.should 进行测试? 例如就像是 total.should.equal(4).or.equal(5) 或者 total.should.equal.any(4,5)
如果您要将存储库 B 中的更改 merge 到存储库 A 中,是否应该 merge .hgtags 中的更改? 存储库 B 可能具有 A 中没有的标签 1.01、1.02、1.03。为什么要将这些 m
我正在尝试执行X AND(y OR z)的查询 我需要获得该代理为上市代理或卖方的所有已售属性(property)。 我只用 bool(boolean) 值就可以得到9324个结果。当我添加 bool
我要离开 this教程,尝试使用 Mocha、Supertest 和 Should.js 进行测试。 我有以下基本测试来通过 PUT 创建用户接受 header 中数据的端点。 describe('U
我正在尝试为 Web 应用程序编写一些 UI 测试,但有一些复杂的问题希望您能帮助我解决。 首先,该应用程序有两种模式。其中一种模式是“训练”,另一种是“现场”。在实时模式下,数据直接从我们的数据库中
我有一个规范: require 'spec_helper' # hmm... I need to include it here because if I include it inside desc
我正在尝试用这个测试我在 Rails 中的更新操作: context "on PUT to :update" do setup do @countdown = Factory(:count
我还没有找到合适的答案: onclick="..." 中是否应该转义 &(& 符号)? (或者就此而言,在每个 HTML 属性中?) 我已经尝试在 jsFiddle 和 W3C 的验证器上运行转义和非
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Main extends Applet i
我是一名优秀的程序员,十分优秀!