Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> 安卓Content Provider 使用

安卓Content Provider 使用

編輯:Android編程入門

1ContentProvider相關知識
1.1在安卓應用中,通過文件方式對外共享數據,需要進行文件操作讀寫數據;采用sharedpreferences共享數據,需要使用sharedpreferences API讀寫數據。可以看出雖然它們 可以對外共享數據,但數據訪問方式會因數據存儲的方式而不同。
在安卓中使用ContentProvider共享數據在不同的應用程序之間共享數據,底層的操作是透明的,對外提供統一接口,並可以讓其它應用輕松訪問該數據。

1.2ContentProvider使用表的形式來組織數據,無論數據的來源是什麼,都會認為是一種表,然後把數據組織成表格。並且提供了查詢(query)、插入(insert)、更新(update)、刪除(delete)、獲取數據類型(getType)以及創建數據時調用的回調函數(onCreate)等操作。另外每個ContentProvider都有一個公共的URI,這個URI用於表示這個ContentProvider所提供的數據。Android所提供的ContentProvider都存放在android.provider包當中。

2代碼

2.1訪問系統中的聯系人

public class MainActivity extends Activity {
private ListView listView = null;

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

listView = (ListView) this.findViewById(R.id.listView);
// 查詢系統中的所有聯系人
Uri uri = Uri.parse("content://com.android.contacts/contacts");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
// 根據Cursor創建SimpleCursorAdapter對象
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, cursor,
new String[] { ContactsContract.Contacts.DISPLAY_NAME },
new int[] { android.R.id.text1 },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
// 在ListVIew中顯示聯系人列表
listView.setAdapter(simpleCursorAdapter);
}
}
  同時需要在清單文件加入訪問通訊許可請求

<uses-permission android:name="android.permission.READ_CONTACTS" />
  2.2程序的Content Provider

這個例子是對數據庫實現的操作,數據庫的操作是上一篇中的內容

數據庫操作類

public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context) {
/**
* postgrade.db 數據庫的名字 ;null 表示使用默認的游標工廠 ;1 表示一開始的版本,建議設置為1
*/
super(context, "postgrade.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
// 該方法在第一次創建數據庫的時候被調用
// 因此可以在這個地方創建表之類的操作
db.execSQL("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 修改數據庫的版本會觸發此函數
// 在這裡可以添加新的表或者修改表的字段
}
}
  自定義的content provider

public class StuProvider extends ContentProvider {
private DBOpenHelper dbOpenHelper = null;

private static final UriMatcher MATCHER;
private static final int STU = 0;// 匹配成功後的返回值
private static final String AUTHORITY;// 域名[主機名]
private static final String STUDENT;// 路徑名

static {
// 在不匹配的時候,返回-1,即UriMatcher.NO_MATCH
MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
AUTHORITY = "org.tonny.providers.stuprovider";
STUDENT = "student";
MATCHER.addURI(AUTHORITY, STUDENT, STU);
}

@Override
public boolean onCreate() {
// 在創建實例的時候調用,只會被調用一次;用作數據的初始化操作
dbOpenHelper = new DBOpenHelper(getContext());
return false;
}

@Override
public String getType(Uri uri) {
// 返回當前要操作的數據的內容類型如txt-->plain/text html -->html/text
return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
// 允許外部的應用向內容提供者插入數據
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case STU:
// 調用自身的方法,第二個參數爲插入空值時候的列名
long rowId = db.insert("student", null, values);
Uri insertUri = ContentUris.withAppendedId(uri, rowId);

// 也可以使用這種方式
// Uri insertUri =
// Uri.parse("content://org.tonny.test.providers.stuprovider/student/"+
// rowId);
return insertUri;
default:
throw new IllegalArgumentException("This is an unknown Uri:" + uri);
}
}

@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;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}

}

model層

package org.tonny.domain;

public class Student {
private int id;
private String name;

public Student() {

}

public Student(int id, String name) {
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
  表相關操作

public class StudentService {

private DBOpenHelper dbHelper = null;

public StudentService(Context context) {
this.dbHelper = new DBOpenHelper(context);
}

public void insert(Student stu) {
// 內部有緩存功能,使用的是同一個句柄,如果數據庫滿了,則返回一個只讀的句柄
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 使用占位符號‘?’,防止特殊字符
db.execSQL("INSERT INTO student VALUES(?,?)",
new Object[] { stu.getId(), stu.getName() });
}

public void delete(Integer id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
db.execSQL("DELETE FROM student WHERE id = ?",
new String[] { String.valueOf(id) });
}

public void update(Student stu) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("UPDATE student SET name = ? WHERE id = ?", new String[] {
stu.getName(), String.valueOf(stu.getId()) });
}

public Student query(Integer id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
String sql = "SELECT * FROM student WHERE id = ?";
Cursor cursor = db.rawQuery(sql, new String[] { String.valueOf(id) });
if (cursor.moveToFirst()) {
int stuId = cursor.getInt(cursor.getColumnIndex("id"));
String stuName = cursor.getString(cursor.getColumnIndex("name"));
return new Student(stuId, stuName);
}
return null;
}
}
  activity操作

public class MainActivity extends Activity {
private EditText _txtId = null;
private EditText _txtName = null;
private StudentService _service = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_txtId = (EditText) this.findViewById(R.id.txtId);
_txtName = (EditText) this.findViewById(R.id.txtName);
_service = new StudentService(getApplicationContext());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

public void onBtnOK(View v) {
int id = Integer.valueOf(_txtId.getText().toString());
String name = _txtName.getText().toString();
Student stu = new Student(id, name);
_service.insert(stu);
}

}
  清單文件中對uri的說明

<provider
android:name="org.tonny.db.StuProvider"
android:authorities="org.tonny.providers.stuprovider"
android:exported="true"
tools:ignore="ExportedContentProvider" />
  3.總結

到今天,已經感覺是時候去找些業務研究研究了
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved