目錄
一、概述
二、MIME类型
1、什么是MIME类型
2、MIME类型有什么用
三、getType()
1、概述
2、getType()与Activity的关系
3、新建SecondActivity用来通过URI启动
4、AndroidManifest.xml
四、结果展示
首頁 資料庫 mysql教程 ContentProvider数据库共享之MIME类型与getType()

ContentProvider数据库共享之MIME类型与getType()

Jun 07, 2016 pm 03:17 PM
共享 資料庫 類型

前言:这篇没有前言…… 1、《ContentProvider数据库共享之——概述》 2、《ContentProvider数据库共享之——实例讲解》 3、《ContentProvider数据库共享之——MIME类型与getType()》 4、《ContentProvider数据库共享之——读写权限与数据监听》 一、概述 在

前言:这篇没有前言……



1、《ContentProvider数据库共享之——概述》
2、《ContentProvider数据库共享之——实例讲解》
3、《ContentProvider数据库共享之——MIME类型与getType()》
4、《ContentProvider数据库共享之——读写权限与数据监听》


一、概述

在上篇中,我们讲了通过共享数据库的增、删、改、查问题,但在生成PeopleContentProvider类时,由于其派生自ContentProvider,所以我们我们重写了数据库操作的insert()、query()、update()、delete()函数,但对于getType()直接返回了null;我们这篇主要就讲讲这个getType()函数有什么用。

先看下getType()的官方说明:

public abstract String getType (Uri uri)

Implement this to handle requests for the MIME type of the data at the given URI. The returned MIME type should start with vnd.android.cursor.item for a single record, or vnd.android.cursor.dir/ for multiple items. This method can be called from multiple threads, as described in Processes and Threads.

Parameters
uri	the URI to query.
Returns
a MIME type string, or null if there is no type.
登入後複製
总体来说,就是传进去一个URI,返回一个表示MIME类型的字符串;里面还说,如果是单条记录应该返回以vnd.android.cursor.item/ 为首的字符串,如果是多条记录,应该返回vnd.android.cursor.dir/ 为首的字符串;
下面先来看看MIME类型是什么?

二、MIME类型

1、什么是MIME类型

根据百度百科的解释:MIME:全称Multipurpose Internet Mail Extensions,多功能Internet邮件扩充服务。它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
看完之后,只有一个感觉……依然不懂!简单来讲,MIME类型就是用来标识当前的Activity所能打开的文件类型!

下面简单列出来系统中自带的几种文件类型和对应的MIME类型:

(前面是文件名,后面是对应的MIME类型字符串)

{".bmp", "image/bmp"}
{".c", "text/plain"}
{".class", "application/octet-stream"}
{".conf", "text/plain"}
{".cpp", "text/plain"}
{".doc", "application/msword"}

2、MIME类型有什么用

那现在看看在android中,MIME类型是用来干什么的呢?
首先,MIME类型主要是Activity的Intent-filter的data域;比如下面这个Activity:

<activity android:name=".SecondActivity" android:label="@string/title_activity_second">
    <intent-filter>
        <action android:name="harvic.test.qijian"></action>
        <category android:name="android.intent.category.DEFAULT"></category>
        <data android:mimetype="image/bmp"></data>
    </intent-filter>
</activity>
登入後複製
这里指定了data域的MimeType值是"image/bmp",即在利用隐式Intent匹配时,只有指定MimeType是"image/bmp"时,才能启用这个Activity,也就是说,这个Activity只能打开image/bmp类型的文件!!!!这才是MIME类型匹配的重点;
所以MIME类型在Activity中是用来指定,当前的Activity所支持打开的文件类型!!

三、getType()

1、概述

现在再回过来看看ContentProvider中的getType()函数,这个函数会根据传进来的URI,生成一个代表MimeType的字符串;而此字符串的生成也有规则:

  • 如果是单条记录应该返回以vnd.android.cursor.item/ 为首的字符串
  • 如果是多条记录,应该返回vnd.android.cursor.dir/ 为首的字符串
至于自符串/后的字符就随便定义了。

