一、自定义的内容提供者
1. 继承 ContentProvider
2. 实现 增 删 改 查 方法 以及 onCreate 方法
3. 制定 Uri 的网址规则,形成特定的功能
4. 四大组件都需要在清单文件注册,来确认内容提供者是否可以被 其他程序访问
5. 内部需要进行数据的操作,增 删 改 查
5.1 确认使用哪种数据类型:SQLite, File, SharedPreferences
5.2 onCreate 方法,需要初始化 通常 DbHelper
5.3 每一个操作的方法,第一个参数都代表了 需要操作的哪一张表。通过Uri来标示;
5.4 使用 UriMatcher 类对象,来进行网址匹配,判断访问那个表
关于 Uri 与 authorities 说明
Uri 就是一个网址
规则: content://<authority>/path
authority 代表的就是 Android 系统中内容提供者的唯一标示,就像服务器的IP地址
清单文件里面声明内容提供者的authority
http://www.baidu.com/images
2.创建数据库
1. 继承 ContentProvider
2. 实现 增 删 改 查 方法 以及 onCreate 方法
3. 制定 Uri 的网址规则,形成特定的功能
4. 四大组件都需要在清单文件注册,来确认内容提供者是否可以被 其他程序访问
5. 内部需要进行数据的操作,增 删 改 查
5.1 确认使用哪种数据类型:SQLite, File, SharedPreferences
5.2 onCreate 方法,需要初始化 通常 DbHelper
5.3 每一个操作的方法,第一个参数都代表了 需要操作的哪一张表。通过Uri来标示;
5.4 使用 UriMatcher 类对象,来进行网址匹配,判断访问那个表
关于 Uri 与 authorities 说明
Uri 就是一个网址
规则: content://<authority>/path
authority 代表的就是 Android 系统中内容提供者的唯一标示,就像服务器的IP地址
清单文件里面声明内容提供者的authority
http://www.baidu.com/images
http://www.baidu.com/news
二、创建自定义内容提供者
public class MyProvider extends ContentProvider {
private MyDbHelper mMyDbHelper;
public static final int CODES_CODE = 1;
public static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(0);
uriMatcher.addURI("*","codes",CODES_CODE);
}
public MyProvider() {
}
@Override
public boolean onCreate() {
mMyDbHelper = new MyDbHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor ret = null;
SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
int code = uriMatcher.match(uri);
switch (code) {
case CODES_CODE:
ret = database.query("codes",projection,selection,selectionArgs,null,null,sortOrder);
break;
}
return ret;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int index = 0;
SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
int code = uriMatcher.match(uri);
switch (code) {
case CODES_CODE:
index = database.delete("codes",selection,selectionArgs);
break;
}
database.close();
return index;
}
@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 ret = null;
SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
int codes = uriMatcher.match(uri);
switch (codes) {
case CODES_CODE:
long index = database.insert("codes", null, values);
ret = ContentUris.withAppendedId(uri,index);
break;
}
database.close();
return ret;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int index = 0;
SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
int code = uriMatcher.match(uri);
switch (code) {
case CODES_CODE:
index = database.update("codes", values, selection, selectionArgs);
break;
}
database.close();
return index;
}
}
2.创建数据库
MyDbHelper.java
public class MyDbHelper extends SQLiteOpenHelper {
public static final String CODE_MANGER ="create table codes (" +
"_id integer primary key autoincrement," +
"title varchar," +
"webView varchar," +
"user varchar," +
"pass varchar," +
"remark long," +
"update_t long)";
public MyDbHelper(Context context){
super(context,"manger",null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CODE_MANGER);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//db.execSQL("alter table income add column type integer default 0");
if (newVersion ==2){
db.execSQL("alter table codes add column update_t long default 0");
}
}
}
3.Activity调用数据库的数据
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener {
private TextView mTitle;
private TextView mUser;
private SimpleCursorAdapter mAdapter;
private ListView mListView;
private Cursor cursor;
private SQLiteDatabase mDatabase;
private ContentResolver mResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// MyDbHelper helper = new MyDbHelper(this);
// mDatabase = helper.getWritableDatabase();
mTitle = (TextView) findViewById(R.id.db_title);
mUser = (TextView) findViewById(R.id.db_username);
mResolver = getContentResolver();
Uri uri = Uri.parse("content://abc/codes");
cursor = mResolver.query(uri, null, null, null, "remark desc");
if (cursor != null){
mAdapter = new SimpleCursorAdapter(this,
R.layout.db_item,cursor,
new String[]{"title","user"},
new int[]{R.id.db_title,R.id.db_username},
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
mListView = (ListView) findViewById(R.id.main_list);
RequeryData();
mListView.setAdapter(mAdapter);
mListView.setOnItemLongClickListener(this);
mListView.setOnItemClickListener(this);
}
}
// @Override
// protected void onStart() {
// super.onStart();
// RequeryData();
// }
@Override
protected void onResume() {
super.onResume();
RequeryData();
}
private void RequeryData() {
Uri uri = Uri.parse("content://abc/codes");
cursor = mResolver.query(uri, null, null, null, "remark desc");
mAdapter.changeCursor(cursor);
//mAdapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_item,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_edit:
Toast.makeText(MainActivity.this, "edit被点击", Toast.LENGTH_SHORT).show();
int id = cursor.getColumnIndex("_id");
break;
case R.id.action_add:
Toast.makeText(MainActivity.this, "add被点击了", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, EditActivity.class);
startActivity(intent);
break;
}
return true;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(this,EditActivity.class);
intent.putExtra("_id",id);
startActivity(intent);
return true;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(this, InfoActivity.class);
intent.putExtra("_id", id);
startActivity(intent);
}
}