Android_数据库_异步操作封装

/**
 * A particular {@link AsyncQueryHandler} allowing clients to be notified via a
 * listener. The {@link NotifyingAsyncQueryHandler} also make sure no strong
 * reference is kept on the given listener (as it is often a Context).
 *
 */
public class DBAsyncHandler extends AsyncQueryHandler {

	private WeakReference<DBAsyncListener> mListener;

	/**
	 * Client may use this to listen to completed query operations. run on UI
	 * Thread
	 */
	public static class DBAsyncListener {
		public DBAsyncListener() {
		}

		/**
		 * run on UI Thread <br />
		 * <b>cursor close() method needn't be called</b>
		 */
		protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
		}

		protected void onInsertComplete(int token, Object cookie, Uri uri) {
		}

		protected void onUpdateComplete(int token, Object cookie, int result) {
		}

		protected void onDeleteComplete(int token, Object cookie, int result) {
		}
	}

	/**instance in UI Thread*/
	public DBAsyncHandler(ContentResolver resolver, DBAsyncListener listener) {
		super(resolver);
		setDBListener(listener);
	}

	/**
	 * Assign the given {@link DBAsyncListener}.
	 */
	public void setDBListener(DBAsyncListener listener) {
		mListener = (listener != null) ? new WeakReference<DBAsyncListener>(listener) : null;
	}

	private DBAsyncListener getDBListener() {
		return (mListener == null) ? null : mListener.get();
	}

	/** such as Activity-onDestory(), this method is called */
	public void clearDBListener() {
		mListener = null;
	}

	public void startQuery(int token, Object cookie, Uri uri, String[] projection, String selection, String[] selectionArgs, String orderBy) {
		super.startQuery(token, cookie, uri, projection, selection, selectionArgs, orderBy);
	}

	@Override
	protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
		DBAsyncListener listener = getDBListener();
		if (listener != null) {
			listener.onQueryComplete(token, cookie, cursor);
			if (cursor != null && !cursor.isClosed())
				cursor.close();
		} else if (cursor != null) {
			cursor.close();
		}
	}

	@Override
	protected void onDeleteComplete(int token, Object cookie, int result) {
		DBAsyncListener listener = getDBListener();
		if (listener != null) {
			listener.onDeleteComplete(token, cookie, result);
		}
	}

	@Override
	protected void onInsertComplete(int token, Object cookie, Uri uri) {
		DBAsyncListener listener = getDBListener();
		if (listener != null) {
			listener.onInsertComplete(token, cookie, uri);
		}
	}

	@Override
	protected void onUpdateComplete(int token, Object cookie, int result) {
		DBAsyncListener listener = getDBListener();
		if (listener != null) {
			listener.onUpdateComplete(token, cookie, result);
		}
	}
}
public class MyProvider extends ContentProvider {
	private final static String TAG = MyProvider.class.getSimpleName();

	private final static int Person = 1;

	public final static String BASE = "com.baidu.my.provider";
	public final static Uri URI_Person = Uri.parse("content://com.baidu.my.provider/Person");

	private final static UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); // 如果都匹配不成功,则返回构造函数中指定的参数值,默认为-1
	private SQLiteDatabase db;
	static {
		MATCHER.addURI(BASE, "Person", Person);
	}

	@Override
	public boolean onCreate() {
		MyDBHelper dbHelper = new MyDBHelper(this.getContext());
		db = dbHelper.getWritableDatabase();
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		Cursor c = null;
		switch (MATCHER.match(uri)) {
		case Person:
			c = db.query(DBPerson.TableName, projection, selection, selectionArgs, null, null, sortOrder);
			c.setNotificationUri(getContext().getContentResolver(), URI_Person);
			break;
		default:
			break;
		}
		return c;
	}

	@Override
	public String getType(Uri uri) {
		switch (MATCHER.match(uri)) {
		case Person:
			return "vnd.android.cursor.dir/vnd." + BASE + ".request";
		default:
			break;
		}
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		long id = 0;
		switch (MATCHER.match(uri)) {
		case Person:
			id = db.insert(DBPerson.TableName, null, values);
			if (id > 0) {
				// 数据发生改变,发出通知
				getContext().getContentResolver().notifyChange(URI_Person, null);
			}
			return ContentUris.withAppendedId(uri, id);
		}
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}
}
public class MyDBHelper extends SQLiteOpenHelper {
	private static final String TAG = "DBHelper";

