久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Android ContentProvider的基本原理和使用

瀏覽:5日期:2022-09-17 17:05:51
目錄一、前言二、URI(Uniform Resource Identifier)三、MIME四、UriMatcher五、ContentUris5.1、方法使用示例5.2、監(jiān)聽(tīng)數(shù)據(jù)變化六、實(shí)例說(shuō)明七、總結(jié)7.1、額外補(bǔ)充:隱式 Intent 中 <data> 標(biāo)簽一、前言

Android 的數(shù)據(jù)存儲(chǔ)方式總共有五種,分別是:Shared Preferences、網(wǎng)絡(luò)存儲(chǔ)、文件存儲(chǔ)、外儲(chǔ)存儲(chǔ)、SQLite。但一般這些存儲(chǔ)都只是在單獨(dú)的一個(gè)應(yīng)用程序之中達(dá)到一個(gè)數(shù)據(jù)的共享,有時(shí)候我們需要操作其他應(yīng)用程序的一些數(shù)據(jù),就會(huì)用到 ContentProvider。而且 Android 為常見(jiàn)的一些數(shù)據(jù)提供了默認(rèn)的 ContentProvider(包括音頻、視頻、圖片和通訊錄等)。

詳解Android ContentProvider的基本原理和使用

要實(shí)現(xiàn)與其他的 ContentProvider 通信首先要查找到對(duì)應(yīng)的 ContentProvider 進(jìn)行匹配。Android 中 ContenProvider 借助 ContentResolver 通過(guò) Uri 與其他的 ContentProvider 進(jìn)行匹配通信。

二、URI(Uniform Resource Identifier)

其它應(yīng)用可以通過(guò) ContentResolver 來(lái)訪問(wèn) ContentProvider 提供的數(shù)據(jù),而 ContentResolver 通過(guò) uri 來(lái)定位自己要訪問(wèn)的數(shù)據(jù),所以我們要先了解 uri。URI(Universal Resource Identifier)統(tǒng)一資源定位符,如果您使用過(guò)安卓的隱式啟動(dòng)就會(huì)發(fā)現(xiàn),在隱式啟動(dòng)的過(guò)程中我們也是通過(guò) uri 來(lái)定位我們需要打開(kāi)的 Activity 并且可以在 uri 中傳遞參數(shù)。

URI 為系統(tǒng)中的每一個(gè)資源賦予一個(gè)名字,比方說(shuō)通話記錄。每一個(gè) ContentProvider 都擁有一個(gè)公共的 URI,用于表示 ContentProvider 所提供的數(shù)據(jù)。URI 的格式如下:

// 規(guī)則

