前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android使用内容提供者实现增删改查操作

Android使用内容提供者实现增删改查操作

作者头像
Dream城堡
发布2019-02-27 16:37:56
9030
发布2019-02-27 16:37:56
举报
文章被收录于专栏:Spring相关Spring相关

Android使用内容提供者实现增删改查操作

这里需要建立两个项目:SiYouShuJuKu(使用内容提供者暴露相关的操作),DQDYGApplication(使用内容解析者对第一个应用进行相关的解析)

A.第一个项目:SiYouShuJuKu

结构图如下:

image

AccountProvider:
代码语言:javascript
复制
package com.demo.siyoushujuku;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class AccountProvider extends ContentProvider {
    //1.定义一个urimatcher 定义路径匹配器
    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    private static final int QUERYSUCCESS = 0;
    private static final int INSERTSUCCESS = 1;
    private static final int UPDATESUCCESS = 2;
    private static final int DELETESUCCESS = 3;

    private MyOpenHelper myOpenHelper;

//    c+s+U 变大写

    //2.定义静态代码块 添加匹配规则
    static {
        /**
         * authority:
         * 要和你在清单文件定义的一样
         *
         * uri:http://com.provider/query
         *
         *
         */

        sURIMatcher.addURI("com.provider", "query", QUERYSUCCESS);
        sURIMatcher.addURI("com.provider", "insert", INSERTSUCCESS);
        sURIMatcher.addURI("com.provider", "update", UPDATESUCCESS);
        sURIMatcher.addURI("com.provider", "delete", DELETESUCCESS);

        //3.写一个静态代码块 添加匹配规则

    }


    @Override
    public boolean onCreate() {
        myOpenHelper = new MyOpenHelper(getContext());
        return false;
    }


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

        int code = sURIMatcher.match(uri);
        if (code == QUERYSUCCESS) {

            //说明路径匹配成功
            // 把query方法实现一下 数据库查询 对数据库进行查询 想操作数据库
            SQLiteDatabase db = myOpenHelper.getReadableDatabase();

            Cursor cursor = db.query("info", projection, selection, selectionArgs,
                    null, null, sortOrder
            );

            //注意cursor不能关 在这里
            return cursor;

        } else {
            //路径不匹配
            throw new IllegalArgumentException("哥们:您的路径不匹配 ,请检查路径");

        }


//        return null;
    }

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

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code = sURIMatcher.match(uri);

        if(code == INSERTSUCCESS){

            //操作数据库
            SQLiteDatabase db = myOpenHelper.getReadableDatabase();

            //代表新插入行数的id
            long insert = db.insert("info", null, values);

            Uri uri2 = Uri.parse("com.insert/"+insert);

            System.out.println("insert==>"+insert);

            return uri2;

        }else{
            //路径不匹配
            throw new IllegalArgumentException("姐们:您的路径不匹配 ,请检查路径");
        }


    }

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

        int code = sURIMatcher.match(uri);

        if(code == DELETESUCCESS){

            //说明路径匹配成功,对数据库进行删除的操作
            SQLiteDatabase db = myOpenHelper.getReadableDatabase();

            //这里代表影响的行数
            int delete = db.delete("info", selection, selectionArgs);

            return delete;
        }else{
            //路径不匹配
            throw new IllegalArgumentException("姐们:您的路径不匹配 ,请检查路径");
        }
    }

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

        int code = sURIMatcher.match(uri);

        if(code == UPDATESUCCESS){
            //说明路径匹配成功,对数据库进行删除的操作
            SQLiteDatabase db = myOpenHelper.getReadableDatabase();
            //这里代表影响的行数
            int update = db.update("info", values,selection, selectionArgs);

            return update;
        }else{
            //路径不匹配
            throw new IllegalArgumentException("姐们:您的路径不匹配 ,请检查路径");
        }



    }
}
MainActivity:
代码语言:javascript
复制
package com.demo.siyoushujuku;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyOpenHelper myOpenHelper = new MyOpenHelper(getApplicationContext());
        SQLiteDatabase db = myOpenHelper.getReadableDatabase();

        Cursor cursor = db.query("info", null, null, null, null, null,
                null
        );

        if (cursor!=null&&cursor.getCount()>0){
            while (cursor.moveToNext()){

                String name = cursor.getString(1);
                String phone = cursor.getString(2);
                System.out.println("name==>"+name+"   phone==>"+phone);

            }


        }
    }
}
MyOpenHelper:
代码语言:javascript
复制
package com.demo.siyoushujuku;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper  extends SQLiteOpenHelper {

    public MyOpenHelper( Context context,  String name,  SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public MyOpenHelper(Context context) {
        super(context, "Account.db", null, 1);
    }

    /**
     * 数据库的名字
     *
     */

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
        db.execSQL("insert into info(name,money) values(?,?)", new String[]{"张三","5000"});
        db.execSQL("insert into info(name,money) values(?,?)", new String[]{"李四","3000"});
    }

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

    }
}
AndroidManifest.xml:
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.demo.siyoushujuku">

    <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">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <!--内容提供者-->
        <provider
            android:authorities="com.provider"
            android:name=".AccountProvider"
            android:exported="true"

            >

        </provider>


    </application>

