Mars Chen Android培训材料ContentProvider源代码

来源:互联网 发布:java软件接口 编辑:程序博客网 时间:2024/05/01 12:21

个人总结:

(1)视频中 AUTHORITY有问题,正确的应该为:


public static final String AUTHORITY ="com.example.testcontentprovider.FirstContentProvider";



1. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testcontentprovider"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.testcontentprovider.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider android:name="com.example.testcontentprovider.FirstContentProvider"
            android:authorities="com.example.testcontentprovider.FirstContentProvider"></provider>
    </application>

</manifest>

2. activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Main activity of Content Provider" />
    <Button
        android:id="@+id/insert"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Insert"
        />
    
    <Button
        android:id="@+id/query"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Query"
        />

</LinearLayout>

3. DatabaseHelper.java

package com.example.sqlite3;

import com.example.testcontentprovider.FirstProviderMetaData;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper{
private static final int VERSION = 1;
public DatabaseHelper(Context context, String name){
this(context, name, VERSION);
}
public DatabaseHelper(Context context, String name, int version){
this(context, name, null, version);
}
public DatabaseHelper(Context context, String name, CursorFactory factory, int version){
super(context, name, factory, version);
}
/* (non-Javadoc)
 * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
 */
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
System.out.println("create a Database");
String strSql = "create table " + FirstProviderMetaData.USERS_TABLE_NAME
+"("+FirstProviderMetaData.UserTableMetaData._ID
+" INTEGER PRIMARY KEY AUTOINCREMENT,"
+ FirstProviderMetaData.UserTableMetaData.USER_NAME
+ " varchar(20))";
System.out.println(strSql);
arg0.execSQL(strSql);
}
/* (non-Javadoc)
 * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
 */
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
System.out.println("update a Database");
}
}

4. FirstContentProvider.java
package com.example.testcontentprovider;

import java.util.HashMap;

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;

import com.example.sqlite3.DatabaseHelper;
import com.example.testcontentprovider.FirstProviderMetaData.UserTableMetaData;

public class FirstContentProvider extends ContentProvider {
public static final UriMatcher uriMatcher;
public static final int INCOMING_USER_COLLECTION = 1;
public static final int INCOMING_USER_SINGLE = 2;
private DatabaseHelper dh;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(FirstProviderMetaData.AUTHORITY, "users", INCOMING_USER_COLLECTION);
uriMatcher.addURI(FirstProviderMetaData.AUTHORITY, "users/#", INCOMING_USER_SINGLE);
}
public static HashMap<String, String>  userProjectionMap;
static {
userProjectionMap = new HashMap<String, String>();
userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
}
/* (non-Javadoc)
 * @see android.content.ContentProvider#delete(android.net.Uri, java.lang.String, java.lang.String[])
 */
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// TODO Auto-generated method stub
System.out.println("delete");
return 0;
}
/* (non-Javadoc)
 * @see android.content.ContentProvider#getType(android.net.Uri)
 */
@Override
public String getType(Uri arg0) {
// TODO Auto-generated method stub
System.out.println("getType");
switch (uriMatcher.match(arg0)) {
case INCOMING_USER_COLLECTION:
return UserTableMetaData.CONTENT_TYPE;
case INCOMING_USER_SINGLE:
return UserTableMetaData.CONTENT_TYPE_ITEM;
default:
throw new IllegalArgumentException("Unkown URI" + arg0);
}
}
/* (non-Javadoc)
 * @see android.content.ContentProvider#insert(android.net.Uri, android.content.ContentValues)
 */
@Override
public Uri insert(Uri arg0, ContentValues arg1) {
// TODO Auto-generated method stub 
System.out.println("insert");
SQLiteDatabase db = dh.getWritableDatabase();
long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, arg1);
if (rowId > 0) {
Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(insertedUserUri, null);
return insertedUserUri;
}
throw new SQLException("Failed to insert row into" + arg0);
}
/* (non-Javadoc)
 * @see android.content.ContentProvider#onCreate()
 */
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
dh = new DatabaseHelper(getContext(), FirstProviderMetaData.DATABASE_NAME);
System.out.println("onCreate");
return false;
}
/* (non-Javadoc)
 * @see android.content.ContentProvider#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)
 */
@Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
String arg4) {
// TODO Auto-generated method stub
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
switch (uriMatcher.match(arg0)) {
case INCOMING_USER_COLLECTION:
qb.setTables(UserTableMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
break;
case INCOMING_USER_SINGLE:
qb.setTables(UserTableMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
qb.appendWhere(UserTableMetaData._ID + "=" + arg0.getPathSegments().get(1));
break;
}
String orderBy;
if (TextUtils.isEmpty(arg4)) {
orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
}
else {
orderBy = arg4;
}
SQLiteDatabase db = dh.getWritableDatabase();
Cursor c = qb.query(db,  arg1, arg2, arg3, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), arg0);
System.out.println("query");
return c;
}
/* (non-Javadoc)
 * @see android.content.ContentProvider#update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[])
 */
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stub
System.out.println("update");
return 0;
}
}
5.FirstProviderMetaData.java
package com.example.testcontentprovider;

import android.net.Uri;
import android.provider.BaseColumns;

public class FirstProviderMetaData {
//final equals to static in C++
//相当于网站的域名,数据入口
public static final String AUTHORITY ="com.example.testcontentprovider.FirstContentProvider";
//数据库名称
public static final String DATABASE_NAME = "FirstProvider.db";
//数据库版本
public static final int DATABASE_VERSION = 1;
//表名
public static final String USERS_TABLE_NAME = "users";
//定义子表, content都统一成表组织的形式。他们之间可以相互嵌套
public static final class UserTableMetaData implements BaseColumns{
//表名
public static final String TABLE_NAME = "users";
//定义数据uri,该uri对应数据库中的users表
public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/users");
//访问所有数据
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";
//访问single数据项
public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.user";
//列名
public static final String USER_NAME = "name";
//默认排序方法
public static final String DEFAULT_SORT_ORDER = "_id desc";
}
}
6.MainActivity.java
package com.example.testcontentprovider;
//将SQLite封装成ContentProvider函数

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.testcontentprovider.FirstProviderMetaData.UserTableMetaData;

public class MainActivity extends Activity {
private Button insert = null;
private Button query = null;
private String strResult = "";
private TextView result = null;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        insert  = (Button)findViewById(R.id.insert);
        query = (Button)findViewById(R.id.query);
        result = (TextView)findViewById(R.id.result);
        
        //System.out.println("before contentresolver");
        //System.out.println(getContentResolver().getType(FirstProviderMetaData.UserTableMetaData.CONTENT_URI));
        //getContentResolver();
        //System.out.println("after contentresolver");
        //System.out.println(getContentResolver().getType(FirstProviderMetaData.UserTableMetaData.CONTENT_URI));
        
        insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ContentValues values = new ContentValues();
values.put(FirstProviderMetaData.UserTableMetaData.USER_NAME, "zhanshan");
//使用ContentResolver调用ContentProvider的insert函数
//前提是ContentProvider必须在AndroidManifest中注册
Uri uri = getContentResolver().insert(FirstProviderMetaData.UserTableMetaData.CONTENT_URI, values);
System.out.println("uri--->" + uri.toString());
}
});
        
        query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
strResult = "";
Cursor c = getContentResolver().query
(FirstProviderMetaData.UserTableMetaData.CONTENT_URI, null,
null, null, null);
while (c.moveToNext()) {
System.out.println(c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME)));
strResult += c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME));
}
result.setText(strResult);
}
});
    }


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

0 0
原创粉丝点击