【实验名称】实验六、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) {
}
}
2、添加用户:
修改结果:
【实验分析或心得】
掌握了如何在Android 开发中使用 SQLite 数据库,熟悉设计数据库表结构的方法与步骤并且理解contentprovider的使用方法及流程,理解了ContentProvider、Resolver、Uri、Urimatcher等的原理。。