博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
A左右ndroid正在使用Uri监视数据库中的更改
阅读量:6964 次
发布时间:2019-06-27

本文共 12490 字,大约阅读时间需要 41 分钟。

    在监控数据库在线原创文章是非常小的变化,基本上没有找到一个实际的问题。所以,如果你看到一个有点蓝牙源代码,写一个Demo。在这里,供大家参考,查看源代码:

    src有三个文件MyDataProvider、MainActivity和MyBean。看以下:

    MyDataProvider.java:

   

public class MyDataProvider extends ContentProvider{    // public static final String SCHEME = "test";    public static final String SCHEME = "content"; // 源代码里面规定这样写,所以这个地方改变不了    public static final String HOST = "com.zyj";    public static final String PORT = "497393102";    public static final String PATH = "simple";    public static final int ALARMS = 1;    public static final String SHARE_LIST_TYPE = "com.zyj.test.dir/";    public static final int ALARMS_ID = 2;    public static final String SHARE_TYPE = "com.zyj.test.item/";    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);    private SQLiteOpenHelper mDB = null;    // ===content://com.zyj:497393102/simple    public static final Uri CONTENT_URI = Uri.parse(SCHEME + "://" + HOST + ":" + PORT + "/" + PATH);    // 加入Uri的匹配方式,返回的就是上面自己定义的整数类型。1代表操作的是一个批量,2操作的是单独的一个对象    static    {        sURIMatcher.addURI(HOST + ":" + PORT, PATH, ALARMS);        sURIMatcher.addURI(HOST + ":" + PORT, PATH + "/#", ALARMS_ID);    }    @Override    public boolean onCreate()    {        mDB = new MyDB(getContext()); // 获取数据库的引用        return mDB != null;    }    @Override    public String getType(Uri uri)    {        // 得到我们自己定义的Uri的类型。看上面你自己的定义        int match = sURIMatcher.match(uri);        switch (match)        {            case ALARMS:            {                return SHARE_LIST_TYPE;            }            case ALARMS_ID:            {                return SHARE_TYPE;            }            default:            {                throw new IllegalArgumentException("Unknown URI: " + uri);            }        }    }    @Override    public Uri insert(Uri uri, ContentValues values)    {        // 首先是看Uri和我们自己定义的是否匹配。,匹配则将数据属性插入到数据库中并同志更新        SQLiteDatabase db = mDB.getWritableDatabase();        if (sURIMatcher.match(uri) != ALARMS)        {            throw new IllegalArgumentException("Unknown/Invalid URI " + uri);        }        ContentValues filteredValues = new ContentValues();        filteredValues.put(MyDB.BEAN_ID, values.getAsInteger(MyDB.BEAN_ID));        filteredValues.put(MyDB.MESSAGE, values.getAsString(MyDB.MESSAGE));        filteredValues.put(MyDB.TASK_PROGRESS, values.getAsFloat(MyDB.TASK_PROGRESS));        long rowID = db.insert(MyDB.TABLET, null, filteredValues);        if (rowID != -1)        {            getContext().getContentResolver().notifyChange(uri, null);        }        return CONTENT_URI;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs)    {        // 首先是看Uri和我们自己定义的是否匹配,,匹配则进行删除        SQLiteDatabase db = mDB.getWritableDatabase();        int count = 0;        int match = sURIMatcher.match(uri);        switch (match)        {            case ALARMS:            case ALARMS_ID:                String where = null;                // 这里对selection进行匹配操作,看你传递的是一个批量还是一个单独的文件                if (selection != null)                {                    if (match == ALARMS)                    {                        where = "( " + selection + " )";                    }                    else                    {                        where = "( " + selection + " ) AND ";                    }                }                else                {                    where = "";                }                if (match == ALARMS_ID)                {                    // 假设你传递的是一个单独的文件,也就是Uri后面加入了/item的,那么在这里把该值与数据库中的属性段进行比較,返回sql语句中的where                    String segment = uri.getPathSegments().get(1);                    long rowId = Long.parseLong(segment);                    where += " ( " + MyDB.BEAN_ID + " = " + rowId + " ) ";                }                count = db.delete(MyDB.TABLET, where, selectionArgs);                break;            default:                throw new UnsupportedOperationException("Cannot delete URI: " + uri);        }        getContext().getContentResolver().notifyChange(uri, null);        return count;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)    {        // 基本同上了        SQLiteDatabase db = mDB.getWritableDatabase();        int count;        long rowId = 0;        int match = sURIMatcher.match(uri);        switch (match)        {            case ALARMS:            case ALARMS_ID:            {                String myWhere;                if (selection != null)                {                    if (match == ALARMS)                    {                        myWhere = "( " + selection + " )";                    }                    else                    {                        myWhere = "( " + selection + " ) AND ";                    }                }                else                {                    myWhere = "";                }                if (match == ALARMS_ID)                {                    String segment = uri.getPathSegments().get(1);                    rowId = Long.parseLong(segment);                    myWhere += " ( " + MyDB.BEAN_ID + " = " + rowId + " ) ";                }                if (values.size() > 0)                {                    count = db.update(MyDB.TABLET, values, myWhere, selectionArgs);                }                else                {                    count = 0;                }                break;            }            default:            {                throw new UnsupportedOperationException("Cannot update URI: " + uri);            }        }        getContext().getContentResolver().notifyChange(uri, null);        return count;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)    {        SQLiteDatabase db = mDB.getReadableDatabase();        SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); //SQLiteQueryBuilder是一个构造SQL查询语句的辅助类        int match = sURIMatcher.match(uri);        switch (match)        {            case ALARMS:            {                qb.setTables(MyDB.TABLET);                break;            }            case ALARMS_ID:            {                qb.setTables(MyDB.TABLET);                qb.appendWhere(MyDB.BEAN_ID + "=");                qb.appendWhere(uri.getPathSegments().get(1));                break;            }            default:                throw new IllegalArgumentException("Unknown URI: " + uri);        }        Cursor ret = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);        if (ret != null)        {            ret.setNotificationUri(getContext().getContentResolver(), uri);            Log.d("zyj", "created cursor " + ret + " on behalf of ");        }        else        {            Log.d("zyj", "query failed in downloads database");        }        return ret;    }    private static class MyDB extends SQLiteOpenHelper    {        // 这里就是数据库了,数据库字段、名称、表名等...        private static final String DATABASE = "test_database";        public static final String TABLET = "test_table";        public static String ID = "_id";        public static String BEAN_ID = "_bean_id";        public static String MESSAGE = "_message";        public static String TASK_PROGRESS = "_progress";        private SQLiteDatabase mDB = null;        private final String msql = "CREATE TABLE IF NOT EXISTS " + TABLET + "( " + ID                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + BEAN_ID + " TEXT, " + MESSAGE + " TEXT, " + TASK_PROGRESS                + " TEXT )";        private MyDB(Context context)        {            super(context, DATABASE, null, 1);        }        @Override        public void onCreate(SQLiteDatabase db)        {            mDB = db;            mDB.execSQL(msql);        }        @Override        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)        {            // 升级。自己能够去实现        }    }}

