你的位置:首页 > 软件开发 > 操作系统 > android Sqlite多线程访问异常解决方案

android Sqlite多线程访问异常解决方案

发布时间:2015-05-27 00:00:49
在开发Android的程序的时候sqlite数据库是经常用到的;在多线程访问数据库的时候会出现这样的异常:java.lang.IllegalStateException: Cannot perform this operation because the connection p ...

     在开发Android的程序的时候sqlite数据库是经常用到的;在多线程访问数据库的时候会出现这样的异常:java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.或 java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: 或java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase:

这样的异常信息,Sqlite 自身是不支持多线程同时操作的,下面呢我们给出一个解决方案并列出一些项目中用到的代码。

     我们会用到AtomicInteger,一个提供原子操作的Integer的类。因为Android 依托强大的jdk在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口,由此我们可以做一个DatabaseManager 这样的类,具体代码见下面的代码块:

 

public class DatabaseManager {    private AtomicInteger mOpenCounter = new AtomicInteger();  private static DatabaseManager instance;   private static SQLiteOpenHelper mDatabaseHelper;   private SQLiteDatabase mDatabase;      public static synchronized void initializeInstance(SQLiteOpenHelper helper) {     if (instance == null) {       instance = new DatabaseManager();       mDatabaseHelper = helper;     }   }     public static synchronized DatabaseManager getInstance(SQLiteOpenHelper helper) {     if (instance == null) {       initializeInstance(helper);    }     return instance;   }     public synchronized SQLiteDatabase getWritableDatabase() {     if(mOpenCounter.incrementAndGet() == 1) {       // Opening new database       mDatabase = mDatabaseHelper.getWritableDatabase();     }     return mDatabase;   }     public synchronized SQLiteDatabase getReadableDatabase() {     if(mOpenCounter.incrementAndGet() == 1) {       // Opening new database       mDatabase = mDatabaseHelper.getReadableDatabase();     }     return mDatabase;   }     public synchronized void closeDatabase() {         if(mOpenCounter.decrementAndGet() == 0) {       // Closing database       mDatabase.close();     }   }
用方式呢,在我们操作数据库逻辑代码中如下使用

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:android Sqlite多线程访问异常解决方案

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录