一、数据库操作
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. JavaWeb项目开发案例精粹-第6章报价管理系统-04Service层

    1. package com.sanqing.service; import com.sanqing.dao.DAO; import com.sanqing.po.Customer; /** * 客户 ...

  2. MyBatis学习总结_16_Mybatis使用的几个建议

    1.Mapper层参数为Map,由Service层负责重载. Mapper由于机制的问题,不能重载,参数一般设置成Map,但这样会使参数变得模糊,如果想要使代码变得清晰,可以通过service层来实现 ...

  3. jquery ajax json简单的分页,模拟数据,没有封装,只显示原理

    简单的分页,模拟数据,没有封装,显示原理,大家有兴趣可以自己封装,这里只是个原理过程,真正的分页也差不多是这个原理,只是请求数据不太一样,html部分: <!TOCTYPE HTML> & ...

  4. OkHttp使用进阶(译自OkHttp官方教程)

    没有使用过OkHttp的,可以先看OkHttp使用介绍 英文版原版地址 Recipes · square/okhttp Wiki 同步get 下载一个文件,打印他的响应头,以string形式打印响应体 ...

  5. jdbc框架 commons-dbutils+google guice+servlet 实现一个例子

    最近闲着无聊,于是看了一下jdbc框架 commons-dbutils与注入google guice. 我就简单的封装了一下代码,效率还是可以的.... jdbc+google guice+servl ...

  6. git的使用--不错的博客【转】

    转自:http://www.cnblogs.com/wang_yb/p/3867221.html GIT 的常规操作 常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中 git ...

  7. SQLServer2008 行转列2

    with a as ( select numb,name,row_number() over( partition by numb order by name desc) rowid from fen ...

  8. pythonweb自动化测试

    from selenium import webdriverimport time def capture(url, save_fn="capture.png"): browser ...

  9. leetcode:Rotate Array

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  10. CMS 垃圾回收日志

    CMS 垃圾回收日志 https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs http://www.blogjava.net/D ...