简介:
主要用于在不同的应用程序之间实现数据共享的功能,他提供了一套完整的机制,允许一个程序访问另一个程序中的数据 ,同时还能保证被访问数据的安全性。使用内容提供其是Android实现跨程序共享数据的标准方式。
Layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.tiger.databasetest.MainActivity">
<Button
android:id="@+id/btn_create"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClickMainActivity"
android:text="Create Database "
android:textAllCaps="false" />
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_create"
android:onClick="onClickMainActivity"
android:text="Add"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_del"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_add"
android:onClick="onClickMainActivity"
android:text="Delete"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_del"
android:onClick="onClickMainActivity"
android:text="Update"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_update"
android:onClick="onClickMainActivity"
android:text="Query"
android:textAllCaps="false" />
</RelativeLayout>
清单文件
<provider
android:name=".DatabaseProvider"
android:authorities="com.tiger.databasetest.provider"
android:enabled="true"
android:exported="true"></provider>
DataBaseProvider
package com.tiger.databasetest;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class DatabaseProvider extends ContentProvider {
public DatabaseProvider() {
}
public static final int Users_Dir = 0; //所有数据
public static final int Users_ITEM = 1; //单条数据
public static final String AUTHORITY = "com.tiger.databasetest.provider"; //内容提供器的名称
private static UriMatcher uriMatcher;
private MyDatabaseHelper dbHelper; //数据库
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "Users", Users_Dir);
uriMatcher.addURI(AUTHORITY, "Users/#", Users_ITEM);
}
@Override
public boolean onCreate() {
dbHelper = new MyDatabaseHelper(getContext(), "Test.db", null, 1);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//查询数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case Users_Dir:
cursor = db.query("Users", projection, selection, selectionArgs, null, null, sortOrder);
break;
case Users_ITEM:
//getPathSegments()方法会把内容的URI权限之后的部分已 “/” 分割,并把分割后的结果放入到
//一个字符创列表中,这个列表的地0位置存放的是路径,第1个位置存放的是 id
//得到id 之后,就可以通过 selection 和 selectionArgs 参数进行约束,及时实现了查询单挑数据的功能。
String userId = uri.getPathSegments().get(1);
cursor = db.query("Users", projection, "id=?", new String[]{userId}, null, null, sortOrder);
break;
}
return cursor;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
//添加数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)) {
case Users_Dir:
case Users_ITEM:
long newUserId = db.insert("Users", null, values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/Users/" + newUserId);
break;
}
return uriReturn;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
//更新数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updateRows = 0;
switch (uriMatcher.match(uri)) {
case Users_Dir:
updateRows = db.update("Users", values, selection, selectionArgs);
break;
case Users_ITEM:
String userId = uri.getPathSegments().get(1);
updateRows = db.update("Users", values, "id=?", new String[]{userId});
break;
}
return updateRows;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
//删除数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deleteRows = 0;
switch (uriMatcher.match(uri)) {
case Users_Dir:
deleteRows = db.delete("Users", selection, selectionArgs);
break;
case Users_ITEM:
String userId = uri.getPathSegments().get(1);
deleteRows = db.delete("Users", "id=?", new String[]{userId});
break;
}
return deleteRows;
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case Users_Dir:
return "vnd.android.cursor.dir/vnd.com.tiger.databasetest.provider.Users";
case Users_ITEM:
return "vnd.android.cursor.item/vnd.com.tiger.databasetest.provider.Users";
}
return null;
}
}
MainActivity
package com.tiger.databasetest;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper=new MyDatabaseHelper(MainActivity.this,"Test.db",null,1);
}
public void onClickMainActivity(View view){
switch (view.getId()){
case R.id.btn_create: //创建数据库
dbHelper.getWritableDatabase();
break;
case R.id.btn_add:
SQLiteDatabase dbAdd=dbHelper.getWritableDatabase();
dbAdd.execSQL("insert into Users(Name,Phone) values(?,?)",new String[]{"Name1","123123"});
dbAdd.execSQL("insert into Users(Name,Phone) values(?,?)",new String[]{"Name2","123123"});
break;
case R.id.btn_del:
SQLiteDatabase dbDel=dbHelper.getWritableDatabase();
dbDel.execSQL("delete from Users where Id=?",new String[]{"2"});
break;
case R.id.btn_update:
SQLiteDatabase dbUpdate=dbHelper.getWritableDatabase();
dbUpdate.execSQL("update Users set phone=? where id=?",new String[]{"666666","1"});
break;
case R.id.btn_query:
SQLiteDatabase dbQuery=dbHelper.getWritableDatabase();
Cursor cursor = dbQuery.rawQuery("select * from Users",null);
while (cursor.moveToNext()){
Log.e("Test ", "Id:"+cursor.getString(cursor.getColumnIndex("Id")) );
Log.e("Test ", "Name:"+cursor.getString(cursor.getColumnIndex("Name")) );
Log.e("Test ", "Phone:"+cursor.getString(cursor.getColumnIndex("Phone")) );
}
break;
}
}
}
MyDataBaseAdapter
package com.tiger.databasetest;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by IT on 7/18/2017.
*/
public class MyDatabaseHelper extends SQLiteOpenHelper {
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table Users(Id integer primary key autoincrement, Name text,Phone text)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
=========================================================================================================
ProviderTest
Layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.tiger.providertest.MainActivity">
<Button
android:id="@+id/btn_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClickMainActivity"
android:text="Query"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/btn_query"
android:onClick="onClickMainActivity"
android:text="Add Data"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_add"
android:onClick="onClickMainActivity"
android:text="Update"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_update"
android:onClick="onClickMainActivity"
android:text="Delete"
android:textAllCaps="false" />
</RelativeLayout>
MainActivity
package com.tiger.providertest;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private String newId="0"; //先添加记录的Id
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickMainActivity(View view) {
switch (view.getId()) {
case R.id.btn_query: //查询数据
Uri uriQuery = Uri.parse("content://com.tiger.databasetest.provider/Users");
Cursor cursor = getContentResolver().query(uriQuery, null, null, null, null);
if(cursor!=null){
while (cursor.moveToNext()) {
final String id=cursor.getString(cursor.getColumnIndex("Id"));
final String name=cursor.getString(cursor.getColumnIndex("Name"));
final String phone=cursor.getString(cursor.getColumnIndex("Phone"));
Log.e("Test ", "Id:" +id );
Log.e("Test ", "Name:" +name);
Log.e("Test ", "Phone:" + phone);
}
cursor.close();
}
break;
case R.id.btn_add: //添加数据
Uri uriAdd = Uri.parse("content://com.tiger.databasetest.provider/Users");
ContentValues valuesAdd = new ContentValues();
valuesAdd.put("Name", "TestName");
valuesAdd.put("Phone", "88888888");
Uri newUri = getContentResolver().insert(uriAdd, valuesAdd);
newId = newUri.getPathSegments().get(1);
Log.e("Test:", "The new insert data id:" + newId);
break;
case R.id.btn_update: //修改数据
//更新Users表中 最新添加的那条数据
Uri uriUpdate=Uri.parse("content://com.tiger.databasetest.provider/Users/"+newId);
ContentValues valuesUpdate= new ContentValues();
valuesUpdate.put("Phone","666666");
valuesUpdate.put("Name","Test2Name");
getContentResolver().update(uriUpdate,valuesUpdate,null,null);
break;
case R.id.btn_delete: //删除数据
Uri uriDel=Uri.parse("content://com.tiger.databasetest.provider/Users/"+newId);
getContentResolver().delete(uriDel,null,null);
break;
}
}
}
One comment