`
superonion
  • 浏览: 128166 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

单例模式(Singleton)在SQLite操作中的应用

阅读更多

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

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

 

public class Classroomdb extends SQLiteOpenHelper  {

	private static final String DATABASE_NAME = "classroom.db";
	private static final int DATABASE_VERSION = 1;
	private static final String TABLE_NAME ="classroom_info";

	private static Classroomdb instance;
	
	private Classroomdb(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}
	
	public static Classroomdb Instance(Context context) {
		if (instance == null) {
			instance = new Classroomdb(context);
		} 
		return instance;
	}

	@Override//创建表
	public void onCreate(SQLiteDatabase db) {
		String sql = "CREATE TABLE " + TABLE_NAME 
		+ " (classroom_num, building, morning1, morning2, afternoon1, afternoon2, night1);";
		Log.i("createDB=", sql);
		db.execSQL(sql);
//		db.close(); 
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub
		
	}
	
	/*
	 * 操作一
	 */
	public void update(String[] classroom_num, String[] morning1, String[] morning2, 
			String[] afternoon1, String[] afternoon2, String[] night1){
		// ......
	}

	/*
	 * 操作二
	 */
	public String[] readData(String time, String build) {
		// ......
	}
	
	/*
	 * 操作三
	 */
	public String[] getSingleClassroom(String roomNum) {
		// ......
	}

}

 

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

 

Classroomdb db = Classroomdb.Instance(context);
		while (db.getWritableDatabase().isDbLockedByOtherThreads()) {
			Log.w("dblock", "db is locked by other threads!");
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} 

 

 

3
1
分享到:
评论
5 楼 至尊包 2014-05-08  
Instance方法上应该加上同步锁 方法名小写
4 楼 wangshiming88 2012-08-22  
  构造方法还没有私有化!!!!!
3 楼 p01197 2012-05-10  
谢谢!明白了
2 楼 superonion 2012-05-10  
p01197 写道
这样的话,访问这个类可以保证只有一个线程操作数据库玛?

用isDbLockedByOtherThreads() 方法可以判断数据库是否被其他线程锁定,如果是,则sleep等待,直至锁被释放后该线程才可操作数据库。这样的话,的确可以保证同一时间只有一个线程在操作数据库。
1 楼 p01197 2012-05-10  
这样的话,访问这个类可以保证只有一个线程操作数据库玛?

相关推荐

    IOS应用源码Demo-单例模式-毕设学习.zip

    在iOS应用开发中,单例模式是一种常用的编程设计模式,它确保了类只有一个实例,并提供一个全局访问...同时,对于撰写相关的论文,也可以深入探讨单例模式在iOS应用中的优缺点、适用场景以及可能遇到的问题和解决方案。

    IOS 单例设计模式实例Demo

    本示例Demo将深入探讨如何在iOS应用中实现单例。 首先,了解单例的基本概念。单例模式的核心是限制类的实例化过程,只允许创建一个对象,防止无控制的实例化导致资源浪费或状态冲突。在Objective-C中,我们通常通过...

    ios-简易了解GCD的单例模式.zip

    在"Demo5_GCD的Singleton"这个示例中,我们可以学习如何使用GCD来实现单例模式。首先,定义一个单例类,然后在类方法中使用`dispatch_once`来确保单例的线程安全。接着,可以在单例类中加入网络请求、数据存储等相关...

    Java设计模式之单例模式实例分析

    单例模式是软件设计模式中的一种基础模式,它在Java编程中被广泛使用。这个模式的主要目的是控制类的实例化过程,确保一个...然而,过度使用单例可能导致紧耦合,使得测试和扩展变得困难,因此在实际应用中应谨慎使用。

    32省市自治区直辖市(单例+数据库)

    标题 "32省市自治区直辖市(单例+数据库)" 暗示了这是一个与中国的行政区域划分相关的数据资源,...使用这个资源时,开发人员需要了解单例模式的应用、数据库的管理和操作,以及如何在Web应用中有效地整合这些数据。

    iOS 简单豆瓣源代码

    这个项目旨在帮助开发者了解和实践iOS开发,特别是对于那些想要学习如何在iOS应用中实现用户登录、注册、收藏等功能的初学者来说,是一个非常有价值的资源。 首先,项目中运用了单例(Singleton)设计模式。单例...

    Android应用框架原理与程序设计.zip

    理解并应用设计模式能提高代码质量和可维护性,如单例模式(Singleton)、观察者模式(Observer)、适配器模式(Adapter)和工厂模式(Factory)等。 四、Android权限管理 Android系统对敏感操作实行严格的权限控制...

    Android应用源码之高仿生日管家.zip

    单例模式(Singleton Pattern)可能用于管理全局资源,如NotificationManager实例。 最后,考虑到用户体验,应用可能使用了Material Design指南来创建符合Google设计规范的界面,包括色彩、图标、过渡动画等,提升...

    基于Java的通讯录手机版源码.zip

    在设计模式上,此通讯录应用可能运用了单例模式(Singleton)来保证全局只有一个联系人列表实例,工厂模式(Factory)用于创建联系人对象,以及观察者模式(Observer)实现数据变化时界面的实时更新。此外,MVC...

    iOS 开发面试问题.zip

    - 什么是单例(Singleton)模式,何时使用它? - 你能举一个适配器(Adapter)模式在iOS开发中的例子吗? - 什么是代理(Delegate)模式,以及它在处理事件和通信中的作用? **3. 数据管理** - CoreData和SQLite的...

    C# 备忘录(源码)——烽火系列

    8. **设计模式**:虽然这是一个简单的项目,但可能也涉及到一些基础的设计模式,比如单例模式(Singleton)用于控制备忘录对象的唯一性,或者工厂模式(Factory)来创建不同类型的备忘项。 通过这个项目,初学者...

    Android应用源码之gumingbang_Android.zip

    2. Singleton:全局单例模式,常用于网络请求、数据库访问等需要全局唯一实例的场景。 3. Factory/Builder:对象创建型模式,简化复杂对象的创建过程。 4. Observer:观察者模式,用于实时更新视图或者监听事件。 5....

    DesignPatterns:带有设计模式示例的Android应用程序

    首先,我们要讨论的是单例模式(Singleton),这是Java中最常用的设计模式之一。单例模式确保一个类只有一个实例,并提供一个全局访问点。在Android中,单例常用于管理应用程序范围内的资源,如网络连接或数据库连接...

    Exa8-相册管理器(c#)

    8. **设计模式**:Exa8-相册管理器在开发过程中可能会应用多种设计模式,如单例模式(Singleton)用于管理数据库连接,工厂模式(Factory)用于创建UI控件,观察者模式(Observer)用于实时更新视图等。 9. **软件...

    列车查询系统

    在代码结构上,遵循良好的编程实践是很重要的,例如,使用面向对象的设计模式,如单例模式(Singleton)来管理数据库连接,或者工厂模式(Factory)来创建UI控件。同时,代码应该具有可读性和可维护性,通过合理的...

    Android:样例应用程序说明了如何将Room View与sqlite一起使用

    SQLite是一个轻量级的数据库系统,被广泛用于存储和管理Android应用中的数据。Android Room是谷歌推荐的数据访问对象(DAO)层,它为SQLite数据库提供了更高级别的抽象。Room库简化了数据库操作,使得开发者能够更加...

    iOS面试宝典

    15. 设计模式:除了MVC之外,掌握常用的iOS设计模式如代理(Delegates)、观察者(Observer)、单例(Singleton)等对于设计高质量的iOS应用非常重要。 16. 网络请求和JSON处理:在网络编程方面,能够熟练使用...

    Eclipse编写的Android全局变量应用实例

    在Android应用中,全局变量通常用于存储用户设置、状态信息或其他需要在整个应用生命周期内保持不变的数据。 在Eclipse中创建Android项目: 1. 打开Eclipse,选择"File" -> "New" -> "Android Project",输入项目...

    C++课程设计小项目:简易C++图书管理系统qt5.15工程源码,供课程设计,C++编程学习,项目设计学习使用。

    7. **设计模式**:在项目设计中,可能会运用到单例模式(Singleton)来管理数据库连接,工厂模式(Factory)用于创建不同类型的对象,或者观察者模式(Observer)来实现实时的数据更新。 8. **用户界面设计**:通过...

    各个大厂--iOS开发精品面试题 题集大全.zip

    设计模式是面试中的常考项,如单例(Singleton)、工厂模式(Factory)、观察者(Observer)、代理模式(Delegate)和MVVM(Model-View-ViewModel)架构。理解并能灵活运用这些模式对解决实际问题至关重要。 最后,...

Global site tag (gtag.js) - Google Analytics