实验六、contentprovider实验+SQLite数据库的实现

实验六、contentprovider实验+SQLite数据库的实现

【实验名称】实验六、contentprovider实验+SQLite数据库的实现
【实验目的】
1、掌握如何在Android 开发中使用 SQLite 数据库
2、熟悉设计数据库表结构的方法与步骤
3、理解contentprovider的使用方法及流程,理解ContentProvider、Resolver、Uri、Urimatcher等的原理。
【实验内容】
1、实现contentprovider和contentresolver通过uri的调用;
2、实现contentprovider对数据库sqlite的功能:增、删、改、查;
3、数据库的表结构自行设计;

【实验要求】
1、配置SQLite 数据库的运行环境
2、熟悉contentprovider对数据库sqlite增、删、改、查的具体操作和流程
3、充分理解SQLite数据库的使用原理和方式

(请完成如下部分)
【实验设计】

1、设置Activity,通过按钮设置监听,而通过正确的uri来调用自定义的 ContentProvider: 匹配合适的uri之后,通过getContentResolver()去操作数据库。
public class MainContentProvider extends AppCompatActivity {
    TextView text;
    EditText username;
    EditText phone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_content_provider);
        text = findViewById(R.id.ContactTV);
        username = findViewById(R.id.username);
        phone = findViewById(R.id.phone);

    }

    public void queryClick(View view){
        text.setText("");
        String id = username.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user/" + id);
        Cursor cursor = getContentResolver().query(uri,null,null,null,null);
        excuteCursor(cursor);
    }
    public void queryAll(View view){
//        text.setText("");
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user" );
        Cursor cursor = getContentResolver().query(uri,null,null,null,null,null);
        excuteCursor(cursor);


    }
    public void insertClick(View view){
         String name = username.getText().toString();
        String phone1 = phone.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
        ContentValues values = new ContentValues();
        values.put("username",name);
        values.put("phone",phone1);
         getContentResolver().insert(uri, values);
        Toast.makeText(this,"已插入",Toast.LENGTH_SHORT).show();
            username.setText("");
            phone.setText("");

    }
    public void deleteClick(View view){
        String name = username.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
            getContentResolver().delete(uri,"username=?",new String[]{name});
        Toast.makeText(this,"已删除",Toast.LENGTH_SHORT).show();
    }
    public void updateClick(View view){
        String name = username.getText().toString();
        String pho = phone.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
        ContentValues values = new ContentValues();
        values.put("username",name);
        values.put("phone",pho);
        getContentResolver().update(uri,values,"username=?",new String[]{name});
        Toast.makeText(this,"已修改",Toast.LENGTH_SHORT).show();


    }

    @SuppressLint("SetTextI18n")
    private void excuteCursor(Cursor cursor) {
        if(cursor!=null){
            text.setText("");
            while (cursor.moveToNext()){
                int uid = cursor.getInt(0);
                String username = cursor.getString(1);
                String password = cursor.getString(2);
                text.append("联系人ID:"+uid+"\n联系人姓名:"+username+" " +
                        "   联系人电话:"+password+"\n");
                System.out.println("联系人ID:"+uid+"\n联系人姓名:"+username+" " +
                        "   联系人电话:"+password+"\n");
            }


        }
//        cursor.close();
    }
}


2、MyProvider : 
(1)自定义ContentProvider,根据Activity传来的uri进行匹配,匹配到符合的则开始 SQLiteDatabase 来将一些操作数据库的方法接口对Activity进行暴露(提供给Activity),使得Activity可通过 contentresolver 可对数据库进行操作。
(2) 还需要在AndroidManifest.xml中注册 contentprovider:
<provider
    android:authorities="com.example.ContentProvider.provider"
    android:name="com.example.ContentProvider.MyProvider"
    android:exported="true" >
provider>

(3)MyProvider :

①声明 contentprovider 的authorities (主机名)及uri(资源标识符)
public class MyProvider extends ContentProvider {

