解决sqlite死锁示例异常database is locked

/*
 * sqlite的连接方式实际上为单连接方式,即使实用多线程也是用的一个连接
 * getWritableDatabase()和getReadableDatabase()都为synchronized方法,但不是static方法
 * 所以都只对同一个对象起同步作用,对于不同的对象没有任何作用
 * 所以使用sqlite的时候可以提供一个单一的入口,防止多对象修改数据库而造成死锁
 * 所以可以提供一个static的instance对象+它的get方法,
 * 连接可一直挂着,即使多次调用getWritableDatabase()和/或getReadableDatabase()方法也没关系,
 * 因为你只是在获得一个已有的连接而已
 * 数据库不用关闭,退出程序,系统会自动回收
 * 其实最主要就是synchronized关键字的作用范围的问题
 * 不过使用一个对象不知道会不会影响程序效率
 */
package test.service;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

	private static final String DB_NAME="boc.db";
	private static final int DATABASE_VERSION = 1;

	/*私有的静态对象,为整个应用程序提供一个sqlite操作的静态实例,并保证只能通过下面的静态方法getHelper(Context context)获得,
	 * 防止使用时绕过同步方法改变它*/
	private static DBHelper instance;//这里主要解决死锁问题,是static就能解决死锁问题
	/**
	 * 私有的构造函数,只能自己使用,防止绕过同步方法生成多个实例,
	 * @param context
	 */
	private DBHelper(Context context) {
		super(context, DB_NAME, null, DATABASE_VERSION);
	}
	/**
	 * 为应用程序提供一个单一的入口,保证应用程序使用同一个对象操作数据库,不会因为对象不同而使同步方法失效
	 * @param context 上下文
	 * @return  instance
	 */
	public static DBHelper getHelper(Context context){
		if(instance==null)
			instance=new DBHelper(context);
		return instance;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		//黄金名称表
		db.execSQL("CREATE TABLE IF NOT EXISTS goldName" +
                "(_id INTEGER PRIMARY KEY AUTOINCREMENT, G_Name VARCHAR unique)");
		//黄金当日历史信息表
		db.execSQL("CREATE TABLE IF NOT EXISTS goldInfo" +
				"(_id INTEGER PRIMARY KEY AUTOINCREMENT,GI_Tid INTEGER,GI_BidPrice DOUBLE, GI_OfferPrice DOUBLE,"+
				"GI_InsertTime time not null default current_time)");
		//黄金前次信息表
		db.execSQL("CREATE TABLE IF NOT EXISTS gold_lastInfo" +
				"(_id INTEGER PRIMARY KEY AUTOINCREMENT,GL_Name VARCHAR,GL_BidPrice DOUBLE, GL_OfferPrice DOUBLE)");
		//货币名称表
		db.execSQL("CREATE TABLE IF NOT EXISTS currencies" +
                "(_id INTEGER PRIMARY KEY AUTOINCREMENT, C_Name VARCHAR unique)");
		//外汇当日历史信息表
		db.execSQL("CREATE TABLE IF NOT EXISTS exchangeInfo" +
				"(_id INTEGER PRIMARY KEY AUTOINCREMENT,EI_Tid INTEGER,EI_Buying DOUBLE, EI_CashBuying DOUBLE,"+
				"EI_Selling DOUBLE,EI_CashSelling DOUBLE,EI_InsertTime time not null default current_time)");
		//外汇前次信息表
		db.execSQL("CREATE TABLE IF NOT EXISTS exchange_lastInfo" +
				"(_id INTEGER PRIMARY KEY AUTOINCREMENT,EL_Name VARCHAR,EL_Buying DOUBLE, EL_CashBuying DOUBLE,"+
				"EL_Selling DOUBLE,EL_CashSelling DOUBLE)");

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}

}

http://download.csdn.net/download/zhiaimm/4513636

时间: 2024-10-27 22:10:43

解决sqlite死锁示例异常database is locked的相关文章

sqlite3-移植SQLite3至MIPS不成功:调用sql语句总是产生database is locked

问题描述 移植SQLite3至MIPS不成功:调用sql语句总是产生database is locked 近期需将原本跑在ARM上面的程序移植到MIPS上,该程序调用到SQLite3的API.其中使用sqlite3_open及sqlite3_close是可以的,但是使用sqlite3_get_table和sqlite3_exec去执行sql语句(比如"select * from devices")却总会报"database is locked"的错误. 从网络得知该

android- SQLiteException: database is locked 异常

问题描述 SQLiteException: database is locked 异常 在我的content provider 中为什么会出现'SQLiteException: database is locked' 异常?我是在 Provider constructor 中调用的. mDb = SQLiteDatabase.openDatabase(path, null, 0); 03-17 19:44:43.912 6830 6830 E AndroidRuntime: FATAL EXCE

svn-Android Studio使用SVN更新代码时报database is locked要怎么解决

问题描述 Android Studio使用SVN更新代码时报database is locked要怎么解决 解决方案 svn: E200033: database is locked解决办法svn is already locked解决办法svn is already locked解决方案 解决方案二: 先clean up 试试看看

C#解决SQlite并发异常问题的方法(使用读写锁)_C#教程

本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题. SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写.Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用.但在C#中未提供类似功能. 作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标. using System; usin

使用FMDB多线程访问数据库,及database is locked的问题

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizing or resetting statement (5: database is locked) 最后通过FMDatabaseQueue解决了这个问题,本文总结一下: FMDatabase不能多线程使用同一个实例 多线程访问数据库,不能使用同一个FMDatabase的实例,否则会发生异常.如果线程

c++-sqlite3 database is locked问题

问题描述 sqlite3 database is locked问题 sqlite3的c++ API接口使用好好的,就是重复调用sqlite3_prepare()会出现死锁问题,我自己写了个操作sqlite的类,叫Datebase.其他函数都好,但是只要第二次调用下面这个函数中的代码就会出现database is locked的错误. 解决方案 参考:http://www.cnblogs.com/Bonker/p/3445240.html 解决方案二: 这个问题看着比较简单,就是数据库被锁住了,那

php解决约瑟夫环示例

 这篇文章主要介绍了php解决约瑟夫环示例,需要的朋友可以参考下 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".)   猴子一群,都带着号码的,站好了一圈,数到m的枪毙,剩下的接着数.如此往复,死剩下的一个就疯了    代码如下: <?php function killMonkeys($monkeys, $m){     $k = $m;     while (count($monkey

service-如何解决 android 中的异常问题?

问题描述 如何解决 android 中的异常问题? 在Android程序中,我创建了HttpDelete方法来调用REST web服务. public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView txt = (TextView) findViewById(R.id.textView1); txt.setT

解决Response.Redirect ThreadAbortException异常注意事项

关于ASP.NET 解决Response.Redirect ThreadAbortException异常注意事项 2012-07-12 18:44 by kaleyroy, 21 阅读, 0 评论, 收藏, 编辑   大家知道ASP.NET中Response.Redirect()是用来跳转页面的.关于这个不用过多解释. 当在try catch 块中使用的时候会引发ThreadAbortException异常,这个网上很多都说了解决方案,下面我引用MS官方建议的解决方案. For Response