ch8 ProviderDemo

布局文件不需要改

MainActivity.java

package com.example.ch08providerdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.net.Uri;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册ContentObserver
        getContentResolver().registerContentObserver(
                Uri.parse("content://" + MyStar.AUTHORITY),
                true,
                new MyObserver(null)
        );
    }
}

MyObserver.java

package com.example.ch08providerdemo;

import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;

public class MyObserver extends ContentObserver {
    public MyObserver(Handler handler) {
        super(handler);
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
//        if(selfChange){
            Log.i("lww", "数据发生变化");
//        }
    }
}

MySqliteHelper.java

package com.example.ch08providerdemo;

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

import androidx.annotation.Nullable;

public class MySqliteHelper extends SQLiteOpenHelper {
    public MySqliteHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //第一次使用时创建数据库表
        String table = "create table StarTB(id integer primary key autoincrement, name varchar(10), hobby varchar(50))";
        sqLiteDatabase.execSQL(table);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

MyStar.java

package com.example.ch08providerdemo;

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

/**
 * 用于定义数据表的结构的Java Bean
 */
public final class MyStar {
    //定义Authority
    public static final String AUTHORITY = "net.onest.lww.provider";
    //定义内部表结构(列名)
    public static final class MyStarTable implements BaseColumns{
        //定义数据表的列名称
        public final static String _ID = "id";
        public final static String NAME = "name";
        public final static String HOBBY = "hobby";

        //定义2个Uri
        public final static Uri STARS_CONTENT_URI =
                Uri.parse("content://" + AUTHORITY + "/stars");
        public final static Uri STAR_CONTENT_URI =
                Uri.parse("content://" + AUTHORITY + "/star/#");
    }
}

MyStarProvider.java

package com.example.ch08providerdemo;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

public class MyStarProvider extends ContentProvider {
    //定义UriMatcher属性
    private static UriMatcher matcher =
            new UriMatcher(UriMatcher.NO_MATCH);
    //定义数据库管理类的对象属性
    private MySqliteHelper dbHelper;
    //定义2个标号
    private static final int STARS = 1;
    private static final int STAR = 2;
    //注册2个Uri,并关联Uri与标号
    static{
        matcher.addURI(MyStar.AUTHORITY, "stars", STARS);
        matcher.addURI(MyStar.AUTHORITY, "star/#", STAR);
    }
    public MyStarProvider() {
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int n = 0;
        //获取可写的数据库对象
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        switch (matcher.match(uri)){
            case STARS:
                n = db.delete(
                        "StarTB", selection, selectionArgs);
                break;
            case STAR:
                //获取资源id
                long id = ContentUris.parseId(uri);
                Log.i("lww", "待删除的id:" + id);
                //重新拼接where条件
                String where = "id = " + id;
                if(null != selection && !"".equals(selection)) {
                     where = where + " and " + selection;
                }
                //执行更新
                n = db.delete(
                        "StarTB", where, selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        if(n > 0){
            //通知数据改变
            getContext().getContentResolver().notifyChange(uri, null);
        }
        return n;
    }

    @Override
    public String getType(Uri uri) {
        String type = null;
        //根据参数的形式(批量/单一操作)来返回相应的MIME类型
        switch (matcher.match(uri)){
            case STARS://批量操作数据
                type = "lww.cursor.dir/net.onest.lww.provider";
                break;
            case STAR://单一操作数据
                type = "lww.cursor.item/net.onest.lww.provider";
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        return type;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //实现插入数据操作
        switch (matcher.match(uri)){
//            case STAR:
            case STARS:
                //获取可写的数据库对象
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                //执行插入操作
                long rowId = db.insert(
                        "StarTB", null, values);
                if(rowId > 0){
                    //插入成功,通知数据改变
                    //通知数据改变
                    getContext().getContentResolver().notifyChange(uri, null);
                    // 拼接Uri和被插入数据的id
                     return ContentUris.withAppendedId(uri, rowId);
                }else{
                    //插入失败
                    return null;
                }
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
    }

    @Override
    public boolean onCreate() {
        dbHelper = new MySqliteHelper(
                getContext(),"StarsDB.db",
                null, 1);
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        Cursor cursor = null;
        //获取可读的数据库对象
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        switch (matcher.match(uri)){
            case STARS://批量查询操作
                //执行查询操作
                cursor = db.query(
                        "StarTB", projection,
                        selection, selectionArgs,
                        null, null,
                        sortOrder);
                break;
            case STAR://单一查询操作 。。。。。。。/../3
                //解析uri中的id
                long id = ContentUris.parseId(uri);
                //重新拼接where条件
                String where = "id = " + id;
                if(null != selection && !"".equals(selection)) {
                    where = where + " and " + selection;
                }
                //获取数据库执行查询操作
                cursor = db.query(
                        "StarDB", projection,
                        where, selectionArgs, null,
                        null, sortOrder);
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        return cursor;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        int n = 0;
        //获取可写的数据库对象
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        switch (matcher.match(uri)){
            case STARS:
                n = db.update(
                        "StarTB", values, selection, selectionArgs);
                break;
            case STAR:
                //获取资源id
                long id = ContentUris.parseId(uri);
                String where = "id = " + id;
                if(null != selection && !"".equals(selection)) {
                    where = where + " and " + selection;
                }
                //执行更新
                n = db.update(
                        "StarTB", values, where, selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        if(n > 0){
            //通知数据改变
            getContext().getContentResolver().notifyChange(uri, null);
        }
        return n;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值