[scheme:][//host:port][path][?query]

// 示例

content://com.wang.provider.myprovider/tablename/id:

1.標(biāo)準(zhǔn)前綴(scheme)——content://,用來(lái)說(shuō)明一個(gè)Content Provider控制這些數(shù)據(jù);

2.URI 的標(biāo)識(shí) (host:port)—— com.wang.provider.myprovider,用于唯一標(biāo)識(shí)這個(gè) ContentProvider,外部調(diào)用者可以根據(jù)這個(gè)標(biāo)識(shí)來(lái)找到它。對(duì)于第三方應(yīng)用程序,為了保證 URI 標(biāo)識(shí)的唯一性,它必須是一個(gè)完整的、小寫(xiě)的類名。這個(gè)標(biāo)識(shí)在元素的authorities屬性中說(shuō)明,一般是定義該 ContentProvider 的包.類的名稱;

3.路徑(path)——tablename,通俗的講就是你要操作的數(shù)據(jù)庫(kù)中表的名字,或者你也可以自己定義,記得在使用的時(shí)候保持一致就可以了;

4.記錄ID(query)——id,如果URI中包含表示需要獲取的記錄的 ID,則返回該id對(duì)應(yīng)的數(shù)據(jù),如果沒(méi)有ID,就表示返回全部;

對(duì)于第三部分路徑(path)做進(jìn)一步的解釋,用來(lái)表示要操作的數(shù)據(jù),構(gòu)建時(shí)應(yīng)根據(jù)實(shí)際項(xiàng)目需求而定。如:

操作tablename表中id為11的記錄,構(gòu)建路徑:/tablename/11; 操作tablename表中id為11的記錄的name字段:tablename/11/name; 操作tablename表中的所有記錄:/tablename; 操作來(lái)自文件、xml或網(wǎng)絡(luò)等其他存儲(chǔ)方式的數(shù)據(jù),如要操作xml文件中tablename節(jié)點(diǎn)下name字段:/ tablename/name; 若需要將一個(gè)字符串轉(zhuǎn)換成Uri,可以使用Uri類中的parse()方法,

Uri uri = Uri.parse('content://com.wang.provider.myprovider/tablename');

再來(lái)看一個(gè)例子:

http://www.baidu.com:8080/wenku/jiatiao.html?id=123456&name=jack

uri 的各個(gè)部分在安卓中都是可以通過(guò)代碼獲取的,下面我們就以上面這個(gè) uri 為例來(lái)說(shuō)下獲取各個(gè)部分的方法:

getScheme():獲取 Uri 中的 scheme 字符串部分,在這里是 http getHost():獲取 Authority 中的 Host 字符串,即 www.baidu.com getPost():獲取 Authority 中的 Port 字符串,即 8080 getPath():獲取 Uri 中 path 部分,即 wenku/jiatiao.html getQuery():獲取 Uri 中的 query 部分,即 id=15&name=du三、MIME

MIME 是指定某個(gè)擴(kuò)展名的文件用一種應(yīng)用程序來(lái)打開(kāi),就像你用瀏覽器查看 PDF 格式的文件,瀏覽器會(huì)選擇合適的應(yīng)用來(lái)打開(kāi)一樣。Android 中的工作方式跟 HTTP 類似,ContentProvider 會(huì)根據(jù) URI 來(lái)返回 MIME 類型,ContentProvider 會(huì)返回一個(gè)包含兩部分的字符串。MIME 類型一般包含兩部分,如:

text/html

text/css

text/xml

application/pdf

分為類型和子類型,Android 遵循類似的約定來(lái)定義MIME類型,每個(gè)內(nèi)容類型的 Android MIME 類型有兩種形式:多條記錄(集合)和單條記錄。

集合記錄(dir):

vnd.android.cursor.dir/自定義 

單條記錄(item):

vnd.android.cursor.item/自定義 

vnd 表示這些類型和子類型具有非標(biāo)準(zhǔn)的、供應(yīng)商特定的形式。Android中類型已經(jīng)固定好了,不能更改,只能區(qū)別是集合還是單條具體記錄,子類型可以按照格式自己填寫(xiě)。

在使用 Intent 時(shí),會(huì)用到 MIME,根據(jù) Mimetype 打開(kāi)符合條件的活動(dòng)。

四、UriMatcher

Uri 代表要操作的數(shù)據(jù),在開(kāi)發(fā)過(guò)程中對(duì)數(shù)據(jù)進(jìn)行獲取時(shí)需要解析 Uri,Android 提供了兩個(gè)用于操作 Uri 的工具類,分別為 UriMatcher 和 ContentUris 。掌握它們的基本概念和使用方法,對(duì)一個(gè) Android 開(kāi)發(fā)者來(lái)說(shuō)是一項(xiàng)必要的技能。

UriMatcher 類用于匹配 Uri,它的使用步驟如下:

將需要匹配的Uri路徑進(jìn)行注冊(cè),代碼如下:

//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);//如果match()方法匹配“content://com.wang.provider.myprovider/tablename”路徑,返回匹配碼為1sMatcher.addURI('content://com.wang.provider.myprovider', ' tablename ', 1);//如果match()方法匹配content://com.wang.provider.myprovider/tablename/11路徑,返回匹配碼為2sMatcher.addURI('com.wang.provider.myprovider', 'tablename/#', 2);

此處采用 addURI 注冊(cè)了兩個(gè)需要用到的 URI;注意,添加第二個(gè) URI 時(shí),路徑后面的 id 采用了通配符形式 “#”,表示只要前面三個(gè)部分都匹配上了就 OK。

注冊(cè)完需要匹配的 Uri 后,可以使用 sMatcher.match(Uri) 方法對(duì)輸入的 Uri 進(jìn)行匹配,如果匹配就返回對(duì)應(yīng)的匹配碼,匹配碼為調(diào)用 addURI() 方法時(shí)傳入的第三個(gè)參數(shù)。

switch (sMatcher.match(Uri.parse('content://com.zhang.provider.yourprovider/tablename/100'))) { case 1://match 1, todo somethingbreak; case 2//match 2, todo somethingbreak; default://match nothing, todo somethingbreak;}五、ContentUris

ContentUris 類用于操作 Uri 路徑后面的 ID 部分,它有兩個(gè)比較實(shí)用的方法:withAppendedId(Uri uri, long id) 和 parseId(Uri uri)。

withAppendedId(Uri uri, long id) 用于為路徑加上 ID 部分:

Uri uri = Uri.parse('content://cn.scu.myprovider/user')//生成后的Uri為:content://cn.scu.myprovider/user/7Uri resultUri = ContentUris.withAppendedId(uri, 7);

parseId(Uri uri) 則從路徑中獲取 ID 部分:

Uri uri = Uri.parse('content://cn.scu.myprovider/user/7')//獲取的結(jié)果為:7long personid = ContentUris.parseId(uri);

ContentProvider 主要方法ContentProvider 是一個(gè)抽象類,如果我們需要開(kāi)發(fā)自己的內(nèi)容提供者我們就需要繼承這個(gè)類并復(fù)寫(xiě)其方法,需要實(shí)現(xiàn)的主要方法如下:

public boolean onCreate():在創(chuàng)建 ContentProvider 時(shí)使用 public Cursor query():用于查詢指定 uri 的數(shù)據(jù)返回一個(gè) Cursor public Uri insert():用于向指定uri的 ContentProvider 中添加數(shù)據(jù) public int delete():用于刪除指定 uri 的數(shù)據(jù) public int update():用戶更新指定 uri 的數(shù)據(jù) public String getType():用于返回指定的 Uri 中的數(shù)據(jù) MIME 類型

數(shù)據(jù)訪問(wèn)的方法 insert,delete 和 update 可能被多個(gè)線程同時(shí)調(diào)用,此時(shí)必須是線程安全的。

如果操作的數(shù)據(jù)屬于集合類型,那么 MIME 類型字符串應(yīng)該以 vnd.android.cursor.dir/ 開(kāi)頭,

要得到所有 tablename 記錄: Uri 為 content://com.wang.provider.myprovider/tablename,那么返回的MIME類型字符串應(yīng)該為:vnd.android.cursor.dir/table。

如果要操作的數(shù)據(jù)屬于非集合類型數(shù)據(jù),那么 MIME 類型字符串應(yīng)該以 vnd.android.cursor.item/ 開(kāi)頭,

要得到 id 為 10 的 tablename 記錄,Uri 為 content://com.wang.provider.myprovider/tablename/10,那么返回的 MIME 類型字符串為:vnd.android.cursor.item/tablename 。

5.1、方法使用示例

使用 ContentResolver 對(duì) ContentProvider 中的數(shù)據(jù)進(jìn)行操作的代碼如下:

ContentResolver resolver = getContentResolver();Uri uri = Uri.parse('content://com.wang.provider.myprovider/tablename');// 添加一條記錄ContentValues values = new ContentValues();values.put('name', 'wang1');values.put('age', 28);resolver.insert(uri, values); // 獲取tablename表中所有記錄Cursor cursor = resolver.query(uri, null, null, null, 'tablename data');while(cursor.moveToNext()){ Log.i('ContentTest', 'tablename_id='+ cursor.getInt(0)+ ', name='+ cursor.getString(1));}// 把id為1的記錄的name字段值更改新為zhang1ContentValues updateValues = new ContentValues();updateValues.put('name', 'zhang1');Uri updateIdUri = ContentUris.withAppendedId(uri, 2);resolver.update(updateIdUri, updateValues, null, null);// 刪除id為2的記錄,即字段ageUri deleteIdUri = ContentUris.withAppendedId(uri, 2);resolver.delete(deleteIdUri, null, null);5.2、監(jiān)聽(tīng)數(shù)據(jù)變化

如果ContentProvider的訪問(wèn)者需要知道數(shù)據(jù)發(fā)生的變化,可以在ContentProvider發(fā)生數(shù)據(jù)變化時(shí)調(diào)用getContentResolver().notifyChange(uri, null)來(lái)通知注冊(cè)在此URI上的訪問(wèn)者。只給出類中監(jiān)聽(tīng)部分的代碼:

public class MyProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues values) { db.insert('tablename', 'tablenameid', values); getContext().getContentResolver().notifyChange(uri, null); }}

