AAndroid中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样会在数据库操作上损失一点性能,但基于xxxx对数据库操作不频繁性能要求不高可以使用,所带来的好处即使有一个良好的统一的数据库操作以及降低代码维护成本.然而,SQLite的数据库只能有本程序访问数据。但为了不同的程序间可以共享数据,Android 有给我们提供了ContentProvider,只需要声明权限,是不同程序间的数据共享提供了可能。
对于使用ContentProvider的第一步我们需要继承ContentProvider,实现并重写ContentProvider搜提供的方法。ContentProvider 所提供的发法有:用于外部删除数据 int delete(Uri uri, String selection, String[] selectionArgs), Uri insert(Uri uri, ContentValues values), 用于外部查询Cursor query(Uri uri, String[] projection,
String selection,
String[] selectionArgs, String sortOrder),用于外部更新数据int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs),boolean onCreate()方法ContentProvider在其它程序第一次访问时创建 ,返回当前Uri所代表的类型String getType(Uri uri)此函数,如果ContentProvider是自己定义的必须实现。
在第二不是会用到Android提供的另一个辅助类ContentUris,在下述的代码中使用ContentUris工具类构造添加数据后这条记录的Uri,ContentUris类用于获取Uri路径后面的ID部分。它有两个有用的方法。
(1)withAppendedID(uri,id),用于为路径加上ID部分。
(2)parseId(id)方法用于从路径中获取ID部分。
主要代码演示:
package com.itcast.utils;
import android.net.Uri;
import android.provider.BaseColumns;
public class Person
{
//ContentProvider的uri
public static final String AUTHORITY = "com.google.provider.person";
private Person(){}
// 定义基本字段
public static final class Informations implements BaseColumns
{
private Informations(){}
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/persons");
package com.itcast.database;
import com.itcast.utils.Person.Informations;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper
{
// 数据库名
private static final String DATABASE_NAME = "person.db";
private static final int DATABASE_VERSION = 1;
// 表名
public static final String TABLE_NAME = "persons";
//创建表SQL语句
private static final String CREATE_TABLE="CREATE TABLE "
+ TABLE_NAME
+ " (" + Informations._ID
+ " INTEGER PRIMARY KEY,"
+ Informations.NAME
+ " varcahr(10),"
+ Informations.SEX
+ " varchar(2),"
+ Informations.CREATEDDATE
+ " INTEGER,"
+ Informations.MODIFIEDDATE
+ " INTEGER" + ");";
//构造函数-创建数据库
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//创建表
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_TABLE);
}
//更新数据库
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS persons");
onCreate(db);
}
}
// 新的MIME类型-多个
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.person";
// 新的MIME类型-单个
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.person";
public static final String DEFAULT_SORT_ORDER = "modified DESC";
//字段
public static final String NAME = "name";
public static final String SEX = "sex";
public static final String CREATEDDATE = "created";
public static final String MODIFIEDDATE = "modified";
}
}
package com.itcast.database;
import java.util.HashMap;
import com.itcast.utils.Person;
import com.itcast.utils.Person.Informations;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class PersonContentProvider extends ContentProvider
{
private static HashMap<String, String> sPersonProjectionMap;
private static final int PERSON = 1;
private static final int PERSON_ID = 2;
private static final UriMatcher sUriMatcher ;
private DatabaseHelper mOpenHelper;
static
{
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(Person.AUTHORITY, "persons", PERSON);
sUriMatcher.addURI(Person.AUTHORITY, "persons/#", PERSON_ID);
sPersonProjectionMap = new HashMap<String, String>();
sPersonProjectionMap.put(Informations._ID, Informations._ID);
sPersonProjectionMap.put(Informations.NAME, Informations.NAME);
sPersonProjectionMap.put(Informations.SEX, Informations.SEX);
sPersonProjectionMap.put(Informations.CREATEDDATE,
Informations.CREATEDDATE);
sPersonProjectionMap.put(Informations.MODIFIEDDATE, Informations.MODIFIEDDATE);
}
@Override
public int delete(Uri uri, String where, String[] whereArgs)
{
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri))
{
case PERSON:
count = db.delete(mOpenHelper.TABLE_NAME, where, whereArgs);
break;
case PERSON_ID:
String noteId = uri.getPathSegments().get(1);
count = db.delete(mOpenHelper.TABLE_NAME, Informations._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
// 如果有自定义类型,必须实现该方法
@Override
public String getType(Uri uri)
{
switch (sUriMatcher.match(uri))
{
case PERSON:
return Informations.CONTENT_TYPE;
case PERSON_ID:
return Informations.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
//插入数据库
@Override
public Uri insert(Uri uri, ContentValues initialValues)
{
if (sUriMatcher.match(uri) != PERSON)
{
throw new IllegalArgumentException("Unknown URI " + uri);
}
ContentValues values;
if (initialValues != null)
{
values = new ContentValues(initialValues);
}
else
{
values = new ContentValues();
}
Long now = Long.valueOf(System.currentTimeMillis());
if (values.containsKey(Informations.CREATEDDATE) == false)
{
values.put(Informations.CREATEDDATE, now);
}
if (values.containsKey(Informations.MODIFIEDDATE) == false)
{
values.put(Informations.MODIFIEDDATE, now);
}
// if (values.containsKey(Informations.NAME) == false)
// {
// Resources r = Resources.getSystem();
// values.put(Informations.NAME, r.getString(android.R.string.untitled));
// }
if (values.containsKey(Informations.SEX) == false)
{
values.put(Informations.SEX, "");
}
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
long rowId = db.insert(mOpenHelper.TABLE_NAME, Informations.NAME, values);
if (rowId > 0)
{
Uri noteUri = ContentUris.withAppendedId(Informations.CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(noteUri, null);
return noteUri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public boolean onCreate()
{
mOpenHelper = new DatabaseHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
{
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
switch (sUriMatcher.match(uri))
{
case PERSON:
qb.setTables(mOpenHelper.TABLE_NAME);
qb.setProjectionMap(sPersonProjectionMap);
break;
case PERSON_ID:
qb.setTables(mOpenHelper.TABLE_NAME);
qb.setProjectionMap(sPersonProjectionMap);
qb.appendWhere(PERSON_ID+ "=" + uri.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
String orderBy;
if (TextUtils.isEmpty(sortOrder))
{
orderBy = Person.Informations.DEFAULT_SORT_ORDER;
}
else
{
orderBy = sortOrder;
}
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs)
{
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri))
{
case PERSON:
count = db.update(mOpenHelper.TABLE_NAME, values, where, whereArgs);
break;
case PERSON_ID:
String noteId = uri.getPathSegments().get(1);
count = db.update(mOpenHelper.TABLE_NAME, values, Person.Informations._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
这里是ContentProvider的主要代码,剩下的就是自己写要调用的部分。
本文介绍了在Android应用中使用ContentProvider实现不同程序间数据共享的方法,包括继承ContentProvider,实现其方法,以及使用ContentUris进行数据操作。
619

被折叠的 条评论
为什么被折叠?



