现在的位置: 首页 > 综合 > 正文

android 数据操作之uri

2017年11月18日 ⁄ 综合 ⁄ 共 6322字 ⁄ 字号 评论关闭

uri格式:

content://包名/数据表名/id/字段

有两个方法很重要:

ContentUris.parseId();

ContentUris.withAppendedId(uri, id);

自定义内容提供者具体如下:

通过ContentProvider向其他应用程序提供数据,实现数据共享。本质是通过一个域名向其他应用程序提供访问该应用的数据库(通过调用本地应用的数据库的具体操作实现)

步骤如下:

1、定义一个ContentProvider的子类。

1.1 第一个数据库工具类SQLiteDatabase的子类用于该应用进行数据库管理。private DBHelper helper=null;

1.2定义一个Uri匹配类默认不匹配

//定义一个URI匹配类,默认为不匹配

private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH);

1.3定义访问单条记录还是多条

private static final int STUDENT=1;//单条记录

private static final int STUDENTS=2;//多条记录

1.4利用一个静态块定义匹配规则

//定义匹配规则静态块

static{

 URI_MATCHER.addURI("com.yqq.mycontentprovider2.db.StudentProvider","student"STUDENTS);

 //标志位#单条记录  URI_MATCHER.addURI("com.yqq.mycontentprovider2.db.StudentProvider","student/#"STUDENT);

}

1.5利用匹配规则复写6个方法

 

 

@Override

public String getType(Uri uri) {

//匹配成功返回匹配规则的codes,不成功则返回-1

int flag=URI_MATCHER.match(uri);

switch(flag)

{

case STUDENT:

return "vnd.android.cursor.item/student";

case STUDENTS:

return "vnd.android.cursor.dir/student";

}

return null;

}

 

@Override

public int delete(Uri uri, String whereSelection, String[] selectinArgs) {

int count = -1;// 影响数据库的行数

try {

// 获得匹配的uri和用于执行的数据库

int flag = URI_MATCHER.match(uri);

SQLiteDatabase database = helper.getWritableDatabase();

// 删除一条还是多条记录

switch (flag) {

case STUDENT: {// 获得内容提供者的id号。

long id = ContentUris.parseId(uri);

// 获得过滤值

String whereValue = "stud_id=" + id;

// 判断过滤条件是否为空或""

if (whereSelection != null && whereSelection.equals("")) {

// 执行SQLiteDatabase的出入语句

count=database.delete("student", whereValue, selectinArgs);

}

}

break;

case STUDENTS:

{

//多行记录删除

count=database.delete("student", whereSelection, selectinArgs);

}

 

break;

}

catch (Exception e) {

Log.i("内容提供者<<<","删除失败<<<<<<<<<<<<");

 

}

return count;

}

@Override

public Uri insert(Uri uri, ContentValues values) {

//定义一个Uri类用于返回

Uri resultUri=null;

//匹配当前传入的uri

int flag=URI_MATCHER.match(uri);

switch(flag)

{//插入多条记录

 case STUDENTS:

 //获得数据库

 SQLiteDatabase database=helper.getWritableDatabase();

 //插入数据获得插入数据的行号

 long id=database.insert("student"null, values);

 //通过新插入数据的行号来获取需要返回的Uri

 resultUri=ContentUris.withAppendedId(uri, id);

 break;

}

Log.i(TAG,"<<<<<<<<<<<"+resultUri.toString());

return resultUri;

}

 

@Override

public boolean onCreate() {

//初始化一个数据库工具类子类

helper=new DBHelper(getContext());

return false;

}

 

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

// 定义一个游标用于查询

Cursor cursor = null;

//

try{

SQLiteDatabase database = helper.getReadableDatabase();

// 进行URI匹配

int flag = URI_MATCHER.match(uri);

 

// 匹配后的查询选择

switch (flag) {

//单条记录

case STUDENT: {

//获得该记录的id

long id=ContentUris.parseId(uri);

String where_value="stud_id="+id;

if(selection!=null&&selection!="")

{

where_value+="and"+selection;

}

//SQLiteDatabase进行查询

cursor=database.query("student",null, where_value, selectionArgs, nullnullnull,null);

 

} break;

case STUDENTS:

cursor=database.query("student"null, selection, selectionArgs, null,null,null,null);

 

}

}catch(Exception e){

Log.i("查询<<<<""查询错误!!!");

}

 

return cursor;

}

 

