Android初级开发(七)——创建自己的内容提供器
2017-08-24 14:46
453 查看
本章参考自 郭霖《第一行代码》(第二版)
实现跨程序数据共享
1、先建立一个自己的DatabaseOpenHelper类
2、new一个Content Provider
将这个内容提供器命名为DatabaseProvider.authority指定为com.example.databasetest.provider,Exported属性表示是否运行外部程序访问我们的内容提供器,Enabled属性表示是否启用这个内容提供器。这两个属性都勾中。
3、布局文件
4、MainActivity中
实现跨程序数据共享
1、先建立一个自己的DatabaseOpenHelper类
public class MyDatabaseOpenHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" +"id integer primary key autoincrement," +"author text," +"price real," +"pages integer," +"name text)"; private Context mContext; public MyDatabaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(CREATE_BOOK); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
2、new一个Content Provider
将这个内容提供器命名为DatabaseProvider.authority指定为com.example.databasetest.provider,Exported属性表示是否运行外部程序访问我们的内容提供器,Enabled属性表示是否启用这个内容提供器。这两个属性都勾中。
public class DatabaseProvider extends ContentProvider { //访问Book表中的所有数据 public static final int BOOK_DIR = 0 ; //访问Book表中的单条数据 public static final int BOOK_ITEM = 1; public static final String AUTHORITY = "com.example.databasetest.provider"; private static UriMatcher uriMatcher; private MyDatabaseOpenHelper dbHelper; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY,"book",BOOK_DIR); uriMatcher.addURI(AUTHORITY,"book/#",BOOK_ITEM); } /** * 初始化内容提供器的时候调用 * 通常在这里完成对数据库的创建和升级等操作 * @return 返回true表示内容提供器初始化成功,返回false表示失败 */ @Override public boolean onCreate() { dbHelper = new MyDatabaseOpenHelper(getContext(),"BookStore.db",null,1); return false; } /** * 从内容提供器中查询数据 * @param uri 确定查询哪张表 * @param strings 确定查询那些列 * @param s Where的约束条件 * @param strings1 为Where的占位符提供具体的值 * @param s1 确定查询结果的排序方式 * @return 返回查询结果,放在Cursor对象中 */ @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) { //查询数据 SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = null; switch (uriMatcher.match(uri)){ case BOOK_DIR: cursor = db.query("Book",strings,s,strings1,null,null,s1); break; case BOOK_ITEM: String bookId = uri.getPathSegments().get(1); cursor = db.query("Book",strings,"id=?",new String[]{bookId},null,null,s1); break; default: break; } return cursor; } /** * 根据传入的URI来返回相应的MIME类型 * @param uri * @return */ @Nullable @Override public String getType(@NonNull Uri uri) { switch (uriMatcher.match(uri)){ case BOOK_DIR: return "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.Book"; case BOOK_ITEM: return "vnd.android.cursor.item/vnd.com.example.databasetest.provider.Book"; } return null; } /** * 向内容提供器中添加一条数据 * @param uri 确定要添加到的表 * @param contentValues 待添加的数据保存在values参数中 * @return 返回一个用于表示新纪录的URI */ @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) { //添加数据 SQLiteDatabase db = dbHelper.getWritableDatabase(); Uri uriReturn = null; switch (uriMatcher.match(uri)){ case BOOK_DIR: case BOOK_ITEM: long newBookId = db.insert("Book",null,contentValues); uriReturn = Uri.parse("content://"+AUTHORITY+"/Book/"+newBookId); break; default: break; } return uriReturn; } /** * 从内容提供器中删除数据 * @param uri 确定要删除哪一张表的数据 * @param s Where的约束条件 * @param strings 为Where的占位符提供具体的值 * @return 被删除的行数将作为返回值返回 */ @Override public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) { //删除数据 SQLiteDatabase db = dbHelper.getWritableDatabase(); int deletedRows = 0; switch (uriMatcher.match(uri)){ case BOOK_DIR: deletedRows = db.delete("Book", s, strings); break; case BOOK_ITEM: String bookId = uri.getPathSegments().get(1); deletedRows = db.delete("Book", "id=?", new String[]{bookId}); break; default: break; } return deletedRows; } /** * 更新内容提供器中已有的数据 * @param uri 确定更新哪一张表中的数据 * @param contentValues 新数据保存在values参数中 * @param s where的约束条件 * @param strings 为where的占位符提供具体的值 * @return 受影响的行数作为返回值返回 */ @Override public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) { //更新数据 SQLiteDatabase db = dbHelper.getWritableDatabase(); int updateRows = 0; switch (uriMatcher.match(uri)) { case BOOK_DIR: updateRows = db.update("Book", contentValues, s, strings); break; case BOOK_ITEM: String bookId = uri.getPathSegments().get(1); updateRows = db.update("Book", contentValues, "id=?", new String[]{bookId}); break; default: break; } return updateRows; } }
3、布局文件
<?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" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/add_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="添加数据" android:textSize="25dp"/> <Button android:id="@+id/query_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="查询数据" android:textSize="25dp"/> <Button android:id="@+id/update_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="更新数据" android:textSize="25dp"/> <Button android:id="@+id/delete_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="删除数据" android:textSize="25dp"/> </LinearLayout>
4、MainActivity中
public class MainActivity extends AppCompatActivity { private String newId; private Button addData,queryData,updateData,deleteData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //添加数据 Uri uri = Uri.parse("content://com.example.databasetest.provider/Book"); ContentValues values = new ContentValues(); values.put("name","A Clash of Kings"); values.put("author","George Martin"); values.put("pages",1040); values.put("price",22.85); Uri newUri = getContentResolver().insert(uri,values); newId = newUri.getPathSegments().get(1); } }); queryData = (Button) findViewById(R.id.query_data); queryData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //查询数据 Uri uri = Uri.parse("content://com.example.databasetest.provider/Book"); Cursor cursor = getContentResolver().query(uri,null,null,null,null); if(cursor != null){ while (cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int page = cursor.getInt(cursor.getColumnIndex("page")); double price = cursor.getDouble(cursor.getColumnIndex("price")); Log.d("MainActicity","book name is"+name); Log.d("MainActicity","book author is"+author); Log.d("MainActicity","book page is"+page); Log.d("MainActicity","book price is"+price); } cursor.close(); } } }); updateData = (Button) findViewById(R.id.update_data); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //更新数据 Uri uri = Uri.parse("content://com.example.databasetest.provider/Book/"+newId); ContentValues values = new ContentValues(); values.put("name","A Storm of Swords"); values.put("pages",1216); values.put("price",24.05); getContentResolver().update(uri,values,null,null); } }); deleteData = (Button) findViewById(R.id.delete_data); deleteData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //删除数据 Uri uri = Uri.parse("content://com.example.databasetest.provider/Book"+newId); getContentResolver().delete(uri,null,null); } }); } }
相关文章推荐
- Android开发之创建自己的内容提供器并测试
- Android编程之创建自己的内容提供器实现方法
- Android初级开发(七)——内容提供器—读取系统联系人
- Android开发之内容提供者——创建自己的ContentProvider(详解)
- android: 创建自己的内容提供器
- Android开发之内容提供者——创建自己的ContentProvider(详解)
- Android开发之内容提供者——创建自己的ContentProvider(详解)
- Android开发之内容提供者——创建自己的ContentProvider(详解)
- Android之 内容提供器(2)——创建自己的内容提供器将数据共享出去
- android 学习笔记 创建自己的内容提供器
- Android 内容提供器---创建内容提供器(实现合约类)
- Android 内容提供器---创建内容提供器(实现内容提供器权限)
- Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用
- Android 内容提供器---创建内容提供器(实现ContentProvider类)
- Android 内容提供器---创建内容提供器(实现合约类)
- 【Android Developers Training】 94. 创建一个空内容提供器(Content Provider)
- Android 内容提供器---创建内容提供器(实现内容提供器权限)
- Android 内容提供器---创建内容提供器(概要)
- Android 内容提供器---创建内容提供器(数据设计考虑因素)
- Android 内容提供器---创建内容提供器(<provider>元素)