    MySQLite mySQLite;
    SQLiteDatabase db;
    public static final int USER_DIR = 0;
    public static final int USER_ITEM = 1;
    public static final String authority ="com.example.ContentProvider.provider";
    public static UriMatcher uriMatcher;
        static {
      uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 默认不匹配uri
      uriMatcher.addURI(authority,"user",USER_DIR); //为0 为 com.example.ContentProvider.provider/user :对整张表操作
      uriMatcher.addURI(authority,"user/#",USER_ITEM); // 为1 则为  com.example.ContentProvider.provider/user/1, user此表的第一行

        }
    //
    @Override
    public boolean onCreate() {
        mySQLite = new MySQLite(getContext(),"userphone.db",null,1);
        // 构造数据库(获取上下文、数据库文件名称,不用工厂,版本为1)
        db = mySQLite.getWritableDatabase();  // 创建可写数据库

        return true;
    }
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        // 查询 , 匹配uri
        Cursor cursor = null;
        switch (uriMatcher.match(uri)){
            case USER_DIR:
                cursor = db.query("user",projection,selection,selectionArgs,null,null,null);
                break;
            case USER_ITEM:
                String queryid = uri.getPathSegments().get(1);
                 cursor = db.query("user", projection, "uid=?", new String[]{queryid}, null, null, null);
                break;
        }
        return cursor;
    }
    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        switch (uriMatcher.match(uri)){
            case USER_DIR:
                return "vnd.android.cursor.dir/vnd";
            case USER_ITEM:
                return "vnd.android.cursor.item/vnd.cn.edu.cdut.provider.user";
        }
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        switch (uriMatcher.match(uri)){
            case USER_DIR:

            case USER_ITEM:
                long l = db.insert("user", null, values);
                System.out.println("=================="+l);
                break;
            default:
                break;
        }

        return null;
    }
    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
       int delete = 0;
        switch (uriMatcher.match(uri)){
            case USER_DIR:
                delete = db.delete("user", selection, selectionArgs);
                break;
            case USER_ITEM:
                String queryid = uri.getPathSegments().get(1);
               delete = db.delete("user","uid =?",new String[]{queryid});
                break;
            default:
                break;
        }
        return delete;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        int update = 0;
        switch (uriMatcher.match(uri)){
            case USER_DIR:
                update = db.update("user", values,selection, selectionArgs);
                break;
            case USER_ITEM:
                String queryid = uri.getPathSegments().get(1);
                update = db.update("user",values,"uid=?",new String[]{queryid});
                break;
            default:
                break;
        }
     return update;
    }
}

3、 MySQLite :进行数据库表的创建

public class MySQLite extends SQLiteOpenHelper {
    public MySQLite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onConfigure(SQLiteDatabase db) {
        super.onConfigure(db);
        db.disableWriteAheadLogging();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE user( uid integer primary key autoincrement," +
                "username text not null," +
                "phone text not null)";
        db.execSQL(sql);
    }

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

    }
}

【实验结果】
1、初始界面:
实验六、contentprovider实验+SQLite数据库的实现_第1张图片

2、添加用户:

实验六、contentprovider实验+SQLite数据库的实现_第2张图片

3、点击查询所有:
实验六、contentprovider实验+SQLite数据库的实现_第3张图片

4、根据id查询用户:
实验六、contentprovider实验+SQLite数据库的实现_第4张图片

5、删除用户:
实验六、contentprovider实验+SQLite数据库的实现_第5张图片

删除成功:
实验六、contentprovider实验+SQLite数据库的实现_第6张图片

6、修改ID为7的用户:
实验六、contentprovider实验+SQLite数据库的实现_第7张图片

修改结果:

实验六、contentprovider实验+SQLite数据库的实现_第8张图片

【实验分析或心得】
掌握了如何在Android 开发中使用 SQLite 数据库,熟悉设计数据库表结构的方法与步骤并且理解contentprovider的使用方法及流程,理解了ContentProvider、Resolver、Uri、Urimatcher等的原理。。

你可能感兴趣的:(Android,sqlite,数据库,android)