ContentProvider数据库共享之概述
前言:项目终于结束了,终于有自己的时间了,感觉几个月没什么进展了,毕业的时间越长,反而觉得学到的知识越少。努力吧。 1、《ContentProvider数据库共享之——概述》 2、《ContentProvider数据库共享之——实例讲解》 3、《ContentProvider数据库共享之—
前言:项目终于结束了,终于有自己的时间了,感觉几个月没什么进展了,毕业的时间越长,反而觉得学到的知识越少。努力吧。
1、《ContentProvider数据库共享之——概述》
2、《ContentProvider数据库共享之——实例讲解》
3、《ContentProvider数据库共享之——MIME类型与getType()》
4、《ContentProvider数据库共享之——读写权限与数据监听》
这篇主要给大家全局性的讲讲应用间的数据库共享。我们都知道每个应用的数据库都只允许创建它的应用自己来读写,那其它应用要访问这个数据库要怎么办呢;这就是数据库共享。
举个例子:如果有写了两个姊妹应用,比如,阿里旺旺和淘宝;如果我想在用淘宝的时候就直接想看到旺旺里跟哪个卖家的聊天记录怎么办(不考虑网络获取,只考虑本地共享),这时候我就要去旺旺的数据库里去找了吧。这就是两应用间的数据库共享问题。而ContentProvider就是解决这个问题的。下面就从ContentProvider设计者的角度来讲讲这两个不同应用间数据库共享问题。
一、两应用间如何通信
首先,我们最先想到的方法应该是如下面这张图这样的,自身应用写好各个数据库接口,供其它应用调用
那么,问题来了,首先,其它应用如何调起这个应用的数据库接口;要知道你要调这个接口的应用很可能根本就没有运行。
咦,好像有一种方法就能调起没有运行的应用——隐式Intent!!!
隐式Intent的调用方法如下,如果这个Activity要供其它应用调用,那么这个Activity在这个应用AndroidManifest.xml中声明方式为:
<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> </intent-filter> </activity>
Intent intent = new Intent("harvic.test.qijian"); startActivity(intent);
1、首先,我们将filter信息写在了AndroidManifest.xml中;
2、当有一个隐式Intent要匹配时,系统(注意是系统!)会搜索整个手机上所有APP的Acitivity进行匹配,如果有匹配的并且有使用权限的,就起起来;大家想想当你在应用中点击网址链接的时候,是不是会转到浏览器中,这就是用的隐式Intent匹配。如果你手机上有多个应用可以匹配,那么就会以列表的形式列出来供你选择开哪一个。具体有关隐式Intent的内容,可以参看《Intent详解一》和《Intent详解二》
根据隐式Intent,我们是不是有受到启发,那我们也可额外再开出来一个东东,仿照隐式Intent的方式来进行全局匹配,如果匹配成功就执行操作!!!对,这就是那帮谷歌老头的设计方法,他们设计的东东就是ContentProvider的URI!!二、ContentProvider与对应的URI
ContentProvider的URI就是下面这个形式的:
主要分三个部分:scheme, authority and path。scheme表示上图中的content://,authority表示B部分,path表示C和D部分。
A部分:表示是一个Android内容URI,说明由ContentProvider控制数据,该部分是固定形式,不可更改的。
B部分:是URI的授权部分,是唯一标识符,用来定位ContentProvider。格式一般是自定义ContentProvider类的完全限定名称,注册时需要用到,如:com.example.transportationprovider
C部分和D部分:是每个ContentProvider内部的路径部分,C和D部分称为路径片段,C部分指向一个对象集合,一般用表的名字,如:/trains表示一个笔记集合;D部分指向特定的记录,如:/trains/122表示id为122的单条记录,如果没有指定D部分,则返回全部记录。
这个URI就是用来进行全局匹配的,那AndroidManifest.xml里又要怎么写呢?
再回想下隐式Intent,在隐式Intent中,Intent-fliter是Activity的一部分,专门过滤隐式Intent的匹配请求的,如果Intent-fliter匹配后,就启动对应的Activity;
那我们也可以设计一个东东,把这个URI作为它的一部分,当匹配成功以后,就进这个东东里操作数据库。这个东东就是ContentProvider;
ContentProvider在AndroidManifest.xml中的声明方式为:(与上面的URI对应)
<provider android:name=".NoteContentProvider" android:authorities="com.example.transportationprovider" android:exported="true"></provider>
这里的android:authorities必须与上面URI中的B部分一样,因为这个就是用来全局匹配的authority!!!!只有URI的authority与provider的android:authorities匹配上了,才会进入后面的操作
到这里,我也要祭出大招了:ContentURI的全局流程图
上面,我们说到了第一步和第二步,当匹配成功ContentProvider以后,就开始进入我们指定的ContentProvider进行处理;大家估计也注意到了,我们的ContentURI的完整部分为:content://com.example.transportionprovider/trains/122
到第二步,我们已经匹配到了content://com.example.transportionprovider,那后面的/trains/122的匹配工作就只有交由ContentProvider来处理了。
在ContentProvder中的匹配是利用UriMatcher来完成的!
三、UriMatcher
UriMatcher的匹配工作的第一步就是先将所需要的匹配的URI使用addURI()添加到UriMatcher中,
public void addURI(String authority, String path, int code)
其中第一个参数authority:就是URI对应的authority
path:就是我们在URI中 authority后的那一串
code:表示匹配成功以后的返回值;
下面以我们的URI=content://com.example.transportionprovider/trains/122来演示一下
public static final String AUTHORITY = "com.alexzhou.provider.NoteProvider"; private static final UriMatcher sUriMatcher; static { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); sUriMatcher.addURI(AUTHORITY, "trains", 1); sUriMatcher.addURI(AUTHORITY, "trains/#", 2); }
上段代码中:
sUriMatcher.addURI(AUTHORITY, "trains", 1);
表示匹配content://com.example.transportionprovider/trains,如果匹配成功返回1
sUriMatcher.addURI(AUTHORITY, "trains/#", 2);
其中
#表示匹配任意数据ID
*表示匹配任意文本
所以这句的意思就是匹配content://com.example.transportionprovider/trains/任意数字ID 比如我们的content://com.example.transportionprovider/trains/122
在匹配以后就是响应请求啦。至于如何响应请求就在下节在讲了,这节就主要把流程给大家讲清楚及涉及到有知识,到这,整体流程就讲完了,但还有个地方还没说,就是第三方应用如何根据URI来指定操作的,是哪个函数来操作URI的呢?
它就是ContentResolver;
下面简单先说一下ContentResolver的函数:
插入(insert):
String CONTENT_URI = content://com.example.transportionprovider/trains/122; ContentResolver cr =getContentResolver(); ContentValues values = new ContentValues(); values.put("title", "hello");//数据库的键值对 values.put("content", "my name is harvic"); Uri uri = cr.insert(CONTENT_URI, values);
在第三方中,我们要向指定应用的数据库中插入一条记录,其中title字段的值为hello,content字段的值为my name is harvic。就是用上面的这一段代码,有没有很简单
这段代码一调用,那可就吊了,系统会搜索手机上所有APP的AndroidManifest.xml,看哪个provider的authority匹配,在匹配之后,转到对应的类中,再让UriMatcher匹配后面的PATH字段,都完全匹配之后,就执行ContentProvider中的insert方法!!!!这就是是整个流程。
当然ContentResolver除了insert方法还有query()、update()、delete()方法,可以执行第三方数据库的任何操作。
好了,到这整个流程就讲完,想必大家对ContentProvider涉及到的几部分也都清楚了吧。下篇给大家用实例讲讲,他们是如何工作的。
http://blog.csdn.net/harvic880925/article/details/44521461 谢谢!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go 언어는 효율적이고 간결하며 배우기 쉬운 프로그래밍 언어입니다. 동시 프로그래밍과 네트워크 프로그래밍의 장점 때문에 개발자들이 선호합니다. 실제 개발에서 데이터베이스 작업은 필수적인 부분입니다. 이 기사에서는 Go 언어를 사용하여 데이터베이스 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. Go 언어에서는 일반적으로 사용되는 SQL 패키지, Gorm 등과 같은 타사 라이브러리를 사용하여 데이터베이스를 운영합니다. 여기서는 sql 패키지를 예로 들어 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. MySQL 데이터베이스를 사용하고 있다고 가정합니다.

