今天学习的时候学到了ContentProvider数据共享这个东东,所以自己写了个小例子:

我们要开发ContentProvider的话,需要创建一个类去继承ContentProvider,里面会让你重写四个方法,这四个方法就是数据共享用到的方法

包括SQLite的插入、查询、删除。。

所以,如何共享我们的数据,就看你如何重写这几个方法。

下面是操作步骤,我是用Android studio写的

1、先看工程结构

2、我们建立一个继承ContentProvider的类,创建步骤(右键→new→othet→Provider)

3、ContentProvider共享的数据是SQLite里面的数据,为了方便我把创建SQLite的数据库和创建表的操作也写在了ContentProvider的onCreate()方法里面了

代码

package provider;

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 toolclass.MySQLiteOpenHelper; public class MyContentProvider extends ContentProvider { private static final String AUTHORITY = "com.example.fanlei.mycontentprovider";//地址
private static final String DB_FILE = "friends.db";//数据库名称
private static final String DB_TABLE = "friends"; //表名
private static final int URI_ROOT = -1;
private static final int DB_TABLE_FRIENDS = 1;
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + DB_TABLE);//Uri所对应的资源
private static final UriMatcher uriMatcher = new UriMatcher(URI_ROOT);//检查传过来的Uri
static {
uriMatcher.addURI(AUTHORITY,DB_TABLE,DB_TABLE_FRIENDS);
}
private MySQLiteOpenHelper helper;
private SQLiteDatabase db; public MyContentProvider() { } @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// Implement this to handle requests to delete one or more rows.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public String getType(Uri uri) {
// TODO: Implement this to handle requests for the MIME type of the data
// at the given URI.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public Uri insert(Uri uri, ContentValues values) {
//检查传过来的Uri是否是正确的,若不正确,则抛出异常
if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){
throw new IllegalArgumentException("Unknown URI:" + uri);
}
Long rawId = db.insert(DB_TABLE,null,values);
Uri returnUri = ContentUris.withAppendedId(CONTENT_URI,rawId);
getContext().getContentResolver().notifyChange(returnUri,null);
return returnUri;
} @Override
public boolean onCreate() {
helper = new MySQLiteOpenHelper(getContext(),DB_FILE,null,1);
db = helper.getWritableDatabase();
String sql = "CREATE TABLE IF NOT EXISTS " + DB_TABLE +"(" +
"_id primary key," +
"name text," +
"sexId text," +
"address text);";
db.execSQL(sql);
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//检查传过来的Uri是否是正确的,若不正确,则抛出异常
if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){
throw new IllegalArgumentException("Unknown URI:" + uri);
}
Cursor cursor = db.query(true,DB_TABLE,projection,selection,selectionArgs,null,null,sortOrder,null);
cursor.setNotificationUri(getContext().getContentResolver(),uri);
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.
throw new UnsupportedOperationException("Not yet implemented");
}
}

其实,ContentProvider里面重写的方法也是封装了SQLiteDataBase的方法的操作,只不过他需要一个具体的Uri去指向我们具体的资源。

ContentProvider开发完成后,我在主函数里面调用了我们写的这个ContentProvider里面的方法,布局什么的都很简单。

我只是插入了数据,查询数据

下面是主函数:

package com.example.fanlei.mycontentproviderdemo;

import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import provider.MyContentProvider; public class MainActivity2 extends ActionBarActivity { private ContentResolver contentResolver;
private Uri uri; private EditText et_1,et_2,et_3;
private Button btn_1,btn_2; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity2);
contentResolver = getContentResolver();
uri = MyContentProvider.CONTENT_URI; et_1 = (EditText) findViewById(R.id.et_1);
et_2 = (EditText) findViewById(R.id.et_2);
et_3 = (EditText) findViewById(R.id.et_3); btn_1 = (Button) findViewById(R.id.btn_1);
btn_2 = (Button) findViewById(R.id.btn_2);
//加入
btn_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentValues cv = new ContentValues();//键值 就是 列名
cv.put("name",et_1.getText().toString());
cv.put("sexId",et_2.getText().toString());
cv.put("address",et_3.getText().toString()); contentResolver.insert(uri,cv);
Toast.makeText(MainActivity2.this,"加入成功",Toast.LENGTH_SHORT).show();
}
});
//查询
btn_2.setOnClickListener(new View.OnClickListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onClick(View v) {
Cursor cursor = contentResolver.query(uri,null,"name like ?",new String[]{"%23%"},null,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sexId = cursor.getString(cursor.getColumnIndex("sexId"));
String address = cursor.getString(cursor.getColumnIndex("address")); Log.d("asdasd",name+"^^"+sexId+"^^"+address); }
}
});
}
}

