contentProviderSample实现操作数据库

contentProviderSample实现操作数据库并显示在listview控件中。

实现效果和上个实验相同:
点击进入上个实验
本实验在上个实验基础上完成,与上个实验包名略有不同,并且添加了ContentProvider.java文件、修改了MainActivity.java的代码。
ContentProvider.java代码:

package com.henu.contentprovider;

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class ContentProvider extends android.content.ContentProvider {

    private MyHelper myHelper;
    private static final int INSERT = 1;
    private static final int DELETE = 2;
    //这里没有更新操作
   // private static final int UPDATE = 3;
    private static final int QUERY = 4;

    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

    static {
        matcher.addURI("com.henu.rjxy.provider", "insert", INSERT);
        matcher.addURI("com.henu.rjxy.provider", "delete", DELETE);
   //     matcher.addURI("com.henu.rjxy.provider", "update", UPDATE);
        matcher.addURI("com.henu.rjxy.provider", "query", QUERY);

    }

    @Override
    public boolean onCreate() {
        myHelper = new MyHelper(getContext());
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        if (matcher.match(uri) == QUERY) {

            SQLiteDatabase db = myHelper.getReadableDatabase();
            Cursor cursor = db.query("information", null, null, null, null, null, null);
            return  cursor;
        }else {
            throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
        }
    }

    @Nullable
    @Override
    //用不到
    public String getType(@NonNull Uri uri) {
        if (matcher.match(uri) ==QUERY ) {
            return  "vnd.android.cursor.dir/information";
        }
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        if(matcher.match(uri)==INSERT){
            SQLiteDatabase db = myHelper.getWritableDatabase();
            db.insert("information", null, values);
            db.close();
        }else {
            throw new IllegalArgumentException("路径不匹配,不能执行插入操作");
        }
        return uri;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        int no;
        if(matcher.match(uri)==DELETE){
            SQLiteDatabase db = myHelper.getWritableDatabase();
            no=db.delete("information", null, null);
            //删除自增主键id
            db.delete("sqlite_sequence", null, null);
            db.close();
        }else {
            throw new IllegalArgumentException("路径不匹配,不能执行插入操作");
        }
        return no;
    }

    @Override
      //用不到
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }
}

MainActivity.java文件代码:

package com.henu.contentprovider;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private ListView viewById;
    private MyHelper myHelper;
    private SimpleCursorAdapter adapter;
    private Cursor cursor;
    //SimpleCursorAdapter所需要的参数
    String from[] = new String[]{"_id", "name", "age"};
    int[] to = new int[]{R.id.tv_id, R.id.tv_name, R.id.tv_age};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myHelper = new MyHelper(this);
        viewById = (ListView) findViewById(R.id.lv);
        //进入程序时显示数据库中的数据
        Show();
    }

    public void save(View v) {
        //获得可读数据库对象
       // SQLiteDatabase db = myHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        EditText et_name = (EditText) findViewById(R.id.et_name);
        EditText et_age = (EditText) findViewById(R.id.et_age);
        values.put("name", et_name.getText().toString().trim());
        values.put("age", et_age.getText().toString());
        //long q = db.insert("information", "name", values);
        Uri uri=Uri.parse("content://com.henu.rjxy.provider/insert");
        ContentResolver contentResolver=getContentResolver();
        contentResolver.insert(uri,values);
        Toast.makeText(this, "数据存入成功", Toast.LENGTH_SHORT).show();
        //数据库发生变化时更新listview
        Show();
    }


    /*
       当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。

这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。

如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。
        */
    public void clear(View v) {
       // SQLiteDatabase db = myHelper.getWritableDatabase();
        Uri uri=Uri.parse("content://com.henu.rjxy.provider/delete");
        ContentResolver contentResolver=getContentResolver();
        contentResolver.delete(uri, null, null);
        Toast.makeText(this, "数据库清除成功", Toast.LENGTH_SHORT).show();
        Show();
    }
    //显示数据
    public void Show() {
       ///SQLiteDatabase db = myHelper.getWritableDatabase();
        Uri uri=Uri.parse("content://com.henu.rjxy.provider/query");
        ContentResolver contentResolver=getContentResolver();
        cursor = contentResolver.query(uri,null,null,null,null);
        adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        viewById.setAdapter(adapter);
    }
}

清单文件加入的代码:
在application内部加入:

<provider
            android:name="com.henu.contentprovider.ContentProvider"
            android:authorities="com.henu.rjxy.provider"></provider>

实现效果:
在这里插入图片描述

清单文件:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值