    MyBean.java一个实例对象

   

public class MyBean{    public int id = 0;        public String message = null;    public float progress = 0.0f;    public MyBean(int id)    {        this.id = id;    }    }

     MainActivity.java主界面了

    

public class MainActivity extends Activity{    TextView mMessage = null;    private ContentObserver mDatabaseListener = null;    private Handler mHand = null;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mMessage = (TextView) findViewById(R.id.message);        init();        // 注冊数据库的监听。相应的是特定的Uri        getContentResolver().registerContentObserver(MyDataProvider.CONTENT_URI, true, mDatabaseListener);    }    @Override    protected void onDestroy()    {        super.onDestroy();        // 注销掉监听        getContentResolver().unregisterContentObserver(mDatabaseListener);    }    private void init()    {        mHand = new Handler();        // 数据库变动时的回调        mDatabaseListener = new ContentObserver(mHand)        {            @Override            public boolean deliverSelfNotifications()            {                System.out.println("deliverSelfNotifications ---------------- ");                return super.deliverSelfNotifications();            }            @Override            public void onChange(boolean selfChange, Uri uri)            {                System.out.println("onChange ---------------- " + uri.toString());                super.onChange(selfChange, uri);            }            @Override            public void onChange(boolean selfChange)            {                System.out.println("onChange ---------------- ...");                super.onChange(selfChange);            }        };    }    private int count = 0;    public void onViewClick(View view)    {        switch (view.getId())        {            case R.id.add:                // 插入数据                ContentValues calues = new ContentValues();                calues.put("_bean_id", count++);                calues.put("_message", "AAAAAAAAAAAAAAAAAAAAA");                calues.put("_progress", 0.0f);                getContentResolver().insert(MyDataProvider.CONTENT_URI, calues);                break;            case R.id.del:                // 假设找不到指定的_bean_id=1、2、3的,则数据库不进行增减。但还是会调用回调方法                getContentResolver().delete(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/1"), null, null);                getContentResolver().delete(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/2"), null, null);                getContentResolver().delete(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/3"), null, null);                break;            case R.id.modify:                ContentValues values = new ContentValues();                values.put("_message", "ZZZZZZZZZZZZZZZZZZZZZ");                // 这两中方法一样,这样就能够更加明确Uri中在后面加入的/item了数字的意思了                getContentResolver()                        .update(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/5"), values, null, null);                getContentResolver().update(MyDataProvider.CONTENT_URI, values, "_bean_id=?

", new String[] { "6" }); break; case R.id.query: showMessage(getContentResolver().query(MyDataProvider.CONTENT_URI, null, null, null, null)); break; } } private void showMessage(Cursor c) { if (c == null) { return; } final StringBuffer sb = new StringBuffer(); if (c.getCount() > 0) { while (c.moveToNext()) { MyBean bean = new MyBean(c.getInt(c.getColumnIndex("_bean_id"))); bean.message = c.getString(c.getColumnIndex("_message")); bean.progress = c.getFloat(c.getColumnIndex("_progress")); sb.append(bean.id + "\t\t\t:" + bean.message + "\t\t\t,progress = " + bean.progress + "\n"); } } c.close(); mHand.post(new Runnable() { public void run() { mMessage.setText(sb.toString()); } }); } }

