使用contentProvider

Posted ocean123123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用contentProvider相关的知识,希望对你有一定的参考价值。

内部利用contentProvider暴露接口供外部查询删除操作,外部查询删除使用contentResolver,首先使用sqlite创建一个数据库表student,然后使用contentProvider暴露数据,在另一个modle里使用contentResolver解析数据,

public class MainActivity extends AppCompatActivity 

    @Override

    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//contentprovider不用在此创建对象,只要在配置文件里声明就可以执行.输出"创建"证明创建成功,创建只有一次,第二次不会执行oncreate
        //方法,可以在data/data/包名,中找到数据库文件,删除就会重新创建并执行oncreate方法


    

上面是主activity

public class mysqlite extends SQLiteOpenHelper 
    SQLiteDatabase readableDatabase;
    public Mysqlite(Context context) 
        super(context, "student", null, 2);
        readableDatabase = getWritableDatabase();//创建数据库不需要什么权限,但是这行代码一定要写
    

    @Override
    public void onCreate(SQLiteDatabase db) 

        db.execSQL("create table student (id integer,name varchar)");
        System.out.println("创建");
    

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 

    

上面是创建数据库

public class MyContentProvider extends ContentProvider 
    Mysqlite mysqlite;
    SQLiteDatabase sqLiteDatabase;

    private static final UriMatcher uriMatcher;//一定也要静态的才行

    static
         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI("com.january.summer", "student", 0);//表的第一行
        uriMatcher.addURI("com.january.summer", "student", 1);
        uriMatcher.addURI("com.january.summer", "student", 2);
    
    public MyContentProvider() 

    

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) 

        int deleteInt = 0;
        deleteInt = sqLiteDatabase.delete("student", selection, selectionArgs);  //参数1:表名   参数2:约束删除列的名字   参数3:具体行的值
       switch (uriMatcher.match(uri)) 
           case 0:
               deleteInt = sqLiteDatabase.delete("student", selection, selectionArgs);
              System.out.println("删除第一行");
               break;case 1:
               String deleteId = uri.getPathSegments().get(1);
               deleteInt = sqLiteDatabase.delete("student", "id=?", new String[]deleteId);
               System.out.println("删除第二行");
              break;
            case 2:
               sqLiteDatabase.delete("student", selection, selectionArgs);
                System.out.println("删除第三行");
               break;
       
        return deleteInt;


    

    @Override
    public String getType(Uri uri) 
        return null;
    

    @Override
    public Uri insert(Uri uri, ContentValues values) 
        sqLiteDatabase.insert("student", null, values);
       getContext().getContentResolver().notifyChange(uri, null);
        return uri;

    

    @Override
    public boolean onCreate() 
        mysqlite = new Mysqlite(getContext());
        sqLiteDatabase = mysqlite.getWritableDatabase();

        return true;
    


    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) 

        return sqLiteDatabase.query("student", projection, selection, selectionArgs, null, null, null);
        //必须自己实现查询功能,外部程序才可以查询
    

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) 

        return 0;
    

上面是contentProvider

  <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <provider
            android:name=".MyContentProvider"
            android:authorities="com.january.summer"
            android:enabled="true"
            android:exported="true"></provider>


        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

上面是配置文件//

/////////////

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Uri uri = Uri.parse("content://com.january.summer/student");

        ContentValues contentValues = new ContentValues();
        contentValues.put("name", "小明");
        getContentResolver().insert(uri, contentValues);

        Cursor bookCursor = getContentResolver().query(uri, new String[]"id", "name", null, null, null);
        int count = bookCursor.getCount();
        System.out.println("行数"+count);

        getContentResolver().delete(uri, "name=?", new String[]"小明");

        if (bookCursor != null) 
            bookCursor.moveToFirst();
            while (bookCursor.moveToNext()) 
                System.out.println("ID:" + bookCursor.getInt(bookCursor.getColumnIndex("id"))
                        + "      name:" + bookCursor.getString(bookCursor.getColumnIndex("name")));
            
            bookCursor.close();
        




    
    

上面是另一个modle的主activity,每运行一次插入一条数据,插入后游标不一定在第一行,movetofirst让游标移动到第一行前面,此时没有数据,movetonext才到第一行.可以用debug测试看的更清楚

以上是关于使用contentProvider的主要内容,如果未能解决你的问题,请参考以下文章

Android - 将 Dao 模式与 contentProvider 一起使用

为啥 ContentProvider 在 App 更新后返回空游标?

使用 ContentProvider 从联系人获取电话号码 - Android

四大组件之ContentProvider-ContentProvider的权限使用和监听

Android自学之路--ContentProvider

Android - 查询 SMS ContentProvider?