自定义内容选择器<第一行コード>を読んだメモ

専門用語:

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();
                }
            }
        });

    }
}

---------------------------------------------------------------分割--------------------------------------------------------------
---------------------------------------------------------------分割--------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/qq_15623599/article/details/79582864