    activity_main.xml    上面就是四个button,以下就是一个TextView显示控件

    最后就是AndroidManifest.xml了。和平时一样的,仅仅只是在里面将你自定义的ContentProvider写上,类似我的这样:

    <provider

            android:name="com.example.databasetest.MyDataProvider"
            android:authorities="com.zyj:497393102" />
    上面的authorities属性是一定要写的。它就是上面MyDataProvider.java里面的CONTENT_URI的HOST + ":" + PORT,能够看以下画的。就比較清楚了。

    content://com.example.project:200/folder/subfolder/etc

    \---------/  \---------------------------/ \---/ \--------------------------/
    scheme                 host               port        path
                    \--------------------------------/
                              authority   

    然后就没有了,能够自己执行,感受一下Uri和数据库的监听。

    有错误我希望你能来部出,谢谢!!

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
HDU Problem 4006 The kth great number 【队列】
查看>>
win8阉割版中文输入法
查看>>
Codeforces VK Cup 2015 A.And Yet Another Bracket Sequence(后缀数组+平衡树+字符串)
查看>>
以Drools5.5为例说明“规则引擎在业务系统中应用”---起始篇
查看>>
linux清理内存
查看>>
查看硬盘负载情况:iostat命令
查看>>
《人月神话》阅读笔记03
查看>>
Linux下防火墙开启相关端口及查看已开启端口
查看>>
学习笔记之CloudCompare
查看>>
UEditor 与Struts2 结合上传图片
查看>>
javaweb中的标签的核心标签库的常用标签
查看>>
copy与mutableCopy
查看>>
C#中结构函数和析构函数的用法
查看>>
CC2540串口输出调试功能
查看>>
malloc calloc realloc,new区别联系以及什么时候用
查看>>
php socket 编程(一)
查看>>
SDUT 简单枚举类型——植物与颜色
查看>>
Windows 下配置Git
查看>>
HTML5触摸事件(touchstart、touchmove和touchend)
查看>>
Vue项目中的mock数据
查看>>