Android_U6_内容提供者作业实现思路

提示:看这个之前需掌握Android_U5作业实现思路

准备工作同第五章,创建布局文件,修改主题,修改清单文件中本ActivityLabel名称。

  • 在Android应用里创建并注册内容提供者

Android支持任何应用创建自己的ContentProvider,以便将数据提供给其他应用程序。

首先,定义继承ContentProvider的子类并实现CRUD。

创建内容提供者MyDbProvider及应用的Uri

    本次作业采用的Uri为包名com.example.homework6

使用作业5中已经定义过的数据库助手类DbHelper

创建MyDAO的数据库访问类,按照内容提供者组件定义的方法和返回值类型设计

  1. 编写MyDAO类
  1. public class MyDAO {
       
    private DbHelper dbHelper;
       
    private SQLiteDatabase myDb;
       
    //内容提供者Uri
       
    private Uri uri = Uri.parse("content://com.example.homework6");
       
    public MyDAO(Context context){
           
    dbHelper = new DbHelper(context,"text1.db",null,1);
           
    myDb = dbHelper.getWritableDatabase();
        }
       
    //编写下面4个方法,与内容提供者的CRUD方法相对应
       
    public Uri insertInfo(ContentValues values){
           
    long rowid = myDb.insert(DbHelper.TB_NAME,null,values);
           
    if (rowid==-1){
                Log.i(
    "myDbDemo","数据插入失败!");
               
    return null;
            }
    else {
                Log.i(
    "myDbDemo","数据库插入成功"+rowid);
                Uri insertUri = ContentUris.withAppendedId(
    uri,rowid);
                
    return insertUri;
            }
        }
       
    //下面的2个方法,并没有使用到内容提供者Uri
       
    public int deleteAllInfo(Uri uri){
           
    return myDb.delete(DbHelper.TB_NAME,null,null);
        }
       
    public Cursor allQuery(){
           
    myDb = dbHelper.getReadableDatabase();
           
    return myDb.rawQuery("select * from"+dbHelper.TB_NAME,null);
        }
    }
  1. 编写MyDbProvider类
  1. public class MyDbProvider extends ContentProvider {     private Context context;     private MyDAO myDAO;     public MyDbProvider() {     }     @Override     public int delete(Uri uri, String selection, String[] selectionArgs) {         return myDAO.deleteAllInfo(uri);     }     @Override     public String getType(Uri uri) {         throw new UnsupportedOperationException("Not yet implemented");     }     @Override     public Uri insert(Uri uri, ContentValues values) {         return myDAO.insertInfo(values);     }     @Override     public boolean onCreate() {         context = this.getContext();         myDAO = new MyDAO(context);         return true;     }     @Override     public Cursor query(Uri uri, String[] projection, String selection,                         String[] selectionArgs, String sortOrder) {         return myDAO.allQuery();     }     @Override     public int update(Uri uri, ContentValues values, String selection,                       String[] selectionArgs) {         throw new UnsupportedOperationException("Not yet implemented");     } }
  • Android应用里使用内容提供者

在另一个应用程序里,使用内容提供者的依据是已经在清单文件中注册ContentProvider提供的访问域名,可以在当前应用程序中使用该ContentProvider(注:本次作业没用按照课本的一个程序两个模块的方式,使用的是同一个APP内既有ContentProvider又有ContentResolver的方式)

MainActivity代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    EditText et_name;

    EditText et_age;

    Button bt_add,bt_deleteAll;

    ListView listView;

    SimpleAdapter listAdapter;

    ArrayList<Map<String,Object>> listData;

    Map<String,Object> listItem;

    ContentResolver contentResolver;

    Uri uri = Uri.parse("content://com.example.homework6");

    private Cursor cursor = null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        et_name = findViewById(R.id.et_name);

        et_age = findViewById(R.id.et_age);

        listView = findViewById(R.id.listView);

        listData = new ArrayList<Map<String, Object>>();

        bt_add = findViewById(R.id.bt_add);

        bt_add.setOnClickListener(this);

        bt_deleteAll = findViewById(R.id.bt_del);

        bt_deleteAll.setOnClickListener(this);

        contentResolver = getContentResolver();

        dbFindAll();

    }

  

    private void dbFindAll() {

        listData.clear();

        cursor = contentResolver.query(uri,null,null,null,null);

        listItem = new HashMap<String, Object>();

        listItem.put("_id","id");

        listItem.put("name","姓名");

        listItem.put("age","年龄");

        listData.add(listItem);

        if (cursor==null){

            Toast.makeText(this,"未查找到任何数据,请检查uri地址是否正确",Toast.LENGTH_SHORT).show();

        }else {

            cursor.moveToFirst();

            while (!cursor.isAfterLast()){

                String id = cursor.getString(0);

                String name = cursor.getString(1);

                String age = cursor.getString(2);

                listItem = new HashMap<String, Object>();

                listItem.put("_id",id);

                listItem.put("name",name);

                listItem.put("age",age);

                listData.add(listItem);

                cursor.moveToNext();

            }

        }

        showList();

    }

  

    private void showList() {

        listAdapter = new SimpleAdapter(this,listData,R.layout.list_item,new String[]{"_id","name","age"},new int[]{R.id.tv_id,R.id.tvname,R.id.tvage});

        listView.setAdapter(listAdapter);

    }

  

    @Override

    public void onClick(View v) {

        int se=v.getId();

        switch (se){

            case R.id.bt_add:

                ContentValues values = new ContentValues();

                values.put("name",et_name.getText().toString().trim());

                values.put("age",et_age.getText().toString().trim());

                Uri insertUri = contentResolver.insert(uri,values);

                Toast.makeText(this,insertUri.toString(),Toast.LENGTH_SHORT).show();

                dbFindAll();

                break;

            case R.id.bt_del:

                int num=contentResolver.delete(uri,null,null);

                dbFindAll();

                showList();

        }

    }

}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值