1、创建contentProvider
定义(客户端调用时需知的内容)接口
package com.gogler.content;
import android.net.Uri;
import android.provider.BaseColumns;
public class Users {
public static final String AUTHORITY = "com.gogler.content";
public static final class User implements BaseColumns{
public static final Uri CONTENT_URI = Uri.parse("content://com.gogler.content");
public static final String USER_NAME = "USER_NAME";
}
}
实现内容提供器
package com.gogler.content;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
public class SumaryContentProvider extends ContentProvider {
private SQLiteDatabase sqlDB;
private DatabaseHelper dbHelper;
private static final String DATABASE_NAME = "Users.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "User";
private static final String TAG = "SumaryContentProvider";
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建用于存储数据的表
db.execSQL("Create table " + TABLE_NAME + "( _id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"USER_NAME TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
@Override
public int delete(Uri uri, String s, String[] as) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
sqlDB = dbHelper.getWritableDatabase();
long rowId = sqlDB.insert(TABLE_NAME, "", contentvalues);
if (rowId > 0) {
Uri rowUri = ContentUris.appendId(Users.User.CONTENT_URI.buildUpon(), rowId).build();
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public boolean onCreate() {
dbHelper = new DatabaseHelper(getContext());
return (dbHelper == null) ? false : true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
SQLiteDatabase db = dbHelper.getReadableDatabase();
qb.setTables(TABLE_NAME);
Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
return 0;
}
}
2、使用内容提供器ContentResolver(客户端)
package com.gogler.content;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;
public class ContentSumaryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
for(int i =1; i<=10; i++){
insertRecord("User"+i);
}
displayRecords();
}
private void insertRecord(String userName) {
ContentValues values = new ContentValues();
values.put(Users.User.USER_NAME, userName);
getContentResolver().insert(Users.User.CONTENT_URI, values);
}
private void displayRecords() {
String columns[] = new String[] { Users.User._ID, Users.User.USER_NAME };
Uri myUri = Users.User.CONTENT_URI;
Cursor cur = managedQuery(myUri, columns,null, null, null );
if (cur.moveToFirst()) {
String id = null;
String userName = null;
do {
id = cur.getString(cur.getColumnIndex(Users.User._ID));
userName = cur.getString(cur.getColumnIndex(Users.User.USER_NAME));
Toast.makeText(this, id + " " + userName, Toast.LENGTH_LONG).show();
} while (cur.moveToNext());
}
}
}
3、参考
本文详细介绍如何在Android中创建和使用ContentProvider。首先展示了如何通过定义接口和实现ContentProvider类来创建内容提供器,并给出了具体的代码示例。接着,介绍了客户端如何通过ContentResolver与内容提供器进行交互,包括插入和查询数据等操作。
1971

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



