BuildContentProvider_BasicSetting.zip

BuildContentProvider_1.zip



0. Result (커스텀 컨텐트 프로바이더를 적용하기 전 화면)


 




1. Android SDK에서 제공하는 ContentProvider 추상 클래스를 상속받는 새로운 프로바이더 클래스를 만든다.


안드로이드의 컨텐트 프로바이더를 상속받음으로써 해당 클래스가 유효한 프로바이더로 인식될 수 있다.

onCreate 메서드에 데이터 소스를 설정하는 데 필요한 초기화 코드를 작성한다.


data/TaskContentProivider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tistory.qlyh8.buildcontentprovider.data;
 
/*
 * Created by YUNHEE on 2018-01-09.
 */
 
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
 
public class TaskContentProvider extends ContentProvider {
 
    private TaskDbHelper mTaskDbHelper;
 
    // 데이터 소스를 설정하는 데 필요한 것을 초기화 해야한다.
    // 이 경우 SQLite 데이터베이스로 작업하기 때문에 DbHelper 를 초기화해야 액세스 할 수 있다.
    @Override
    public boolean onCreate() {
        mTaskDbHelper = new TaskDbHelper(getContext());
        return true;
    }
 
    @Override
    public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {...}
 
    @Override
    public String getType(@NonNull Uri uri) {...}
 
    @Override
    public Uri insert(@NonNull Uri uri, ContentValues values) {...}
 
    @Override
    public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {...}
 
    @Override
    public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {...}
}
 
cs




2. AndroidManifest에서 새로운 프로바이더(TaskContentProvider)를 등록한다.


매니페스트에 등록됨으로써 프로바이더는 시스템에 보이게 되고 앱으로부터 참조될 수 있게 된다.

또한 UI 코드에서 컨텐트 리졸버를 사용해 해당 프로바이더를 호출하게 되었을 때 이 호출을 넘겨줄 수 있다.


AndroidManifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tistory.qlyh8.buildcontentprovider">
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            ...
        </activity>
 
        <activity android:name=".AddTaskActivity"
            android:label="@string/add_task_activity_name"/>
 
        <!-- exported: 컨텐트 프로바이더에 다른 앱이 접근할 수 있을지를 결정한다. -->
        <provider
            android:authorities="com.tistory.qlyh8.buildcontentprovider"
            android:name=".data.TaskContentProvider"
            android:exported="false"/>
 
    </application>
 
</manifest>
cs




3. Contract 클래스의 URI을 추가한다.


URI는 컨텐트 리졸버에게 어떤 프로바이더와 통신할 것인지 그리고 요청하는 특정 데이터가 무엇인지 알려준다.

나중에 컨텐트 리졸버는 해당 프로바이더를 찾을 수 있고, 주어진 URI만으로 특정 데이터를 접근할 수 있다.


URI 예) content://com.android.todolist/tasks/2 : task에서 2라는 id를 가진 행

    (scheme)  (       authority      ) ( path )


Wildcard characters

"path" : "path"경로에 매치

"path/#" : "path" 다음에 길이와 상관없이 모든 정수와 매치 (# = 1,2,3)

"path/*" : "path" 다음에 길이와 상관없이 모든 문자열과 매치 (* = description, priority)

"path/*/other/#" : "path" 다음에 문자열이 오고, "other" 뒤에 정수가 매치


data/TaskContract.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.tistory.qlyh8.buildcontentprovider.data;
 
/*
 * Created by YUNHEE on 2018-01-09.
 */
 
import android.net.Uri;
import android.provider.BaseColumns;
 
public class TaskContract {
 
    // 해당 데이터의 경로에 컨텐츠 URI 를 제공
    public static final String AUTHORITY = "com.tistory.qlyh8.buildcontentprovider";
    public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + AUTHORITY);
    public static final String PATH_TASKS = "tasks";
 
    // BaseColumns 인터페이스로 인해 자동으로 "_ID" 칼럼이 생성된다.
    public static final class TaskEntry implements BaseColumns {
 
        // 자주 사용하는 URI 형식을 참조하는 것을 돕는다.
        public static final Uri CONTENT_URI =
                BASE_CONTENT_URI.buildUpon().appendPath(PATH_TASKS).build();
 
        public static final String TABLE_NAME = "tasks";
 
        public static final String COLUMN_DESCRIPTION = "description";
        public static final String COLUMN_PRIORITY = "priority";
    }
}
 
cs





Android Course of Udacity - Lesson 9

+ Recent posts