BuildContentProvider_BasicSetting.zip
0. Result (커스텀 컨텐트 프로바이더를 적용하기 전 화면)
1. Android SDK에서 제공하는 ContentProvider 추상 클래스를 상속받는 새로운 프로바이더 클래스를 만든다.
안드로이드의 컨텐트 프로바이더를 상속받음으로써 해당 클래스가 유효한 프로바이더로 인식될 수 있다.
onCreate 메서드에 데이터 소스를 설정하는 데 필요한 초기화 코드를 작성한다.
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
'Android' 카테고리의 다른 글
Custom Content Provider - (3) 데이터 조회 (0) | 2018.02.12 |
---|---|
Custom Content Provider - (2) URIMatcher 생성 및 데이터 삽입 (0) | 2018.01.13 |
Content Provider - (3) 코드에 적용하기 (0) | 2018.01.08 |
Content Provider - (2) 사용방법 (0) | 2018.01.08 |
Content Provider - (1) 개념 (0) | 2018.01.08 |