zoukankan      html  css  js  c++  java
  • 单例模式(Singleton)在SQLite操作中的应用

    单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说,只有一个实例是很重要的,比如最近我的一个Android项目中用到一个数据库管理类来封装SQLite读写操作。我们知道,SQLite对多线程支持并不是很好,如果两个线程同时操作数据库,会报 "Database is locked" 的错误。我想到的解决办法有两个:一是运用同步机制,比如在一个线程类中对数据库操作的部分加入 synchronized 关键字,这样就可以确保该线程类的多个实例操作数据库时不会发生冲突,但是如果两个不同的线程类的实例在同一时刻操作数据库时,用 synchronized 关键字就不处理不了了。发现 SQLiteDatabase 类中有一个 isDbLockedByOtherThreads() 方法,用来判断一个数据库对象是否被其他线程锁定。由于我每次操作数据库,都new一个SQLiteOpenHelper的实例,所以用 isDbLockedByOtherThreads() 方法的结果总是false。所以想到了第二种解决办法,也就是在数据库管理类中运用单例模式,这样就保证了无论在哪个线程中获取数据库对象,都是同一个对象,那么就可在一个线程中用 isDbLockedByOtherThreads() 方法判断数据库是否被其他线程锁定,如果是,则sleep等待,直至锁被释放。

           以下Classroomdb 类正是运用了单例模式:

    Java代码  收藏代码
    1. public class Classroomdb extends SQLiteOpenHelper  {  
    2.   
    3.     private static final String DATABASE_NAME = "classroom.db";  
    4.     private static final int DATABASE_VERSION = 1;  
    5.     private static final String TABLE_NAME ="classroom_info";  
    6.   
    7.     private static Classroomdb instance;  
    8.       
    9.     public Classroomdb(Context context) {  
    10.         super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    11.     }  
    12.       
    13.     public static Classroomdb Instance(Context context) {  
    14.         if (instance == null) {  
    15.             instance = new Classroomdb(context);  
    16.         }   
    17.         return instance;  
    18.     }  
    19.   
    20.     @Override//创建表  
    21.     public void onCreate(SQLiteDatabase db) {  
    22.         String sql = "CREATE TABLE " + TABLE_NAME   
    23.         + " (classroom_num, building, morning1, morning2, afternoon1, afternoon2, night1);";  
    24.         Log.i("createDB=", sql);  
    25.         db.execSQL(sql);  
    26. //      db.close();   
    27.     }  
    28.   
    29.     @Override  
    30.     public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {  
    31.         // TODO Auto-generated method stub  
    32.           
    33.     }  
    34.       
    35.     /* 
    36.      * 操作一 
    37.      */  
    38.     public void update(String[] classroom_num, String[] morning1, String[] morning2,   
    39.             String[] afternoon1, String[] afternoon2, String[] night1){  
    40.         // ......  
    41.     }  
    42.   
    43.     /* 
    44.      * 操作二 
    45.      */  
    46.     public String[] readData(String time, String build) {  
    47.         // ......  
    48.     }  
    49.       
    50.     /* 
    51.      * 操作三 
    52.      */  
    53.     public String[] getSingleClassroom(String roomNum) {  
    54.         // ......  
    55.     }  
    56.   
    57. }  

          在线程中就可如下来处理:

    Java代码  收藏代码
    1. Classroomdb db = Classroomdb.Instance(context);  
    2.         while (db.getWritableDatabase().isDbLockedByOtherThreads()) {  
    3.             Log.w("dblock""db is locked by other threads!");  
    4.             try {  
    5.                 Thread.sleep(10);  
    6.             } catch (InterruptedException e) {  
    7.                 e.printStackTrace();  
    8.             }  
    9.         }  
  • 相关阅读:
    Confluence 6 恢复一个站点
    Confluence 6 重新获得站点备份文件
    Confluence 6 创建站点的导出文件
    Confluence 6 手动备份站点
    Confluence 6 用户提交的备份和恢复脚本
    Confluence 6 配置手动备份
    Confluence 6 配置自动备份
    Confluence 6 其他需要备份和恢复的地方
    MySQL多线程备份工具mydumper
    创意、实现和合作:一次原创H5的尝试
  • 原文地址:https://www.cnblogs.com/zgz345/p/2567894.html
Copyright © 2011-2022 走看看