ContentProvider数据库共享之MIME类型与getType()
前言:这篇没有前言…… 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.
下面先来看看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>
所以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;
这里利用Content URI来启用隐式启用Activity又是怎样一个流程呢?

- (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); }
所以:
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了
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
使用content://com.harvic.provider.PeopleContentProvider/second,由于MIME不匹配,导致无法调起Activity
同样,源码包含两部分内容:
(先装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 谢谢!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

Hibernate ポリモーフィック マッピングは、継承されたクラスをデータベースにマップでき、次のマッピング タイプを提供します。 join-subclass: 親クラスのすべての列を含む、サブクラス用の別個のテーブルを作成します。 table-per-class: サブクラス固有の列のみを含む、サブクラス用の別個のテーブルを作成します。 Union-subclass: join-subclass と似ていますが、親クラス テーブルがすべてのサブクラス列を結合します。

HTML はデータベースを直接読み取ることはできませんが、JavaScript と AJAX を通じて実現できます。この手順には、データベース接続の確立、クエリの送信、応答の処理、ページの更新が含まれます。この記事では、JavaScript、AJAX、および PHP を使用して MySQL データベースからデータを読み取る実践的な例を示し、クエリ結果を HTML ページに動的に表示する方法を示します。この例では、XMLHttpRequest を使用してデータベース接続を確立し、クエリを送信して応答を処理することで、ページ要素にデータを埋め込み、データベースを読み取る HTML の機能を実現します。

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

PHP でデータベース接続エラーを処理するには、次の手順を使用できます。 mysqli_connect_errno() を使用してエラー コードを取得します。 mysqli_connect_error() を使用してエラー メッセージを取得します。これらのエラー メッセージをキャプチャしてログに記録することで、データベース接続の問題を簡単に特定して解決でき、アプリケーションをスムーズに実行できるようになります。

Go 関数は、異なる型の複数の値を返すことができます。戻り値の型は関数シグネチャで指定され、return ステートメントを通じて返されます。たとえば、関数は funcgetDetails()(int,string) のように整数と文字列を返すことができます。実際には、円の面積を計算する関数は、面積とオプションのエラーを返すことができます: funccircleArea(radiusfloat64)(float64,error)。注: 関数シグネチャで型が指定されていない場合は、null 値が返されます。読みやすさを向上させるために、明示的な型宣言を含む return ステートメントを使用することをお勧めします。

Go 標準ライブラリのデータベース/SQL パッケージを通じて、MySQL、PostgreSQL、SQLite などのリモート データベースに接続できます。データベース接続情報を含む接続文字列を作成します。 sql.Open() 関数を使用してデータベース接続を開きます。 SQL クエリや挿入操作などのデータベース操作を実行します。 defer を使用してデータベース接続を閉じ、リソースを解放します。

Golang でデータベース コールバック関数を使用すると、次のことを実現できます。 指定されたデータベース操作が完了した後にカスタム コードを実行します。追加のコードを記述せずに、個別の関数を通じてカスタム動作を追加します。コールバック関数は、挿入、更新、削除、クエリ操作に使用できます。コールバック関数を使用するには、sql.Exec、sql.QueryRow、または sql.Query 関数を使用する必要があります。
