専門用語:
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();
}
}
});
}
}