zoukankan      html  css  js  c++  java
  • 初学android:四大组件之contentprovider

    一、ContentProvider的概念
    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);
    }
    }
  • 相关阅读:
    接口调试之Postman 使用方法详解
    用Vue2仿京东省市区三级联动效果
    高德地图JS API获取经纬度,根据经纬度获取城市
    js 格式化数字,格式化金额:
    CSS Media媒体查询使用大全,完整媒体查询总结
    最新手机号正则表达式 java 、javascript版正则表达式验证是否为11位有效手机号码
    JavaScript 实现textarea限制输入字数, 输入框字数实时统计更新,输入框实时字数计算移动端bug解决
    在上线项目中,用Vue写一个星级评价
    new Date()设置日期在IOS的兼容问题
    javascript 省市区三级联动 附: json数据
  • 原文地址:https://www.cnblogs.com/hsshy/p/4920241.html
Copyright © 2011-2022 走看看