@Override

public int update(Uri uri, ContentValues values, String whereClause, String[] whereArgs) {

//受影响的数据的行数

int count=-1;

//匹配URI

int flag=URI_MATCHER.match(uri);

//获得id

long id=ContentUris.parseId(uri);

//获得过滤条件

String whereValue="stud_id="+id;

if(whereClause!=null&&whereClause.equals(""))

{

whereValue+="and" +whereClause;

}

//获得进行操作的数据库

SQLiteDatabase database=helper.getWritableDatabase();

switch(flag)

{

//单行记录

case STUDENT:

{

//update table student set name=?id=?,addr=?where id=?

count=database.update("student", values, whereValue, whereArgs);

}

}

return count;

}

测试类:

public class Test extends AndroidTestCase {

/*public void testInsert()

{

 

//1、获得一个内容解析者

ContentResolver contentResolver=getContext().getContentResolver();

//2获得URI清单文件中(包名加类名加标识符)(注意加上content://

Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");

//获得一个类似map的集合对象

ContentValues values=new ContentValues();

//往该集合添加数据时要注意数据的类型

values.put("stud_name", "李华");

values.put("stud_sex", "");

values.put("stud_age", 25);

values.put("stud_phone", "13389009881");

values.put("stud_remark", "已毕业");

 contentResolver.insert(uri, values);

 Log.i("数据插入","数据出插入成功!!!");

}*/

/*public void testDelete()

{

//获得一个内容解析者

ContentResolver contentResolver=getContext().getContentResolver();

//获得Uri对象

//删除单条记录

//Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student/1");

//获得Uri删除多条记录

Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");

int flag=contentResolver.delete(uri, null,null );

Log.i("数据删除","数据出删除成功!!!"+flag);

}*/

/*public void testUpdata()

{

//获得一个内容解析者

ContentResolver contentResolver=getContext().getContentResolver();

//获得URI

Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student/7");

ContentValues values=new ContentValues();

values.put("stud_name", "黎明");

values.put("stud_sex", "");

values.put("stud_age", 23);

values.put("stud_phone", "13789009881");

values.put("stud_remark", "本科在读");

contentResolver.update(uri, values, null, null);

Log.i("数据更新","数据出更新成功!!!");

}*/

public void testQue()

{

ContentResolver contentResolver=getContext().getContentResolver();

/*//获得URI单条记录

Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student/7");

//获得URI多条条记录

Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");

*/

/*

Cursor cursor=contentResolver.query(uri, null, null, null, null);

int colums=cursor.getColumnCount();

Map<String,String> map=new HashMap<String,String>();

while(cursor.moveToNext())

{

for(int i=0;i<colums;i++)

{

String columName=cursor.getColumnName(i);

String columValue=cursor.getString(cursor.getColumnIndex(columName));

if(columValue==null)

{

columValue=" ";

}

map.put(columName, columValue);

}

}

Log.i("数据查找",map.toString());

*/

///////////////////////////////////////////////////

//多条记录查询

//获得URI多条条记录

Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");

Cursor cursor=contentResolver.query(uri, nullnullnullnull);

int colums=cursor.getColumnCount();

List<Map<String,String> >list=new ArrayList<Map<String,String>>();

while(cursor.moveToNext())

{

Map<String,String> map=new HashMap<String,String>();

for(int i=0;i<colums;i++)

{

String columName=cursor.getColumnName(i);

String columValue=cursor.getString(cursor.getColumnIndex(columName));

if(columValue==null)

{

columValue=" ";

}

map.put(columName, columValue);

}

list.add(map);

}

Log.i("数据查找",list.toString());

}

 

}

 

 

抱歉!评论已关闭.