	private static final String DB_NAME = "my.db";

	private static final int DB_VERSION = /**/ 57 /**/;/****谨慎修改,否则将导致用户历史数据被删除****/

	public MyDBHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(getRequestCreateStr());
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS " + DBPerson.TableName);
		onCreate(db);
	}

	private String getRequestCreateStr() {
		StringBuffer sb = new StringBuffer();
		sb.append("CREATE TABLE ").append(DBPerson.TableName);
		sb.append(" (");
		sb.append(BaseColumns._ID).append(" INTEGER PRIMARY KEY,");
		sb.append(DBPerson.MetaDate.Name).append(" TEXT,");
		sb.append(DBPerson.MetaDate.Age).append(" TEXT)");

		return sb.toString();
	}

}
public interface DBPerson extends BaseDB{
	public interface MetaDate {
		String Name = "Name";
		String Age = "Age";
	}

	public String TableName = "Person";

	public String[] PROJECTION = {
			MetaDate.Name, MetaDate.Age
	};

	public String SORT_ORDER = MetaDate.Age + " ASC";
}
public class MainActivity extends Activity {
	private DBAsyncHandler dbAsyncHandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//
		dbAsyncHandler = new DBAsyncHandler(getContentResolver(), dbListener);
	}

	private DBAsyncHandler.DBAsyncListener dbListener = new DBAsyncListener() {
		protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
			Toast.makeText(getApplicationContext(), "ok = " + cursor.getCount(), 1).show();
		}
		protected void onInsertComplete(int token, Object cookie, android.net.Uri uri) {
			Toast.makeText(getApplicationContext(), "插入ok!", 1).show();
		}
	};
	public void query(View view) {
		//query
		dbAsyncHandler.startQuery(100, null, MyProvider.URI_Person, DBPerson.PROJECTION, null, null, DBPerson.SORT_ORDER);
	}

	public void insert(View view) {
		//insert
		ContentValues initialValues = new ContentValues();
		initialValues.put(DBPerson.MetaDate.Name, "baidu");
		initialValues.put(DBPerson.MetaDate.Age, System.currentTimeMillis());
		dbAsyncHandler.startInsert(100, null, MyProvider.URI_Person, initialValues);
	}
	@Override
	protected void onDestroy() {
		//clear
		dbAsyncHandler.clearDBListener();
		super.onDestroy();
	}
}

源码下载》》

时间: 2024-10-02 07:32:05

Android_数据库_异步操作封装的相关文章

C# .NET更智能的数据库操作的封装

前述: 对数据库操作的封装,相信网络上已经有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持数据库操作.这篇文章是分享自己所思考的,对数据库操作的简单封装.我对于这篇文章,认为被浏览者所关注重点的是怎么分析设计数据库操作封装,代码是其次.而且,这是我第一篇文章,为了想好怎么实现花了些天,代码是博客发表时现写的.所以我想,使用可能还有bug,而且没有try catch异常的设计. 这个框架我理应做到对数据库无关,无论是哪个数据库都能够使用.不过,重点在于分析,而不是代码.所以,为了更好的

PHP中对数据库操作的封装