这里考虑一个问题,为什么我们返回的MimeType,要以vnd.android.cursor.item/ 或vnd.android.cursor.dir/ 开头?
我们知道,MIME类型其实就是一个字符串,中间有一个 “/” 来隔开,“/”前面的部分是系统识别的部分,就相当于我们定义一个变量时的变量数据类型,通过这个“数据类型”,系统能够知道我们所要表示的是个什么东西。至于 “/” 后面的部分就是我们自已来随便定义的“变量名”了。

2、getType()与Activity的关系

上面我们讲了MIME存在于Activity的intent-filter中,那我们的getType() 跟Activity的intent-filter之间又有什么关系呢?
其实,getType()返回的MIME类型,主要就是用来隐式匹配Intent的MIMETYPE域来启动Activity的。
下面来看看通过URI来启用Activity的方式:

Intent intent = new Intent();
intent.setAction("harvic.test.qijian");
intent.setData(mCurrentURI);
startActivity(intent);
登入後複製
登入後複製
其中:
public static final String AUTHORITY = "com.harvic.provider.PeopleContentProvider";
public static final Uri CONTENT_URI_FIRST = Uri.parse("content://" + AUTHORITY + "/first");
public static Uri mCurrentURI = CONTENT_URI_FIRST;
登入後複製
在上面的代码中,我们设置了action 和 content uri;
这里利用Content URI来启用隐式启用Activity又是怎样一个流程呢?
ContentProvider数据库共享之MIME类型与getType()
  • (1)首先,第三方应用通过content Uri和action来隐式匹配Intent来启用Activity.
Intent intent = new Intent();
intent.setAction("harvic.test.qijian");
intent.setData(mCurrentURI);
startActivity(intent);
登入後複製
登入後複製
  • (2)、系统通过URI中的Authority来匹配ContentProvider,从而找到我们的PeopleContentProvider。
  • (3)在找到PeopleContentProvider,由于我们是来匹配Intent的,所以这时候会调用getType(uri)来返回URI类型:
static {
     sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
     sUriMatcher.addURI(AUTHORITY, "first", MATCH_FIRST);
     sUriMatcher.addURI(AUTHORITY, "second", MATCH_SECOND);
    }
登入後複製
上面是UriMather的构造方法,由上面的代码可知,当匹配"/first"时返回MATCH_FIRST即数值1,匹配“/second”时返回MATCH_SECOND,即数值2
所以:
1、当匹配"/fist"时,我们返回自定义的MIME类型:vnd.android.cursor.dir/harvic.first
2、当匹配“/second”时,返回MIME类型:vnd.android.cursor.item/harvic.second
代码如下:
public static final String CONTENT_FIRST_TYPE = "vnd.android.cursor.dir/harvic.first";
public static final String CONTENT_SECOND_TYPE = "vnd.android.cursor.item/harvic.second";
登入後複製
public String getType(Uri uri) {
    switch (sUriMatcher.match(uri)){
        case MATCH_FIRST:{
            return CONTENT_FIRST_TYPE;
        }
        case MATCH_SECOND:{
            return CONTENT_SECOND_TYPE;
        }
    }
    return null;
}
登入後複製
  • (4)下面就是根据Action和MIME类型来匹配Intent了
我们到现在在ContentProviderBlog项目中还没有一个Activity能匹配这个Action和MIME类型的,所以我们新建一个SecondActivity;

3、新建SecondActivity用来通过URI启动

在这个Activity中,我们只利用TextView来标识当前这个Activity来自ContentProviderBlog的secondActivity;
XML代码:所以,我们在TextView中,将其Text属性改为"ContentProviderBlog的secondActivity"以便识别这个Activity;
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent">

    <textview android:text="ContentProviderBlog的secondActivity" android:layout_width="wrap_content" android:layout_height="wrap_content"></textview>

</relativelayout>
登入後複製

4、AndroidManifest.xml