而訪問(wèn)者必須使用 ContentObserver 對(duì)數(shù)據(jù)(數(shù)據(jù)采用 uri 描述)進(jìn)行監(jiān)聽(tīng),當(dāng)監(jiān)聽(tīng)到數(shù)據(jù)變化通知時(shí),系統(tǒng)就會(huì)調(diào)用 ContentObserver 的 onChange() 方法:

getContentResolver().registerContentObserver(Uri.parse('content://com.ljq.providers.personprovider/person'), true, new PersonObserver(new Handler()));public class PersonObserver extends ContentObserver{ public PersonObserver(Handler handler) { super(handler); } public void onChange(boolean selfChange) { //to do something }}六、實(shí)例說(shuō)明

數(shù)據(jù)源是 SQLite, 用 ContentResolver 操作 ContentProvider。

詳解Android ContentProvider的基本原理和使用

Constant.java(儲(chǔ)存一些常量)

public class Constant { public static final String TABLE_NAME = 'user'; public static final String COLUMN_ID = '_id'; public static final String COLUMN_NAME = 'name'; public static final String AUTOHORITY = 'cn.scu.myprovider'; public static final int ITEM = 1; public static final int ITEM_ID = 2; public static final String CONTENT_TYPE = 'vnd.android.cursor.dir/user'; public static final String CONTENT_ITEM_TYPE = 'vnd.android.cursor.item/user'; public static final Uri CONTENT_URI = Uri.parse('content://' + AUTOHORITY + '/user'); }

DBHelper.java (操作數(shù)據(jù)庫(kù))

public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = 'finch.db';private static final int DATABASE_VERSION = 1; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }@Override public void onCreate(SQLiteDatabase db) throws SQLException { //創(chuàng)建表格 db.execSQL('CREATE TABLE IF NOT EXISTS '+ Constant.TABLE_NAME + '('+ Constant.COLUMN_ID +' INTEGER PRIMARY KEY AUTOINCREMENT,' + Constant.COLUMN_NAME +' VARCHAR NOT NULL);'); }@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) throws SQLException { // 這里知識(shí)簡(jiǎn)單刪除并創(chuàng)建表格 // 如果需要保留原來(lái)的數(shù)據(jù),需要先備份再刪除db.execSQL('DROP TABLE IF EXISTS '+ Constant.TABLE_NAME+';'); onCreate(db); } }

MyProvider.java (自定義的 ContentProvider ) 

public class MyProvider extends ContentProvider { DBHelper mDbHelper = null;SQLiteDatabase db = null; private static final UriMatcher mMatcher;static{ mMatcher = new UriMatcher(UriMatcher.NO_MATCH);  // 注冊(cè) uri mMatcher.addURI(Constant.AUTOHORITY,Constant.TABLE_NAME, Constant.ITEM); mMatcher.addURI(Constant.AUTOHORITY, Constant.TABLE_NAME+'/#', Constant.ITEM_ID);} @Overridepublic String getType(Uri uri) {  // 根據(jù)匹配規(guī)則返回對(duì)應(yīng)的類型 switch (mMatcher.match(uri)) { case Constant.ITEM:return Constant.CONTENT_TYPE; case Constant.ITEM_ID:return Constant.CONTENT_ITEM_TYPE; default:throw new IllegalArgumentException('Unknown URI'+uri); }} @Overridepublic Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub long rowId; if(mMatcher.match(uri)!=Constant.ITEM){throw new IllegalArgumentException('Unknown URI'+uri); } rowId = db.insert(Constant.TABLE_NAME,null,values); if(rowId>0){Uri noteUri=ContentUris.withAppendedId(Constant.CONTENT_URI, rowId);getContext().getContentResolver().notifyChange(noteUri, null);return noteUri; }throw new SQLException('Failed to insert row into ' + uri);} @Overridepublic boolean onCreate() { // TODO Auto-generated method stub mDbHelper = new DBHelper(getContext()); db = mDbHelper.getReadableDatabase();return true;} @Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub Cursor c = null; switch (mMatcher.match(uri)) { case Constant.ITEM:c = db.query(Constant.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);break; case Constant.ITEM_ID:c = db.query(Constant.TABLE_NAME, projection,Constant.COLUMN_ID + '='+uri.getLastPathSegment(), selectionArgs, null, null, sortOrder);break; default:throw new IllegalArgumentException('Unknown URI'+uri); }c.setNotificationUri(getContext().getContentResolver(), uri); return c;} @Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) { // TODO Auto-generated method stub return 0;} @Override public int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0; }}

MainActivity.java(ContentResolver操作)

public class MainActivity extends Activity { private ContentResolver mContentResolver = null; private Cursor cursor = null; @Overrideprotected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.tv);mContentResolver = getContentResolver(); tv.setText('添加初始數(shù)據(jù) ');for (int i = 0; i < 10; i++) { ContentValues values = new ContentValues(); values.put(Constant.COLUMN_NAME, 'fanrunqi'+i); mContentResolver.insert(Constant.CONTENT_URI, values); } tv.setText('查詢數(shù)據(jù) ');cursor = mContentResolver.query(Constant.CONTENT_URI, new String[]{Constant.COLUMN_ID,Constant.COLUMN_NAME}, null, null, null); if (cursor.moveToFirst()) { String s = cursor.getString(cursor.getColumnIndex(Constant.COLUMN_NAME)); tv.setText('第一個(gè)數(shù)據(jù): '+s);}} }

最后在manifest申明 :

<provider android:name='MyProvider' android:authorities='cn.scu.myprovider' />七、總結(jié) 如何通過(guò) ContentProvider 查詢數(shù)據(jù)? 通過(guò) ContentResolver 進(jìn)行uri匹配 如何實(shí)現(xiàn)自己的ContentProvider? 繼承 ContentProvider,實(shí)現(xiàn)對(duì)應(yīng)的方法。在 manifest 中聲明7.1、額外補(bǔ)充:隱式 Intent 中 <data> 標(biāo)簽

該部分內(nèi)容與ContentProvider 沒(méi)關(guān)系,只是這里講到了 URI,就順便此處在插入另外一個(gè)知識(shí)點(diǎn):Intent 中 <data> 標(biāo)簽。看不懂的可以直接略過(guò),看下一步分的內(nèi)容,此處內(nèi)容與 activity 相關(guān)。

Data 的匹配規(guī)則:如果過(guò)濾規(guī)則 intent-filter 中定義了 data,那么 Intent 中必須也要攜帶可匹配的 data

data 的語(yǔ)法如下所示:

<data android:scheme=“string” android:host=“string” android:port=“string” android:path=“string” android:pathPattern=“string” android:pathPrefix=“string” android:mimeType=“string”>

data 由兩部分組成:mimeType 和 URI。mimeType 可以為空,URI 一定不會(huì)為空,因?yàn)橛心J(rèn)值。mimeType 指媒體類型,比如 image/jpeg,video/* 等,可表示圖片,視頻等不同的媒體格式

示例1

data 的匹配:

<intent-filter> <action android:name='com.action.demo1'></action> <category android:name='android.intent.category.DEFAULT' /> <data android:scheme='x7' android:host='www.360.com' /> </intent-filter>

清單文件 intent-filter 定義的 data 中,只有 URI, 沒(méi)有 mimeType 類型,匹配如下

intent.setData(Uri.parse('x7://www.360.com'))

示例2

<intent-filter> <action android:name='com.action.demo1'></action> <category android:name='android.intent.category.DEFAULT' /> <data android:mimeType='image/*' /> </intent-filter>

清單文件 intent-filter 定義的 data 中,沒(méi)有定義 URI,只有 mimeType 類型,但是 URI 卻有默認(rèn)值,URI 中的 scheme 默認(rèn)為 content 或者 file,host 一定不能為空,隨便給個(gè)字符串a(chǎn)bc 都可以,匹配如下

intent.setDataAndType(Uri.parse('content://abc'),'image/png');

注意:

content://abc 換成 file://abc 在 7.0 以上的版本(即把 targetSdkVersion 指定成 24 及之上并且在 API>=24 的設(shè)備上運(yùn)行)會(huì)出現(xiàn) FileUriExposedException 異常,google 提供了FileProvider 解決這個(gè)異常,使用它可以生成 content://Uri 來(lái)替代 file://Uri.

示例3

<intent-filter> <action android:name='com.action.demo1'></action> <category android:name='android.intent.category.DEFAULT' /><data android:mimeType='image/*' android:scheme='x7' android:host='www.360.com' /><data android:mimeType='video/*' android:scheme='x7' android:host='www.360.com' /></intent-filter>

清單文件 intent-filter 定義的 data 中,URI 和 mimeType 都有, 匹配如下:

intent.setDataAndType(Uri.parse('x7://www.360.com'),'image/png');// 或者intent.setDataAndType(Uri.parse('x7://www.360.com'),'video/mpeg');

Inent 中攜帶的 data 標(biāo)簽對(duì)應(yīng)的數(shù)據(jù),在某一組 intent-filter 中可以找到,即匹配成功。data 標(biāo)簽數(shù)據(jù)在 intent-filter 中也可以有多組隱示啟動(dòng),防止匹配失敗的可以提前檢測(cè)。

判斷的方法如下:

PackageManager mPackageManager = getPackageManager();//返回匹配成功中最佳匹配的一個(gè)act信息,intent 需要按照前面的把 action, data 等都設(shè)置好ResolveInfo info = mPackageManager.resolveActivity(intent,PackageManager.MATCH_DEFAULT_ONLY);//返回所有匹配成功的act信息,是一個(gè)集合 List<ResolveInfo> infoList = mPackageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

只要上述 2 個(gè)方法的返回值不為 null,那么 startActivity 一定可以成功

以上就是詳解Android ContentProvider的基本原理和使用的詳細(xì)內(nèi)容,更多關(guān)于Android ContentProvider的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: www.xxx在线观看 | 97碰碰碰免费公开在线视频 | 国产一区二区欧美 | 青草视频在线免费观看 | 欧美成人精品一区二区三区 | 久久99这里只有精品 | 午夜影视剧场 | 国产欧美综合一区二区三区 | 日韩精品免费观看 | 成年人在线视频 | 玖玖操 | 91精品久久久久久久久 | 欧美国产精品一区 | 一区二区免费看 | 日本高清精品 | 亚洲高清视频在线 | 国产综合精品一区二区三区 | 欧美在线视频网站 | 国产91色| 日韩国产精品一区二区 | 在线免费观看黄色 | 一区二区日韩精品 | 一本色道精品久久一区二区三区 | 亚洲男人的天堂在线播放 | 欧美日韩精品一区二区三区四区 | 久久精品色欧美aⅴ一区二区 | 91精品国产自产精品男人的天堂 | 一区二区精品视频 | 久久美女 | 亚洲中字在线 | 在线观看毛片网站 | 四虎884a| 一区二区三区小视频 | 超碰人人艹 | 久久久婷 | 中文字幕av一区二区 | 中文字幕av亚洲精品一部二部 | 午夜av毛片| 国产精品久久久久久久久久久久冷 | 日本中文在线 | 国产一级一级国产 | 91亚色| 国产精品久久免费视频在线 | 男女视频免费 | 成人在线视频免费 | 午夜国产在线 | 国产人妖在线 | 午夜精品久久久久 | 久久99视频这里只有精品 | 国产在线视频xxx | 成人二区| 久久久tv | 国产精品一区二区三区免费视频 | 美女久久 | 在线成人免费视频 | 99精品一区二区三区 | 色猫猫国产区一区二在线视频 | 亚洲天天| 日日摸夜夜添夜夜添高潮视频 | 视频在线91 | 色九九九| 在线天堂视频 | 日韩一级电影在线 | 狠狠综合久久 | 一区二区三区免费网站 | 国产一级影片 | 日韩精品一区二区三区中文字幕 | 伊人网站 | 欧美一区二区免费 | 69热在线观看 | 日韩一区二区三区在线视频 | 色噜噜视频 | 日韩国产二区 | 欧美一级全黄 | 国产精品99久久久久久动医院 | 中文字幕色 | 欧美9999 | 欧美久久a | 成人日韩 | 欧美久久久精品 | 一区二区三区久久 | 不卡的毛片| 久久中文视频 | 日本一二三区在线 | 在线观看免费黄色小视频 | 日韩欧美国产一区二区 | 中文字幕在线观看www | 理论片91 | 99国产精品99久久久久久 | 国产欧美在线观看 | 欧美一区二区三区四区不卡 | 久久精品91久久久久久再现 | 久久亚洲视频 | 一级日批片 | 国产精品69毛片高清亚洲 | 国产精品久久久久久亚洲调教 | 久久r免费视频 | 亚洲日韩欧美一区二区在线 | 欧美天堂| 国产精品女教师av久久 | 日本 欧美 国产 | 噜噜噜在线 | 小情侣高清国产在线播放 | 国产一区二区三区在线免费观看 | 五月婷婷综合激情网 | 日韩中文字幕一区二区高清99 | 日日骚| 成人久久久| 国产精品国产成人国产三级 | 国产精品一区二区无线 | 一级片在线观看 | 欧美亚洲国产一区二区三区 | 中文字幕国产 | 在线日韩欧美 | 久色视频在线观看 | 久久久久久91香蕉国产 | 99热免费精品 | 日本一区二区不卡 | 久久成人综合网 | 天天干夜夜操 | 亚洲国产精品久久久 | 国产2区 | 日韩国产高清在线 | 日韩一区二区在线播放 | 亚洲人人 | 91精品国产日韩91久久久久久 | 国产精品久久久久毛片软件 | 国产精品久久精品 | 成人综合在线观看 | 成人欧美亚洲 | 婷婷综合| 日韩福利在线观看 | 国产在线精品一区 | 国产一区二区三区在线免费 | 福利视频一区二区三区 | 国产精品亚洲精品久久 | 一区二区三区在线免费播放 | 男女啪啪无遮挡 | 欧美a在线 | 国产精品乱码久久 | 国产区视频在线观看 | 亚色在线 | 91久久精品国产91久久性色tv | 在线播放亚洲 | 在线第一页 | 国产精品美女www爽爽爽动态图 | 欧美成视频 | 日韩一区二区在线观看 | 欧美性hd| 91精品国产色综合久久不卡98口 | 在线日韩 | 精品一区二区久久久久久久网站 | 久久xxx | 亚洲国产视频精品 | 天堂在线网 | 大象视频成人在线观看 | 欧美片网站免费 | 视频一区 国产精品 | 久久黑人| 亚洲日韩欧美一区二区在线 | www.xxxx在线观看 | 久草免费在线 | 免费的日批视频 | www.天天操| 欧美aaaaa| 在线观看免费视频亚洲 | 日日噜 | 亚洲精品一区二区三区蜜桃久 | www四虎com| 在线观看www| 色综合二区 | 999精品网| 一本色道久久综合狠狠躁篇的优点 | 麻豆产精国品免费入口 | 午夜影皖| 视频一区二区三区中文字幕 | 91高清在线 | 99久久精品免费看国产免费软件 | 夜夜爽99久久国产综合精品女不卡 | 午夜一级片 | 亚洲视频观看 | 国产成人免费视频 | 成人国产精品免费网站 | 九九99九九 | 91麻豆久久久 | 国产成人精品一区二区三区视频 | 国产精品一区二区三区四区 | 2020亚洲视频 | 天天干com| 中文字幕在线观看一区二区三区 | 免看一级一片 | 欧美精品一区自拍a毛片在线视频 | 老司机精品福利视频 | 亚洲欧美第一页 | 成人欧美一区二区三区在线观看 | 免费一级在线观看 | 欧美日本韩国在线 | 欧美色视频在线观看 | 中文字幕在线免费 | 国产免费av大片 | 国产二区三区 | 久久草| 免费毛片网站 | 国产精品久久久久久久久免费桃花 | 一区二区三区四区免费 | 午夜爱视频 | 风间由美一区二区三区在线观看 | 国产色婷婷 | 国产精品久久久久久久久久久杏吧 | 国产精品国产三级国产aⅴ中文 | 亚洲一区二区在线看 | 一级黄色毛片 | 亚洲成人一区二区 | 欧洲视频一区二区 | 六月丁香在线观看 | 亚洲精品在线看 | 国产97碰免费视频 | 久久久久久久久久穴 | 国产视频色 | 在线观看一区 | 北条麻妃一区二区三区在线观看 | 米奇狠狠操| 国产美女久久久 | 久久精品国产亚洲一区二区三区 | 高清成人| 在线免费观看毛片 | 狠狠综合久久 | 日韩一区二区三区福利视频 | 免费av片网站 | 综合久久亚洲 | 91爱爱网| a欧美| 欧美精品一区二区三区在线四季 | 久久综合av | www.一区| 亚洲蜜臀av乱码久久精品蜜桃 | 国产综合av | 天天操操 | 毛片日韩 | 亚洲欧美第一页 | 女人毛片 | 国产精品久久久久久婷婷天堂 | 亚洲一区| 在线欧美成人 | 羞羞av在线| 夜本色 | 免费视频一区二区三区在线观看 | 日本淫视频 | 久草福利| 欧美一级黄色网 | 精品久久久久久久久久久久包黑料 | 亚洲欧美激情视频 | 国产高清久久久 | 亚洲国产精品久久久久秋霞蜜臀 | 国产91成人在在线播放 | 亚洲天天操| 欧美一级做a爰片免费视频 亚洲精品一区在线观看 | 国产情侣激情 | 美女张开腿视频网站免费 | 国产精品九九九 | 九九在线视频 | 国产高清视频在线 | 成人在线播放 | 精品国产91乱码一区二区三区 | 成人午夜毛片 | 久久综合九色综合欧美狠狠 | 久久夜夜 | 亚洲精彩视频 | 亚洲第一免费网站 | 91在线观看 | 在线看av网址 | 久久激情五月丁香伊人 | 好姑娘影视在线观看高清 | 亚洲成人精品在线观看 | 亚洲国产精品久久 | 日韩一区二区三区在线观看 | 日韩草比 | 午夜精品视频在线观看 | 成人在线观看免费 | 日日操天天操 | 日本一区二区三区免费观看 | 天天插天天干 | 欧美中文字幕在线 | av观看免费 | 国产精品久久久久久久岛一牛影视 | 亚洲国产精品人人爽夜夜爽 | 久久精品亚洲一区二区 | 亚洲免费在线观看 | 久久国产精品视频一区 | 精品国产一区二区三区小蝌蚪 | 君岛美绪一区二区三区 | a级黄色毛片免费观看 | 老汉色影院| 天天操天天舔天天爽 | 一区二区在线 | 国产99久久久国产精品 | 一级欧美在线 | 日韩欧美自拍 | 嫩草网站入口 | 男女网站在线观看 | 精品久久久久久久久福利 | 一区二区三区有限公司 | 华丽的挑战在线观看 | a久久| 视频一区二区三 | 免费观看在线午夜影视 | 久久99精品久久久久久琪琪 | 91精品国产91久久久久久最新 | 亚洲国产精品综合久久久 | 黑人巨大精品欧美一区二区免费 | 一区二区三区四区在线 | 日本爽快片毛片 | av大片| 91观看 | 成人一级片视频 | 亚洲精品国精品久久99热 | 国产精品成人一区二区三区夜夜夜 | 日韩在线视频第一页 | 欧美久久一区二区 | 日韩av一区二区三区在线观看 | 精品一区二区三区免费看 | 久久久一区二区 | 国产欧美日韩 | 亚洲精品在线播放视频 | 97视频在线免费观看 | 日韩欧美在线观看一区二区 | h视频在线免费观看 | 在线观看国产视频 | 日韩视频中文 | 欧美日韩精品一区二区三区 | 亚洲欧洲精品成人久久奇米网 | 中文字幕一区二区三区精彩视频 | 成人做爰www免费看视频网站 | 成人免费毛片aaaaaa片 | 亚洲欧美精品一区二区三区 | 看亚洲a级一级毛片 | 亚洲精品一区二区网址 | 中文字字幕一区二区三区四区五区 | 亚洲h视频在线观看 | 韩日精品| 亚洲午夜视频在线观看 | 91视频观看| 欧美色图亚洲自拍 | 欧美久久精品一级c片 | 亚洲成av人片一区二区梦乃 | 欧美一级播放 | 免费av播放| 亚洲人人 | 久久99国产精品久久99果冻传媒 | 亚洲精选一区二区 | 亚洲免费人成在线视频观看 | 黄色片在线 | 综合久久精品 | 羞羞视频免费在线观看 | 中文字幕大全 | 自拍偷拍99 | 成人小视频在线观看 | 成人在线网 | 欧美精品一区二区视频 | 影视在线观看 | 欧美日韩综合精品 | 99re6在线视频精品免费 | av一区二区三区四区 | 欧美日韩在线精品 | 99草在线视频 | 久久国产精品首页 | 一级做a爰性色毛片免费1 | 在线视频亚洲 | 成人免费小视频 | 91九色视频在线 | 国产高清免费视频 | 精品无码久久久久久国产 | 精品视频网 | 久久久久国产一区二区三区 | 美日一级毛片 | 久草天堂 | 午夜精品一区二区三区四区 | 日本一区二区不卡视频 | 成人精品久久久 | 国产精品日本一区二区不卡视频 | 夜夜骑首页| 亚洲国产精品一区二区第一页 | 色婷婷av一区二区三区软件 | 999国产在线| 久久一二| 在线亚洲人成电影网站色www | 精品国产一区二区三区成人影院 | 啊v在线| av一区二区在线观看 | 国产单男 | 欧美一区二区三区xxxx监狱 | 亚洲激情在线 | 国产成人免费视频网站视频社区 | 久久综合一区 | 国产综合区 | 性大毛片视频 | 日韩av片在线免费观看 | 精品久久影院 | 亚洲一区二区三区四区五区中文 | 久久99国产一区二区三区 | 亚洲精品一区二区网址 | 日韩精品一区二区三区在线观看 | 国产韩国精品一区二区三区 | 91夜夜夜| 久久精品久久久久久 | 久久国产欧美日韩精品 | 亚洲一级在线观看 | 日韩欧美国产一区二区三区 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 国产在线一区观看 | 狠狠草视频 | 欧美午夜在线观看 | 亚洲最大的黄色网 | 欧美成人高清 | 在线视频三级 | 成人综合视频在线 | 99久久精品一区二区 | 中文字幕日韩欧美一区二区三区 | 国产高清视频一区二区 | 亚洲成人另类 | 亚洲毛片 | 国产91在线 | 亚洲 | 9久久婷婷国产综合精品性色 | 男人的天堂久久精品 | 涩涩视频在线看 | 欧美日一区二区 | 欧美一区二区三区免费电影 | 国产精品久久一区 | 亚洲视频欧美视频 | 日韩视频免费在线观看 | 亚洲国产一区二区三区四区 | 久久精品久久久 | 亚洲高清在线观看视频 | 亚洲成人精品在线 | 草比网站 | 欧美一级黄色片网站 | 99精品99| 91精品久久久久久久久久入口 | 亚洲综合影院 | 久久91视频 | 一级黄色片a级 | 国产亚洲精品美女久久久久久久久久 | 久久亚洲一区 | 嫩草视频在线观看免费 | 国产激情在线观看 | 中文字幕在线观看一区二区三区 | 特级淫片女子高清视频在线观看 | 99综合在线| 亚洲小视频 | www.日韩在线视频 | 成人一二三区 | 亚洲av毛片一区二二区三三区 | 91久久久久久久久久久久久久久久 | 毛片毛片毛片 | 亚洲国产精品久久久男人的天堂 | 日韩日韩日韩日韩日韩日韩 | 成人午夜精品一区二区三区 | 不卡中文一区 | 人人草人人干 | 国产精品一区二区三区四区 | 午夜视频| 国产精品视频一区二区三区四蜜臂 | 精品久 | 久久综合久久久 | 狠狠操天天操 | 91社影院在线观看 | 亚洲成人激情在线观看 | 久久久久无码国产精品一区 | 日韩在线一区二区三区 | 特级做a爰片毛片免费看108 | 国产高清免费视频 | 成人一区电影 | 成人美女免费网站视频 | 91社区在线观看高清 | 亚洲乱码一区二区三区在线观看 | 可以免费看黄视频的网站 | 色综合欧美 | 91视频免费播放 | 小川阿佐美88av在线播放 | 最新国产精品精品视频 | 国产一区二精品区在线 | 狠狠的干 | 情一色一乱一欲一区二区 | 涩涩999| 亚洲国产自产 | 国产精品日韩一区二区 | 亚洲精品影院 | 综合久久国产九一剧情麻豆 | 精品在线91 | 久久综合狠狠综合久久综合88 | 成人欧美一区二区三区在线播放 | 色香阁99久久精品久久久 | 中字幕视频在线永久在线观看免费 | 亚洲国产精品久久久久久久 | 成人精品 | 欧美理论视频 | 免费不卡视频 | xxxx午夜 | 亚洲成人精品 | 日本亚洲精品一区二区三区 | 日本一二三区在线 | 久久亚洲一区 | 国内精品久久精品 | 国产午夜精品久久 | 国产一区二区三区四 | 看亚洲a级一级毛片 | 日韩精品视频在线播放 | 伊人网网站 | 亚洲成人一区 | 欧美午夜视频在线观看 | 亚洲免费精品 | 激情视频在线观看免费 | 一区二区中文字幕 | 午夜电影在线看 | 九九视频网 | 人人干天天干 | 国产精品美女久久久久久久久久久 | 国产成人片 | 日韩精品在线免费观看视频 | 桃色视频在线播放 | 日韩中文视频 | 天堂福利影院 | 性做久久久 | 亚洲免费影院 | 国产精品不卡一区 | 曰批视频在线观看 | 欧美精品一区二区三区四区 | 伊人av在线 | 亚洲午夜一区 | 一区二区三区国产视频 | 成人免费网站视频 | 精品国产乱码久久久久久久软件 | 成人免费看电影 | 亚洲一区二区三区视频 | 亚洲国产一区二区三区在线观看 | 四虎影院网 | 日韩欧美在线不卡 | 国产成人一级毛片 | 精品国产一区二区三区高潮视 | 国产精品入口久久 | 91精品视频在线播放 | 日韩有码一区 | 色综合色 | 在线色网站 | 黄色片在线免费看 | 国产美女www爽爽爽免费视频 | 国产精品美女久久久 | 日韩毛片一级 | 欧美一级特黄aaaaaaa在线观看 | 私人毛片免费高清视频 | 亚洲精品成人av | 永久av| 日韩免费在线观看视频 | 国产欧美日本 | 国产一区二区成人 | 亚洲综合在线视频 | 精品欧美一区二区三区久久久 | 国内精品久久久久 | 在线色综合 | 日韩欧美在线视频观看 | 亚洲天堂成人在线 | 欧洲另类二三四区 | 亚洲成人黄色 | 99久久久久久 | 九九亚洲视频 | 一区二区三区在线播放 | 一区二区在线视频 | 日韩在线欧美 | 在线a视频 | 香蕉久久久久久 | 欧美激情欧美激情在线五月 | 天天澡天天狠天天天做 | a毛片在线免费观看 | 欧美一区2区三区4区公司二百 | 色偷偷888欧美精品久久久 | 精品久久久久久国产 | 国产精品久久久久aaaa九色 | 久久免费视频观看 | 九九久久影视 | 久操不卡 | 日韩中文视频 | 在线精品国产 | 极品久久 | 亚洲视频一区二区三区 | 中文字幕在线免费看 | 久久久久久亚洲精品视频 | 亚洲v日韩v综合v精品v | 亚洲第一av | 国产精品乱码一二三区的特点 | 欧美性影院 | 91精品国产综合久久久久久丝袜 | 一级全黄少妇性色生活片毛片 | 国产美女久久 | 草视频在线 | 成人欧美一区二区 | 色网网站| 天天干狠狠干 | 成人av免费在线 | www.成人久久 | 99福利视频 | 99综合在线 | 亚洲成人一| 中文字幕欧美日韩一区 | 久草天堂| 日韩一二三四 | 亚洲高清视频一区二区三区 | 亚洲国产精品网站 | 国产精品香蕉 | 97伦理网 | 久久久精品免费看 | 涩涩操| 亚洲一区二区三区视频 | 国产精品视频免费观看 | 中文字幕亚洲综合 | 国产亚洲欧美精品永久 |