ContentPRovder(內容提供者是安卓四大組件之一):為存儲和獲取數據提供統一的接口。可以在不同的應用程序之間共享數據。Android已經為常見的一些數據提供了默認的ContentProvider 1、ContentProvider使用表的形式來組織數據 無論數據的來源是什么,ContentProvider都會認為是一種表,然后把數據組織成表格 2、ContentProvider提供的方法 query:查詢 insert:插入 update:更新 delete:刪除 getType:得到數據類型 onCreate:創建數據時調用的回調函數 3、每個ContentProvider都有一個公共的URI,這個URI用于表示這個ContentProvider所提供的數據。Android所提供的ContentProvider都存放在android.provider包當中
下面說下我寫的 1.首先是ContentProvider(內容提供者)的主界面:
外面是用的LinearLayout布局
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_main_id" android:hint="ID:" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_main_name" android:hint="Name:" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_main_age" android:hint="age:" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存" android:onClick="save" />2.寫一個DbHelper(繼承SQLiteOpenHelper)連接數據庫并重新建一個表 重寫3個方法:
public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); Log.i("test","構造"); } @Override //創建數據時調用的回調函數 public void onCreate(SQLiteDatabase sqLiteDatabase) { //操作:創建表的操作 Log.i("test","創建表"); sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,name,age)"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { Log.i("test","數據庫版本,低--->高"); }3.寫了一個類繼承ContentProvider 寫出ContentProvider提供的6個方法 因為我只寫了一個查詢數據:
private static final int PERSONS=1; private static final int PERSON=2; @Override public boolean onCreate() { DbHelper dbHelper=new DbHelper(getContext(),"G150831.db",null,2); sqLiteDatabase = dbHelper.getReadableDatabase(); //實例化URI匹配器 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加匹配規則 // content://com.zking.g150831_android16_sqlite.data/datas代表查詢所有 // content://com.zking.g150831_android16_sqlite.data/datas/1代表查詢單個uriMatcher.addURI("com.zking.g150831_android16_sqlite.person","persons",MyProvider.PERSONS); uriMatcher.addURI("com.zking.g150831_android16_sqlite.person","persons/#",MyProvider.PERSON); Log.i("text","onCreate"); return false; } @Nullable @Override //查詢 public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) { //查詢所有的數據 Log.i("text","query"); int code=uriMatcher.match(uri); switch (code) { case MyProvider.PERSONS: Log.i("text","query查詢所有"); return sqLiteDatabase.query(true,"person",strings,s,strings1,null,null,s1,null); case MyProvider.PERSON: Log.i("text","query查詢單個"); //獲取#好的值 long id= ContentUris.parseId(uri); return sqLiteDatabase.rawQuery("select * from person where _id=?",new String[]{id+""}); } return null;那幾個方法我就不寫上去了4.在androidMainfest.xml 清單文件中去配置這個MyProvider
<provider android:authorities="com.zking.g150831_android16_sqlite.person" android:name="com.zking.provider.MyProvider" android:exported="true" ></provider>5.在MainActivity這個類中寫了一個方法:
public void save(View view){ String name=et_main_name.getText().toString(); String age=et_main_age.getText().toString(); //存到數據庫// ContentValues values=new ContentValues();//Map// values.put("name",name);// values.put("age",age);// values.putNull("_id");// database.insert("person","name",values); //HQL QBC 純(原) for (int i = 0; i <20 ; i++) { //根據你寫入的數據循環20次 database.execSQL("insert into person values(null,?,?)",new String[]{name+i,age}); } Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show(); }ContentResolve(內容訪問者)
1.主界面:
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_main" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="獲取數據" android:onClick="getdata" />2.MainActivity寫了個判斷EditText有沒有數據在查詢:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取內容訪問者 cr = getContentResolver(); et_main = (EditText) findViewById(R.id.et_main); } public void getdata(View view){ if (TextUtils.isEmpty(et_main.getText())){ //如果查詢為空就查所有 uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons"); } else { //否則查詢單個 String id=et_main.getText().toString(); uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons/"+id); } // Cursor cursor= cr.query(uri,null,null,null,null); //單個查詢 //01.條件查詢_id=3 //02.網頁查詢?id=4 //03.URI匹配器 //SimpleCursorAdaper while (cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("name")); int age=cursor.getInt(cursor.getColumnIndex("age")); Log.i("text","_"+id+"_"+name+"_"+age); } }新聞熱點
疑難解答