</manifest>
B.第一个项目:DQDYGApplication

结构图如下:

image

MainActivity:
代码语言:javascript
复制
package com.demo.dqdygapplication;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

/**
 * 内容提供者吧数据进行封装 然后提供出来 其他应用都是
 * 通过内容解析者来访问
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyOpenHelper myOpenHelper = new MyOpenHelper(getApplicationContext());
        //需求 读取第一个应用私有数据库
        /**
         * path路径 accound.db
         *
         * factory:游标工厂
         *
         * flages:访问模式
         *
         */

//        SQLiteDatabase db = myOpenHelper.getReadableDatabase();

        SQLiteDatabase db = SQLiteDatabase.openDatabase(
                "/data/data/com.demo.dqdygapplication/databases/Account.db",
                null, SQLiteDatabase.OPEN_READWRITE
        );


        Cursor cursor = db.query("info", null,
                null, null,
                null, null,
                null
        );



        //由于数据库由第一个内容提供者暴露出来了 所以我们来解析即可

        //1.拿到内容的解析者
        Uri uri = Uri.parse("content://com.provider/query"); //路径和你定义的路径一样

        Cursor cursor1 = getContentResolver().query(uri, null, null,
                null, null
        );

        if (cursor1 != null && cursor1.getCount() > 0) {
            while (cursor.moveToNext()) {
                String name = cursor.getString(1);
                String phone = cursor.getString(2);
                System.out.println("第二个应用:name==>" + name + "   phone==>" + phone);
            }

        }
    }

    //增加
    public void click1(View view) {
        Uri uri = Uri.parse("content://com.provider/insert"); //路径和你定义的路径一样

        ContentValues values = new ContentValues();


        //key 对应表的字段 value的对应值
        values.put("name","zhaoliu");
        values.put("money",11111);


        Uri insert = getContentResolver().insert(uri, values);
        System.out.println("insert==>"+insert);





    }

    //删除
    public void click2(View view) {

        Uri uri = Uri.parse("content://com.provider/delete"); //路径和你定义的路径一样
        int delete = getContentResolver().delete(uri, "name=?", new String[]{"zhaoliu"});

        Toast.makeText(getApplicationContext(),"删除了"+delete+"行",Toast.LENGTH_LONG).show();


    }

    //修改
    public void click3(View view) {

        Uri uri = Uri.parse("content://com.provider/update"); //路径和你定义的路径一样

        ContentValues values = new ContentValues();
        values.put("money",0.1111);

        int update = getContentResolver().update(uri, values,"name=?", new String[]{"zhaoliu"});

        Toast.makeText(getApplicationContext(),"更新了"+update+"行",Toast.LENGTH_LONG).show();
    }


    //查找
    public void click4(View view) {

//1.拿到内容的解析者
        Uri uri = Uri.parse("content://com.provider/query"); //路径和你定义的路径一样

        Cursor cursor1 = getContentResolver().query(uri, null, null,
                null, null
        );

        if (cursor1 != null && cursor1.getCount() > 0) {
            while (cursor1.moveToNext()) {
                String name = cursor1.getString(1);
                String phone = cursor1.getString(2);
                System.out.println("第二个应用:name==>" + name + "   phone==>" + phone);
            }

        }


    }
}
MyOpenHelper:
代码语言:javascript
复制
package com.demo.dqdygapplication;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public MyOpenHelper(Context context) {
        super(context, "Account.db", null, 1);
    }

    /**
     * 数据库的名字
     */

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
        db.execSQL("insert into info(name,money) values(?,?)", new String[]{"张三","5000"});
        db.execSQL("insert into info(name,money) values(?,?)", new String[]{"李四","3000"});
    }

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

    }
}
activity_main.xml:
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:onClick="click1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="add"
        />
    <Button
        android:onClick="click2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="delete"
        />
    <Button
        android:onClick="click3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="update"
        />
    <Button
        android:onClick="click4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="find"
        />
</LinearLayout>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.01.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Android使用内容提供者实现增删改查操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档