在动态网面设计中很多都要涉及到对数据库的操作,但是有时跟据需要而改用其它后台数据库,就需要大量修改程序.这是一件枯燥.费时而且容易出错的功作.其实我们可以用PHP中的类来实现对数据库操作的封装,从而使写出的程序在很小的改动下就可以完成后台数据库的更改. <? class dbInterface{ var $dbID=1; //用于确定当前操作的数据库,当dbID为1代表MySql,当为 2代表 SQL Server,为3时为ODBC或其它. var $dbHost; //数据库所在主机域名 va

C# .NET更智能的数据库操作的封装完整版(重构)

前述: 第一次发表文章,不过是对数据库简单的封装,主要是阐述下思路.那么在上篇文章,在大家的指导下和提出意见,并自己对代码进行了思考.在这两天我重构了新的框架,我觉得我写的可以称得上框架,为什么?请大家往下看.不过在项目中没有很多注释.笔者除了课余学习时候,大部分时间在完成学校的功课,没有许多时间,所以也就偷下懒,请大家体谅. 这次框架分为几个部分:拼接数据库语句.数据库执行.数据库连接控制.异常类.用户使用的DbHelper.等下我回用文字和图还分析这个部分.经过重构后,类增多了,而且能够极大

mysql导入数据库_只用frm向mysql导入表结构

网上一个连接mysql的jsp代码段,给了数据库的备份文件,但是只有frm, mysql的每张表有三个文件,分别是,*.frm是描述了表的结构,*.MYD保存了表的数据记录,*.MYI则是表的索引, 查了下资料,原来只有frm文件也能导入. 过程如下: 1.在mysql目录下的data目录中,找到要导入表所在的数据库的名称,把frm文件放进去,比如我这里是offer.frm,数据库名称是netshop, 放到数据库netshop目录下之后,在mysql中show tables显示如下 在这里ta

JDBC连接SQLServer数据库(增强封装版)

1 package dao; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Method; 5 import java.sql.Connection; 6 import java.sql.DriverManager; 7 import java.sql.PreparedStatement; 8 import java.sql.ResultSet; 9 import java.sql.SQLException; 10

运用.NIT将数据存入数据库、读取数据库(运用封装)陈老师作业

我基础不好,根据所学的知识,书本的例题修改的,也不知道我理解的是否符合老师要求 运用C#将数据存入数据库.并且可以读取数据库里的数据,此项目我运用了封装.我运用了一个窗体将数据存读数据. 我首先创建了一个数据库,库名“数学题库” ,然后创建了一个表“tiku1”, 添加一个类Class1 class Class1    {        public string strCon = @"Data Source=.;Initial Catalog=数学题库;Integrated security=

android之存储篇_SQLite数据库_让你彻底学会SQLite的使用

标签: Androiddatabase存储 2013-08-24 07:51 29984人阅读 评论(5) 收藏 举报  分类: android 基础知识(74)  数据库(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值. 但有一种情况例外:定义为INTEGER PRIM

EntityFreamWork6.0 数据库底层访问封装

最近看了很多网络上面的很多人写的数据库底层,所以就复制和整理了他们的代码自己拼凑了一个,特意写下了来,希望看到博客的大哥们给提点意见.因为感觉写完以后思路很乱. 代码结构如下 SimpleDbContext,SimpleDbContext : DbContext,ISimpleDbContext DbRepository,DbRepository<T> : IDbRepository<T> where T : class UnitOfWork ,UnitOfWork : IUnit

Android数据库框架GreenDao封装使用,易理解、易扩展

一.概述 在之前一个项目中,因为涉及到数据库,所以就接触到了ORM框架的GreenDao.后面就去网上大量的搜索下载学习,发现很多都是官网的翻译或者是官网DEMO的简单入门讲解,而且对于小白,也不知道从何下手,最终还是放弃选择了本地sqlite. 时隔不久,GreenDao的应用已经是家常便饭了,于是乎,在上个周末就抽取了些时间对官网的DEMO进行拆解封装,并且完善了功能,尽可能的易于理解和扩展,方便以后直接拿来用. 二.效果图 下图addData/deleteData/changeData/q