初学android:四大组件之contentprovider
2015-10-29 13:31
435 查看
一、ContentProvider的概念
ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
1、ContentProvider使用表的形式来组织数据
无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法,且需要复写
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中
开始动手:
首先android四大组件都需要注册,在AndroidManifest.xml进行注册
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
1.操作数据库
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")//person表名
注意点:
访问另一个程序的数据时,要保证另一个程序是运行的。
另一个程序:
ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
1、ContentProvider使用表的形式来组织数据
无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法,且需要复写
public boolean onCreate()
public String getType(Uri uri) //返回当前Uri的MIME类型,如果该Uri对应的数据可能包括多条记录 //那么MIME类型字符串,就是以vnd.android.dir/开头 //如果该Uri对应的数据只有一条记录,该MIME类型字符串,就是以vnd.android.cursor.item/开头
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) //根据Uri查询出selection指定的条件所匹配的全部记录,同时可以指定查询哪些列,并且以什么方式排列(sortOrder)
public int delete(Uri uri,String selection,String[] selectionArgs)//根据Uri删除selection指定的条件所匹配的全部记录
public Uri insert(Uri uri,ContentValues values)//根据Uri插入Values对应的数据
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)//根据Uri插入Values对应的数据
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中
开始动手:
首先android四大组件都需要注册,在AndroidManifest.xml进行注册
<provider android:name=".DateProvider" android:authorities="se_content_provider"//唯一 android:exported="true" > contentprovider匹配涉及到Uri 先记录下什么是Uri 图片来源于网络:
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
1.操作数据库
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")//person表名
注意点:
访问另一个程序的数据时,要保证另一个程序是运行的。
package se08.edu.com.example.hxdn.softwareengineeringdate;
import android.content.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
/**
* Created by hxdn on 2015/10/28.
*/
public class DateProvider extends ContentProvider {
public static final int NOTES=1;
public static final int NOTE_ID=2;
public static final String AUTHORITY="se_content_provider";
public static final String TABLE_NAME="txl";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);
public static UriMatcher sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
private DatabaseHelper databaseHelper;
private SQLiteDatabase db;
static
{
sUriMatcher.addURI(AUTHORITY,TABLE_NAME,NOTES);
sUriMatcher.addURI(AUTHORITY,TABLE_NAME+"/#",NOTE_ID);
}
@Override
public boolean onCreate()//在ContentProvider创建后被调用
{
databaseHelper=new DatabaseHelper(getContext());
return true;
}
@Override
public String getType(Uri uri) //返回当前Uri的MIME类型,如果该Uri对应的数据可能包括多条记录 //那么MIME类型字符串,就是以vnd.android.dir/开头 //如果该Uri对应的数据只有一条记录,该MIME类型字符串,就是以vnd.android.cursor.item/开头
{
return null;
}
@Override
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) //根据Uri查询出selection指定的条件所匹配的全部记录,同时可以指定查询哪些列,并且以什么方式排列(sortOrder)
{
Log.i("AAA","sada");
db=databaseHelper.getReadableDatabase();
Cursor cursor=null;
switch (sUriMatcher.match(uri))
{
case NOTES:
break;
case NOTE_ID:
Log.i("AAA","草2");
cursor=db.rawQuery("select * from txl",null);
break;
default:
Log.i("AAA","无匹配");
}
return cursor;
}
@Override
public int delete(Uri uri,String selection,String[] selectionArgs)//根据Uri删除selection指定的条件所匹配的全部记录
{
return 0;
}
@Override
public Uri insert(Uri uri,ContentValues values)//根据Uri插入Values对应的数据
{
return null;
}
@Override//根据Uri插入Values对应的数据
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)
{
return 0;
}
}
另一个程序:
package edu.se08.duan_xin; import android.database.Cursor; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Uri uri=Uri.parse("content://se_content_provider/txl/20"); Cursor cursor=getContentResolver().query(uri, null, null, null, null); Log.i("AAA", cursor.getCount() + "记录数"); while (cursor!=null&&cursor.moveToNext()) { Log.i("AAA",cursor.getCount()+"记录数"); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
相关文章推荐
- Android:ListView 使用 viewholder 性能优化(Listview工作原理)
- BaseExpandableListAdapter分类绑定的实现
- Android学习之剪贴板操作
- scrollview自适应listview的四种方案
- 【FastDev4Android框架开发】AndroidAnnnotations注入框架使用之注入组件Components(九)
- android:scaleType属性
- android:descendantFocusability用法简析(listview的item点击无响应问题)
- android隐藏标题栏后影响样式的解决方案
- android studio 导入so文件出现的问题AND[android]复制 APK 许可证 (同一文件) 中的重复文件
- android模拟器root,avd root,emulator root教程
- Android编程实现的重力感应示例代码
- Android多媒体录制--MediaRecorder视频录制
- android布局属性详解
- Android学习之任务与返回栈
- android处理url中的特殊字符
- Android编程中图片特效处理方法小结
- Android四大组件之Service(服务)
- Android中进程级别分类
- Android中Activity常用功能设置小结(包括全屏、横竖屏等)
- android-仿iOS弹出框