文章出處
文章列表
作用:把一個App中的數據庫通過Url的形式共享出來,供其他App使用。
首先在App1中創建一個數據庫,用SQLiteOpenHelper
1 public class MyOpenHelper extends SQLiteOpenHelper { 2 3 public MyOpenHelper(Context context){ 4 super(context,"Account.db",null,1); 5 } 6 @Override 7 public void onCreate(SQLiteDatabase db) { 8 db.execSQL("create table info(_id integer primary key autoincrement, name varchar(20),money varchar(10))"); 9 db.execSQL("insert into info(name, money) values(?,?)",new String[]{"張三","5000"}); 10 ContentValues cv = new ContentValues(); 11 cv.put("name","李四"); 12 cv.put("money","6000"); 13 db.insert("info",null,cv); 14 } 15 @Override 16 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 17 } 18 }
創建數據庫:
1 MyOpenHelper myOpenHelper = new MyOpenHelper(this); 2 myOpenHelper.getReadableDatabase();
然后用過ContentProvider把數據庫共享出來,首先看代碼:
public class MyProvider extends ContentProvider { //定義一個Uri路徑匹配器 (匹配不成功的時候會返回一個NO_MATCH返回一個-1) private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int QUERYSUCESS = 0; private static final int INSERTSUCESS = 1; private static final int UPADTESUCESS = 2; private static final int DELETESUCESS = 3; //創建一個靜態代碼塊,在這里添加Uri static { /** * authority 注意:和清單文件里面定義的一樣 com.coderwei.provider/query */ sURIMatcher.addURI("com.coderwei.provider","query",QUERYSUCESS ); sURIMatcher.addURI("com.coderwei.provider","insert",INSERTSUCESS ); sURIMatcher.addURI("com.coderwei.provider","update",UPADTESUCESS ); sURIMatcher.addURI("com.coderwei.provider","delete",DELETESUCESS ); } private MyOpenHelper myOpenHelper; @Override public boolean onCreate() { //初始化MyOpenHelper myOpenHelper = new MyOpenHelper(getContext()); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if (sURIMatcher.match(uri)==QUERYSUCESS){ //說明路徑匹配成功 SQLiteDatabase db = myOpenHelper.getReadableDatabase(); Cursor cursor = db.query("info",projection,selection,selectionArgs,null,null,sortOrder); //db.close(); //這里不能關閉Cursor return cursor; }else { throw new IllegalArgumentException("uri路徑不匹配"); } } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { if (sURIMatcher.match(uri)==INSERTSUCESS){ SQLiteDatabase db = myOpenHelper.getReadableDatabase(); long insert = db.insert("info",null,values); Uri uri1 = Uri.parse("com.coderwei.insert/"+insert); //db.close(); return uri1; }else { throw new IllegalArgumentException("uri路徑不匹配"); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { if (sURIMatcher.match(uri)==DELETESUCESS){ SQLiteDatabase db = myOpenHelper.getReadableDatabase(); int delete = db.delete("info",selection,selectionArgs); //db.close(); return delete; }else { throw new IllegalArgumentException("uri路徑不匹配"); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { if (sURIMatcher.match(uri)== UPADTESUCESS){ SQLiteDatabase db = myOpenHelper.getReadableDatabase(); int update = db.update("info",values,selection,selectionArgs); //db.close(); return update; }else { throw new IllegalArgumentException("uri路徑不匹配"); } } }
代碼很長,但是很簡單,主要把上面四個增刪改查方法實現就行,上面的db.close()關閉的時候報錯了,所以就注釋掉了,關不關都可以。
Insert方法返回的是一個Url對象,直接自己寫一個就行了。
記得在Manifest.xml中配置ContentProvider:
<provider android:authorities="com.coderwei.provider" android:exported="true" android:name=".MyProvider"> </provider>
android:authorities 自己隨便給一個字符串,
android:exported="true"一定要寫上這句,這句話表示可以被另一個Application的組件啟動,沒寫可能會報錯。
sURIMatcher.addURI("com.coderwei.provider","query",QUERYSUCESS );中的com.coderwei.provider就是這個字符串。
然后就是來到App2了,先看代碼:
1 public class MainActivity extends Activity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 } 8 public void click1(View v){ 9 doQuery(); 10 } 11 public void click2(View v){ 12 doInsert(); 13 } 14 public void click3(View v){ 15 doDelete(); 16 } 17 public void click4(View v){ 18 doUpdate(); 19 } 20 21 private void doQuery(){ 22 Uri uri = Uri.parse("content://com.coderwei.provider/query"); 23 Cursor cursor = getContentResolver().query(uri,new String[]{"name","money"},null,null,null); 24 25 if (cursor!=null){ 26 while (cursor.moveToNext()){ 27 String name = cursor.getString(0); 28 String money = cursor.getString(1); 29 System.out.println("name:"+name+" money: "+money); 30 } 31 } 32 } 33 34 private void doInsert(){ 35 Uri uri = Uri.parse("content://com.coderwei.provider/insert"); 36 ContentValues cv = new ContentValues(); 37 cv.put("name","王五"); 38 cv.put("money","800"); 39 Uri uri1 = getContentResolver().insert(uri,cv); 40 System.out.println("插入uri1:"+uri1); 41 } 42 43 private void doDelete(){ 44 Uri uri = Uri.parse("content://com.coderwei.provider/delete"); 45 int delete = getContentResolver().delete(uri,"name=?",new String[]{"王五"}); 46 System.out.print("刪除了: "+delete); 47 } 48 49 private void doUpdate(){ 50 Uri uri = Uri.parse("content://com.coderwei.provider/update"); 51 ContentValues cv = new ContentValues(); 52 cv.put("money","9000"); 53 int update = getContentResolver().update(uri,cv,"name=?",new String[]{"王五"}); 54 System.out.println("更新了:"+update); 55 } 56 }
里面就是四個增刪改查方法,就Query稍微麻煩一點,查詢的結果返回一個Cursor對象,然后把這個Cursor對象的內容取出來就行了,
文章列表
全站熱搜