一、数据库操作
package com.ping.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
/**
* @describe <数据库操作>
*/
public class SQLiteTool extends SQLiteOpenHelper {
private static final String DB_NAME = "medicalscience.db"; // 数据库文件名
private static final int VERSION = 1;// 数据库版本 public static SQLiteTool newInstance(Context context) {
return new SQLiteTool(context, DB_NAME, null, VERSION);
}
private SQLiteTool(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DBTCollect.createTableSQL());//有需要创建表时,可以在这添加
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//当数据库版本变大时调用
onCreate(db);
}
} 二、数据库管理类
package com.ping.db;
import java.util.concurrent.atomic.AtomicInteger;
import android.annotation.SuppressLint;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import com.ping.MyApplication;
/**
* @describe <数据库管理类>
*/
public class DBManager {
private AtomicInteger dbOpenCount = new AtomicInteger();//计数器
private static DBManager instance;
private static SQLiteTool sqlLiteTool;
private SQLiteDatabase database;
public static synchronized DBManager getInstance() {
if (instance == null) {
synchronized (DBManager.class) {
if (instance == null) {
instance = new DBManager();
}
}
}
return instance;
}
private DBManager() {
sqlLiteTool = SQLiteTool.newInstance(MyApplication.getInstance().getApplicationContext());
}
@SuppressLint("NewApi")
public synchronized SQLiteDatabase openDatabase() {
if (dbOpenCount.incrementAndGet() == 1) {
database = sqlLiteTool.getWritableDatabase();
if (Build.VERSION.SDK_INT >= 11) {
database.enableWriteAheadLogging();// 允许读写同时进行
}
}
return database;
}
public synchronized void closeDatabase() {
if (dbOpenCount.decrementAndGet() == 0) {
database.close();
database = null;
}
}
} 三、数据增删改查
package com.ping.db;
import java.util.ArrayList;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* @describe <数据库操作--收藏表的操作 >
*/
public class DBTCollect {
public static final String TNAME = "Tcollect";
// 创建表的语句
public static String createTableSQL() {
return "CREATE TABLE IF NOT EXISTS " + TNAME + " (kid INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT, title TEXT)";
}
// 删除表的语句
public static String deleteTabelSQL() {
return "DROP TABLE IF EXISTS " + TNAME;
}
//查询数据是否存在
public static boolean isCollected(String id) {
boolean isCollected = false;
SQLiteDatabase db = DBManager.getInstance().openDatabase();//获得SQLiteDatabase对象
String sql = "select * from " + TNAME + " where id = '" + id + "'";
Cursor cursor = db.rawQuery(sql, null);
if (cursor.getCount() > 0) {
isCollected = true;
}
cursor.close();
DBManager.getInstance().closeDatabase();//关闭
return isCollected;
} // 删除数据
public static void deleteCollect(String mid) {
SQLiteDatabase db = DBManager.getInstance().openDatabase();
db.delete(TNAME, "id = ?", new String[] { id });
DBManager.getInstance().closeDatabase();
} //增加数据
public static void addCollect(Object obj) {
SQLiteDatabase db = DBManager.getInstance().openDatabase();
ContentValues cv = new ContentValues();
cv.put("id", obj.id);
cv.put("title", obj.title);
db.insert(TNAME, null, cv);
DBManager.getInstance().closeDatabase();
}
//查询数据
public static ArrayList<Object> getAllCollect() {
SQLiteDatabase db = DBManager.getInstance().openDatabase();
Cursor cursor = db.query(TNAME, null, null, null, null, null, null);
ArrayList<Object> objs = new ArrayList<Object>();
while (cursor.moveToNext()) {
Object obj = new Object();
obj.id = cursor.getString(cursor.getColumnIndex("id"));
obj.title = cursor.getString(cursor.getColumnIndex("title"));
objs.add(obj);
}
cursor.close();
DBManager.getInstance().closeDatabase();
return objs;
}
}

Android项目中单实例数据库类,解决database is locked的更多相关文章

  1. XamarinSQLite教程在Xamarin.Android项目中提取数据库文件

    XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...

  2. XamarinSQLite教程在Xamarin.Android项目中定位数据库文件

    XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocumen ...

  3. XamarinSQLite教程在Xamarin.Android项目中使用数据库

    XamarinSQLite教程在Xamarin.Android项目中使用数据库 在Xamarin.Android项目中使用预设数据库的具体操作步骤如下: (1)创建一个Xamarin.Android项 ...

  4. Android多线程操作sqlite(Sqlite解决database locked问题)

    参考http://blog.csdn.net/sdsxleon/article/details/18259973  很好 https://github.com/2point0/Android-Data ...

  5. 用gradle管理android项目出现的问题以及解决方法

    1.项目结构 最好是全部在root 项目配置 一个settings.gradle 一个build.gradle 2.多项目依赖 http://www.gradle.org/docs/current/u ...

  6. Android多线程操作sqlite(Sqlite解决database locked问题)(2)使用事务处理的效果

    问题场景描述: 在页面中用到了ViewPager控件,ViewPager中的内容分别是两个ListView,两个ListView的数据都来自本地数据库(先从网络下载数据,然后更新本地数据库),在实际的 ...

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

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizi ...

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

    今天最终攻克了多线程同一时候訪问数据库时,报数据库锁定的问题.错误信息是: Unknown error finalizing or resetting statement (5: database i ...

  9. <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机

    准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ...

随机推荐

  1. ruby 学习 -- string --1

    # define french_string = "il \xc3\xa9tait une fois" long_string = <<EOF Here is a lo ...

  2. ios开发--tcp/ip

    简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久!你能耐心看完吗?) 我在这个文章中,列举了常见的TCP/IP族中的协议,今天主角 ...

  3. iOS开发--验证码

    第一步,拖两个空间textfiled和button到storyboard上的viewcontroller上. 第二步,拖线,链接到.h文件中代码如下: 1 @property (weak, nonat ...

  4. Ibm-jQuery教程学习笔记

    一.概述 1.虽然 jQuery 本身并非一门新的语言.但是,学习其语法有助于我们熟练.灵活地使用它.回顾下我们熟悉的 CSS 语法,不难发现 jQuery 的语法与 CSS 有相似之处. jQuer ...

  5. Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑

    一.概述 1.目标:动态代理的代理逻辑可以任意修改 2.思路: (1)要把代理逻辑抽离,站在jvm的角度思考,应独立出InvocationHandler接口,并接收被代理的对象及方法作为参数invok ...

  6. Delphi操作XML的几个博客

    http://www.cnblogs.com/acuier  整整十几篇,省得我自己研究,学一下就可以了. http://www.cnblogs.com/del/category/113561.htm ...

  7. HighCharts开发说明及属性详解

    一.HighCharts开发说明: HighCharts 开发实际上配置HighCharts每个部分,比如配置标题(title),副标题(subtitle)等,其中每个部分又有更细的参数配置,比如标题 ...

  8. beej's 网络编程 打包数据pack data

    7.4. Serialization—How to Pack Data It's easy enough to send text data across the network, you're fi ...

  9. 笔记一、Git服务器【转】

    传输协议: 本地传输,SSH协议,Git协议,HTTP协议   git clone /home/git/project.git                      // 本地clone git ...

  10. 压缩工具类 - ZipUtils.java

    压缩工具类,提供压缩文件.解压文件的方法. 源码如下:(点击下载 - ZipUtils.java .FolderUtils.java.ant-1.7.0.jar.commons-io-2.4.jar. ...