Hibernate 다형성 매핑은 상속된 클래스를 데이터베이스에 매핑할 수 있으며 다음 매핑 유형을 제공합니다. Join-subclass: 상위 클래스의 모든 열을 포함하여 하위 클래스에 대한 별도의 테이블을 생성합니다. 클래스별 테이블: 하위 클래스별 열만 포함하는 하위 클래스에 대한 별도의 테이블을 만듭니다. Union-subclass: Joined-subclass와 유사하지만 상위 클래스 테이블이 모든 하위 클래스 열을 통합합니다.

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

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()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

PHP는 웹사이트 개발에 널리 사용되는 백엔드 프로그래밍 언어로, 강력한 데이터베이스 운영 기능을 갖추고 있으며 MySQL과 같은 데이터베이스와 상호 작용하는 데 자주 사용됩니다. 그러나 한자 인코딩의 복잡성으로 인해 데이터베이스에서 잘못된 한자를 처리할 때 문제가 자주 발생합니다. 이 기사에서는 잘못된 문자의 일반적인 원인, 솔루션 및 특정 코드 예제를 포함하여 데이터베이스에서 중국어 잘못된 문자를 처리하기 위한 PHP의 기술과 사례를 소개합니다. 문자가 왜곡되는 일반적인 이유는 잘못된 데이터베이스 문자 집합 설정 때문입니다. 데이터베이스를 생성할 때 utf8 또는 u와 같은 올바른 문자 집합을 선택해야 합니다.

Golang의 데이터베이스 콜백 기능을 사용하면 다음을 달성할 수 있습니다. 지정된 데이터베이스 작업이 완료된 후 사용자 정의 코드를 실행합니다. 추가 코드를 작성하지 않고도 별도의 함수를 통해 사용자 정의 동작을 추가할 수 있습니다. 삽입, 업데이트, 삭제, 쿼리 작업에 콜백 함수를 사용할 수 있습니다. 콜백 함수를 사용하려면 sql.Exec, sql.QueryRow, sql.Query 함수를 사용해야 합니다.
