简世博客

一个简单的世界——博客空间,写了一些Android相关的技术文章,和一些点滴的想法

0%

Android Content Provider教程

Android Content Provider教程

什么是Content Provider?

在Android应用程序中,Content Provider是一种用于管理应用程序数据的组件。Content Provider允许应用程序共享数据,并提供了一种安全的方式来访问数据。Content Provider可以让其他应用程序访问数据,也可以让应用程序访问其他应用程序的数据。

Content Provider的作用

Content Provider的主要作用是提供数据,让其他应用程序可以访问这些数据。Content Provider还可以用于数据共享和数据同步。例如,一个应用程序可以使用Content Provider来共享联系人数据,另一个应用程序可以使用Content Provider来访问这些联系人数据。

如何创建Content Provider

要创建Content Provider,您需要创建一个继承自ContentProvider的类。在这个类中,您需要实现一些方法来管理数据。下面是一个简单的Content Provider示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class MyContentProvider extends ContentProvider {
// 数据库帮助类
private MyDatabaseHelper dbHelper;

// Content Provider的MIME类型
private static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.myprovider.data";

@Override
public boolean onCreate() {
// 创建数据库帮助类
dbHelper = new MyDatabaseHelper(getContext());
return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query("mytable", projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
long rowId = db.insert("mytable", null, values);
Uri insertedUri = ContentUris.withAppendedId(uri, rowId);
getContext().getContentResolver().notifyChange(insertedUri, null);
return insertedUri;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count = db.update("mytable", values, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count = db.delete("mytable", selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}

@Override
public String getType(Uri uri) {
return CONTENT_TYPE;
}
}

在这个示例中,我们创建了一个名为MyContentProvider的Content Provider。在onCreate()方法中,我们创建了一个MyDatabaseHelper对象,用于管理数据库。在query()方法中,我们查询了数据库中的数据,并返回一个Cursor对象。在insert()方法中,我们向数据库中插入一条新的数据,并返回插入数据的Uri。在update()方法中,我们更新了数据库中的数据,并返回更新的数据数量。在delete()方法中,我们删除了数据库中的数据,并返回删除的数据数量。在getType()方法中,我们返回了Content Provider的MIME类型。

如何使用Content Provider

要使用Content Provider,您需要使用ContentResolver对象。ContentResolver对象可以用来查询、插入、更新和删除数据。下面是一个简单的使用Content Provider的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 查询数据
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(Uri.parse("content://com.example.myprovider/data"), null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d(TAG, "name: " + name + ", age: " + age);
}
cursor.close();
}

// 插入数据
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 18);
Uri insertedUri = resolver.insert(Uri.parse("content://com.example.myprovider/data"), values);
Log.d(TAG, "inserted uri: " + insertedUri);

// 更新数据
ContentValues updateValues = new ContentValues();
updateValues.put("age"," 20);
int count = resolver.update(Uri.parse("content://com.example.myprovider/data"), updateValues, "name=?", new String[]{"张三"});
Log.d(TAG, "updated count: " + count);

// 删除数据
int deleteCount = resolver.delete(Uri.parse("content://com.example.myprovider/data"), "name=?", new String[]{"张三"});
Log.d(TAG, "deleted count: " + deleteCount);

在这个示例中,我们使用ContentResolver对象来查询、插入、更新和删除数据。在查询数据时,我们使用了ContentResolver的query()方法,并传入Content Provider的Uri。在插入数据时,我们使用了ContentResolver的insert()方法,并传入Content Provider的Uri和要插入的数据。在更新数据时,我们使用了ContentResolver的update()方法,并传入Content Provider的Uri、要更新的数据和更新条件。在删除数据时,我们使用了ContentResolver的delete()方法,并传入Content Provider的Uri和删除条件。

总结

Content Provider是Android应用程序中管理数据的重要组件。Content Provider可以让应用程序共享数据,并提供了一种安全的方式来访问数据。要创建Content Provider,您需要创建一个继承自ContentProvider的类,并实现一些方法来管理数据。要使用Content Provider,您需要使用ContentResolver对象,并调用它的方法来查询、插入、更新和删除数据。希望这篇教程能够帮助您更好地理解和使用Content Provider。