専門用語:
ContentProvider コンテンツ プロバイダ
package com.example.litepaltest; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import com.example.litepaltest.bean.Book; import com.example.litepaltest.db.MyDatabaseHelper; import org.litepal.crud.DataSupport; import org.litepal.tablemanager.Connector; import java.util.List; /** * 自定义内容提供器 * 以便其他程序可操作Book表中的数据 * */ public class DatabaseProvider extends ContentProvider { public static final int BOOK_DIR = 0; public static final int BOOK_ITEM = 1; public static final int CATEGORY_DIR = 2; public static final int CATEGORY_ITEM = 3; public static final String AUTHORITY = "com.example.litepaltest.provider"; private static UriMatcher uriMatcher; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY,"book",BOOK_DIR); uriMatcher.addURI(AUTHORITY,"book/#",BOOK_ITEM); } public DatabaseProvider() { } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // Implement this to handle requests to delete one or more rows.int row = -1; Book book = new Book(); int row = -1; switch (uriMatcher.match(uri)){ case BOOK_DIR: row = DataSupport.deleteAll(Book.class); break; case BOOK_ITEM: String id = uri.getPathSegments().get(1); row = DataSupport.delete(Book.class,Long.parseLong(id)); break; } return row; } @Override public String getType(Uri uri) { // TODO: Implement this to handle requests for the MIME type of the data // at the given URI. switch (uriMatcher.match(uri)){ case BOOK_DIR: return "vnd.android.cursor.dir/vnd.com.example.litepaltest.provider.book"; case BOOK_ITEM: return "vnd.android.cursor.item/vnd.com.example.litepaltest.provider.book"; } return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO: Implement this to handle requests to insert a new row. Uri uriReturn = null; switch (uriMatcher.match(uri)){ case BOOK_DIR: case BOOK_ITEM: Book book = new Book(); book.setName((String)values.get("name")); book.save(); Book lastBook = DataSupport.findLast(Book.class); uriReturn = Uri.parse("content://"+AUTHORITY+"/book/"+lastBook.getId()); break; } return uriReturn; } @Override public boolean onCreate() { // TODO: Implement this to initialize your content provider on startup. Connector.getDatabase(); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO: Implement this to handle query requests from clients. Cursor cursor = null; switch (uriMatcher.match(uri)){ case BOOK_DIR: cursor = DataSupport.findBySQL("select * from Book"); break; case BOOK_ITEM: cursor = DataSupport.findBySQL("select * from Book where id = 1"); break; } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO: Implement this to handle requests to update one or more rows. Cursor cursor = null; int row = -1; Book book = new Book(); switch (uriMatcher.match(uri)){ case BOOK_DIR: book.setName((String)values.get("name")); row = book.updateAll(); break; case BOOK_ITEM: book.setName((String)values.get("name")); String idStr = (String)values.get("id"); row = book.update(Long.parseLong(idStr)); break; } return row; } }
上述的数据库操作是用作者写的Litepal数据库框架。
---------------------------------------------------------------分割--------------------------------------------------------------
自定义的内容提供器Uri的标准格式-->
content://packageName.provider/tableName/id
以id结尾的期望是访问该表中拥有相应id的数据,可以使用通配符进行匹配
content://packageName.provider/* 匹配任意表的内容
content://packageName.provider/tableName/# 匹配tableName表中任意一行数据的内容
---------------------------------------------------------------分割--------------------------------------------------------------
自定义的内容提供器Uri的标准格式对应的MIME 多用途互联网邮件扩展 是一种协议这个协议书写格式--
1.必须以vnd开头
2.分别接 android.cursor.dir/ 或者 android.cursor.item/
最后结尾vnd.<authority>.<path>.
其中<authority> 是包名+自定义一个provider名字<path>是表名字
Uri MIME content://com.example.litepaltest.provider/book/ 对应的是 vnd.android.cursor.dir/vnd.com.example.litepaltest.provider.book"; content://com.example.litepaltest.provider/book/ 对应的是 vnd.android.cursor.item/vnd.com.example.litepaltest.provider.book";---------------------------------------------------------------分割--------------------------------------------------------------
另一个应用程序调用操作这些数据库时的主要代码
package com.example.testimageview; import android.content.ContentValues; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { Button create_book, delete_book, update_book, query_book; private String newId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); create_book = findViewById(R.id.create_book); create_book.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("content://com.example.litepaltest.provider/book"); ContentValues contentValues = new ContentValues(); contentValues.put("name", "java_03011653"); Uri newUri = getContentResolver().insert(uri, contentValues); newId = newUri.getPathSegments().get(1); } }); delete_book = findViewById(R.id.delete_book); delete_book.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("content://com.example.litepaltest.provider/book/" + newId); getContentResolver().delete(uri, null, null); } }); update_book = findViewById(R.id.update_book); update_book.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("content://com.example.litepaltest.provider/book/" + newId);//将内容URI解析Uri对象 ContentValues contentValues = new ContentValues();//将数据存到ContentValues对象中 contentValues.put("name", "java_03011656"); contentValues.put("id", newId); getContentResolver().update(uri, contentValues, null, null);//执行更新方法 } }); query_book = findViewById(R.id.query_book); query_book.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("content://com.example.litepaltest.provider/book"); Cursor cursor = getContentResolver().query(uri,null,null,null,null); if(cursor !=null){ while (cursor.moveToNext()){ String id = cursor.getString(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); Log.d("book id is ",id); Log.d("book name is ",name); } cursor.close(); } } }); } }