在AndroidManifest.xml中,为SecondActivity添加上隐式匹配所需要的Intent-filter;注意我们在getType()里根据不同的URI返回了两种MIME类型,而这里的SecondActivity的data域只添加一个mimeType:vnd.android.cursor.dir/harvic.first;即当我们使用content://com.harvic.provider.PeopleContentProvider/second来隐式匹配Intent时,是没办法启用SecondActivity的,因为MIME类型不匹配!
<activity android:name=".SecondActivity" android:label="@string/title_activity_second">
    <intent-filter>
        <action android:name="harvic.test.qijian"></action>
        <category android:name="android.intent.category.DEFAULT"></category>
        <data android:mimetype="vnd.android.cursor.dir/harvic.first"></data>
    </intent-filter>
</activity>
登入後複製

四、结果展示

下面我们看看在使用不同的URI来启用Activity时,会出现什么结果;

使用content://com.harvic.provider.PeopleContentProvider/first,结果如下:
点击“thirdPart”,通过URI调起Activity

ContentProvider数据库共享之MIME类型与getType()  ContentProvider数据库共享之MIME类型与getType()

使用content://com.harvic.provider.PeopleContentProvider/second,由于MIME不匹配,导致无法调起Activity

ContentProvider数据库共享之MIME类型与getType() ContentProvider数据库共享之MIME类型与getType()


同样,源码包含两部分内容:
(先装ContentProviderBlog,再装UseProvider;利用UseProvider操作ContentProviderBlog的数据库,看打出来的LOG)

1、《ContentProviderBlog》:这个是提供共享数据库接口的APP;
2、《UseProvider》:第三方通过URI来操作数据库的APP;

如果本文有帮到你,记得关注哦。

源码地址:http://download.csdn.net/detail/harvic880925/8532205

http://blog.csdn.net/harvic880925/article/details/44620851  谢谢!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

Hibernate 如何實作多型映射? Hibernate 如何實作多型映射? Apr 17, 2024 pm 12:09 PM

Hibernate多態映射可映射繼承類別到資料庫,提供以下映射類型:joined-subclass:為子類別建立單獨表,包含父類別所有欄位。 table-per-class:為子類別建立單獨資料表,僅包含子類別特有列。 union-subclass:類似joined-subclass,但父類別表聯合所有子類別列。

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

如何在PHP中處理資料庫連線錯誤 如何在PHP中處理資料庫連線錯誤 Jun 05, 2024 pm 02:16 PM

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

Golang 函數傳回值的型別是什麼? Golang 函數傳回值的型別是什麼? Apr 13, 2024 pm 05:42 PM

Go函數可以傳回多個不同類型的值,傳回值類型在函數簽章中指定,並透過return語句傳回。例如,函數可以傳回一個整數和一個字串:funcgetDetails()(int,string)。在實戰中,一個計算圓面積的函數可以回傳面積和一個可選錯誤:funccircleArea(radiusfloat64)(float64,error)。注意事項:如果函數簽章未指定類型,則傳回空值;建議使用明確類型宣告的return語句以提高可讀性。

如何用 Golang 連接遠端資料庫? 如何用 Golang 連接遠端資料庫? Jun 01, 2024 pm 08:31 PM

透過Go標準庫database/sql包,可以連接到MySQL、PostgreSQL或SQLite等遠端資料庫:建立包含資料庫連接資訊的連接字串。使用sql.Open()函數開啟資料庫連線。執行SQL查詢和插入操作等資料庫操作。使用defer關閉資料庫連線以釋放資源。

如何在 Golang 中使用資料庫回呼函數? 如何在 Golang 中使用資料庫回呼函數? Jun 03, 2024 pm 02:20 PM

在Golang中使用資料庫回呼函數可以實現:在指定資料庫操作完成後執行自訂程式碼。透過單獨的函數新增自訂行為,無需編寫額外程式碼。回調函數可用於插入、更新、刪除和查詢操作。必須使用sql.Exec、sql.QueryRow或sql.Query函數才能使用回呼函數。

如何在 Golang 中將 JSON 資料保存到資料庫中? 如何在 Golang 中將 JSON 資料保存到資料庫中? Jun 06, 2024 am 11:24 AM

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

See all articles