====================================以上是简单的开发=======================================

下面是使用我们上面的工程创建的ContentProvider

先看工程结构:

我这里建立了一个工具类去存放上一个工程Uri。

布局什么的都很简单,就一个TextView和Button,就不放了。

下面是主函数的代码

package com.example.fanlei.textmycontentproviderdemo;

import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import provider.PeopleInfoProvider; public class MainActivity extends ActionBarActivity { private TextView tv_show;
private Button button; private ContentResolver contentResolver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver(); tv_show = (TextView) findViewById(R.id.tv_show);
button = (Button) findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);
StringBuilder sb = new StringBuilder();
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sexId = cursor.getString(cursor.getColumnIndex("sexId"));
String address = cursor.getString(cursor.getColumnIndex("address"));
sb.append(name).append(sexId).append(address);
}
tv_show.setText(sb.toString());
}
}); contentResolver.registerContentObserver(PeopleInfoProvider.CONTENT_URI,true,new MyObserver(new Handler()));
} private class MyObserver extends ContentObserver{
/**
* Creates a content observer.
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public MyObserver(Handler handler) {
super(handler);
} @Override
public void onChange(boolean selfChange) {
super.onChange(selfChange); Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);
StringBuilder sb = new StringBuilder();
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sexId = cursor.getString(cursor.getColumnIndex("sexId"));
String address = cursor.getString(cursor.getColumnIndex("address"));
sb.append(name).append(sexId).append(address);
Log.d("-----update----",sb.toString());
}
tv_show.setText(sb.toString());
}
}
}

对了,这里我写了一个内部类去继承了ContentObserver这个类,它的作用就是当共享的数据发生改变时,就会触发这个方法。

Android--简单开发和使用ContentProvider数据共享的更多相关文章

  1. Android简单开发的画画板

    Android开发画画板要考虑得几个问题如下: 1 屏幕画板.画笔如何绘制问题 2 用户手指触摸屏幕画板监听事件,以及对应的几种状态处理问题 3  保存图片到SD卡,以及在系统相册打开时自动加载刚才的 ...

  2. Android简单开发之 通用Adapter ViewHolder

    我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...

  3. Android项目开发全程(二)--Afinal用法简单介绍

    本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...

  4. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...

  5. Android软件安全开发实践(下)

    Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你 ...

  6. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  7. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  9. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

随机推荐

  1. memcached学习(5). memcached的应用和兼容程序

    mixi在提供服务的初期阶段就使用了memcached. 随着网站访问量的急剧增加,单纯为数据库添加slave已无法满足需要,因此引入了memcached. 此外,我们也从增加可扩展性的方面进行了验证 ...

  2. Add, remove, shuffle and sort

    To deal cards, we would like a method that removes a card from the deck and returns it. The list met ...

  3. 写给自己的Java程序员学习路线图

    恩,做开发的工作已经三年多了,说起来实在是惭愧,自己的知识树还像一棵小草一样,工作中使用到了许多的知识和技术,不过系统性不够.根基不牢.并且不够深入!当然,慢慢的我也更加的清楚,我需要学习一些什么样的 ...

  4. Calendar的add()方法介绍

    [java] view plaincopy public static Date addYears(Date date, int amount) { return add(date, 1, amoun ...

  5. Java Annotation 机制源码分析与使用

    1 Annotation 1.1 Annotation 概念及作用      1.  概念 An annotation is a form of metadata, that can be added ...

  6. Sql2008 php

    Sql2008支持php的擴展插件 http://www.microsoft.com/download/en/search.aspx?q=SQL+Server+for+PHP  全部 http://w ...

  7. Transaction 'IREG', Abend 'APCT', at '????'.

    应用的问题: Transactions can fail with an APCT abend, when there is a failure in a transaction attempting ...

  8. 蘑菇街iOS客户端应用源码

    蘑菇街iOS客户端应用源码 随着蘑菇街由导购向电商转型,蘑菇街自己的IM也应运而生,IM起初只是用于商家和买家之间沟通的工具.后面我们问自己,既然已经有了用于客服的IM,为什么不自己做一个IM,用于公 ...

  9. url中文参数解决方案

    首先,弄清楚为什么url传递中文会转码或者乱码,以及http头 contentType="text/html; charset=GBK" 的作用. html代码会经过web服务器, ...

  10. [原]POJ1141 Brackets Sequence (dp动态规划,递归)

    本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ...