2011-12-14 89 views
1

我正在为我的android应用程序使用SOA架构。我在后台连续运行一项服务(每隔1分钟),从我的MYSQL数据库中提取数据并将其与我的SQLite数据库(如果在2个数据库中有任何更改)进行同步。SQlite:数据库被锁定错误

现在,当服务在后台运行时,它会打开SQLite。同时,如果我正在处理(使用)应用程序,它也会尝试打开Sqlite来获取数据。在这种情况下,我得到一个错误,称为:数据库锁定在android.database.SQLiteOpenHelper.getReadableDatabase。

任何人都可以请建议我在这种情况下可以做些什么?

+0

根据你的建议,我已经用这种方式创建了DatabaseHelper(它是包装类)的单个实例: private static DatabaseHelper instance; public static synchronized DatabaseHelper getHelper(Context context) if(instance == null) instance = new DatabaseHelper(context); return instance; } 现在,每当我需要使用DatabaseHelper的方法我称他们为follws: \t \t DatabaseHelper分贝= DatabaseHelper.getHelper(本); \t BaseObject bObj = db.GetObjectFromDB(“GlobalObject1”); – Neha

+0

现在这个GetObjectFromDB是一个来自DatabaseHelper的方法。这个方法从Sqlite数据库读取数据。为此,我需要访问数据库,并以此方式执行此操作: \t SQLiteDatabase db = this.getReadableDatabase(); 如前所述,我的应用程序运行很多线程。当我的一个线程访问数据库时,另一个线程也尝试使用相同的方法GetObjectFromDB访问数据库。 我的问题是,getReadableDatabase()总是打开一个新的数据库连接。我怎样才能克服这个问题。 谢谢,Neha – Neha

+0

大家好,我得到了我的问题的答案。我做了一个DataBasehelper(它是一个包装类)的静态实例和SQLiteDatabase的静态实例:private static DatabaseHelper instance; private static SQLiteDatabase sqlitedb = null; public synchronized SQLiteDatabase getHelper() if(sqlitedb == null) sqlitedb = this.getWritableDatabase();如果(sqlitedb == null) sqlitedb = this.getWritableDatabase(); } else if(sqlitedb.isOpen()== false) sqlitedb = this.getWritableDatabase(); } return sqlitedb; }现在我按如下方式调用数据库:SQLiteDatabase db = this.getHelper(); – Neha

回答

1

您需要共享应用程序和后台服务之间的单个数据库连接。这将正确地序列化对数据库的所有访问。

+0

非常感谢:) – Neha

0

SQlite是一个基于文件的数据库,一次只允许访问一个应用程序。

  1. 你必须要么使用你的应用程序同步服务,让 的服务让一些时间的应用程序来获取新的数据(有 在这其中许多解决方案;寻找信号量,监视器和循环赛)。

  2. 你使用第二个服务,将获得I/O的数据库请求从 服务和应用,排队它们,执行请求的I/O和 返回任何结果提交的应用程序或服务请求。

2

我更喜欢你在这里使用ContentProvider

即使其主要目的是在应用程序之间共享,它可以在我们的单个应用程序内使用。

如果我们使用内容提供者,不用担心db的关闭和锁定问题。

参考Simple Content Provider for db operations

0

这是不正确的,SQLite的3对多个连接的支持,并且可能让他们同时打开。只要确保在更新线程中使用事务并尽快关闭它即可。

阅读有关这http://www.sqlite.org/lockingv3.html

是你使用python,你可以如当连接到数据库时,设置timeout参数,这将确保读者线程在放弃之前等待超时秒。因此,使更新程序尽可能紧凑是非常重要的,这样读者就不会超时。

http://docs.python.org/library/sqlite3.html

而且,我深深的,如果你想了解更多reccomend下面的书籍。SQLite权威指南:http://www.apress.com/9781590596739