땀이 삐질삐질 나는 개발 일기

다른 앱과 Data Share하는 방법 Feat. ContentProvider 본문

개발 Tip

다른 앱과 Data Share하는 방법 Feat. ContentProvider

삐질 2019. 5. 17. 15:42

개요

  1. A 앱와 B앱 간의 데이터 Share를 위한 ContentProvider 소스 샘플
      -  중요한 건  다른 앱 간의  Interface를 맞추는 작업 이라는 것
      -  앱과 앱이 Direct Access가 허용되지 않는다는 것


본론 

  1. 필요한 개념:  ContentProvider , Uri Scheme. Sqlite ,Room 
       - 참고로 Room을 사용해 Db 객체를 얻어왔다. →  SupportSqlLiteDatabase 

  2. Room 객체는 SingleTone 처리 할 것. ( DB 객체 IO작업은 생각보다 무겁다고 함 ) → 자세히 알아볼 것



  • A의 작업 (데이터를 보관하는 앱)

public class MyContentProvider extends ContentProvider {
    private SupportSQLiteDatabase db;
    @Override
    public boolean onCreate() {
        AppDatabase database =MyApplication.getAppDatabase();
        if(database==null){
            MyApplication.initDataBase(getContext());
        }
        db = MyApplication.getAppDatabase().getOpenHelper().getReadableDatabase();
        return (db == null) ? false : true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        Cursor cursor =  db.query("SELECT * FROM someList"); // Room의 장점 -> 기존의 SqlIte처럼 파라미터 뜻을 알아야하거나 그럴 필요가 없음. 바로 String형 Query를 때릴 수 있음.
        cursor.setNotificationUri(getContext().getContentResolver(),uri);
        return cursor;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }
}




<!-- Uri 스키마 --> <provider android:authorities="{패키지}.MyContentProvider" android:name="{Path.MyContentProvider" android:exported="true"/> <provider


  • B의 작업(데이터를 요청하는 앱)


 

ContentObserver contentObserver = new ContentObserver(new Handler()) {
        @Override
        public boolean deliverSelfNotifications() {
            return super.deliverSelfNotifications();
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            super.onChange(selfChange, uri);
            MakeLog.log("change",uri.getLastPathSegment());
        }
    };




 @Override
    protected void onDestroy() {
        super.onDestroy();
        /* Unregist 하지 않으면 메모리 누수의 위험*/
        resolver.unregisterContentObserver(contentObserver);
    }




   Cursor c = resolver.query(Uri.parse(URL), null, null, null, null);
                    List<String> list = new ArrayList<>();
                    while (c.moveToNext()) {
                        MakeLog.log("유저아이디",""+c.getString(c.getColumnIndex("userId")));
                        list.add(c.getString(c.getColumnIndex("userId")));

                    }


Comments