2017-04-19 1 views
1

저는 잠시 동안 렐름을 사용했습니다. 현재로서는 로그인 데이터를 내 다른 앱과 공유하는 작업이 있습니다.콘텐츠를 공급하는 영역

로그인 데이터가 영역을 사용하여 저장되기 때문에. 나는 콘텐츠 제공자를 선택한다. https://speakerdeck.com/androhi/realm-with-contentprovider

불행하게도, 나는 그것이 작동되도록 할 수 없습니다 :

나는 예를 발견했다. 이것은 그러나이 일을 왜

getContentResolver.query(uri, null, null, null, null); 

내가 모를 때 정지 에서 내 콘텐츠 공급자 (로그인 데이터를 얻을 필요)를

static final String[] sColumns = new String[]{ 
     "LoginResultData" 
}; 

public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, 
        @Nullable String[] selectionArgs, @Nullable String sortOrder) { 

    Realm mRealm = Realm.getDefaultInstance(); 

    RealmQuery<LoginResultData> query = mRealm.where(LoginResultData.class); 
    LoginResultData result = query.findFirst(); 

    String json = new Gson().toJson(result); 

    MatrixCursor matrixCursor = new MatrixCursor(sColumns); 
    Object[] rowData = new Object[]{json}; 
    matrixCursor.addRow(rowData); 

    return matrixCursor; 
} 

앱 B app 해당있어입니다 잘 SQlite를 사용할 때. 따라서 Realm이 컨텐츠 제공자 smh와 잘 작동하지 않는다고 가정합니다. 그게 사실이야?

아니요, Realm에서 컨텐츠 제공자를 사용하는 샘플을 보여주십시오.

감사합니다!

+0

사용자가 설정 했 여기에 전체 작업 응용 프로그램 https://github.com/rgherta/RealmTodo

행운을 찾을 수 있습니다'androi d : 다중 처리 '를 true로 설정 하시겠습니까? – Dalinaum

답변

1

콘텐츠 공급자는 RealmDB와 잘 작동합니다.

ContentProvider 내부의 CRUD 메소드를 재정의 (override)하면됩니다. 아래의 콘텐츠 제공자 클래스를 살펴보십시오. 3 가지 참고 사항 :

    RealmDB는 (삭제, 업데이트, 쿼리, 삽입)를 컨텐트 프로 (안 앱 활동)

  1. 당신은 CRUD 메소드를 오버라이드 (override)의에서 onCreate() 메소드에서 초기화

  2. RealmDB에 적합한 방식으로 아래 샘플을 확인하십시오.

  3. 이것은 모두 수행해야합니다. 나머지 코드에서는 recyclerview, adapter, loaders, services와 같은 기본 구성 요소를 사용하게됩니다. 어디에서나 쿼리가 필요하면 getContentResolver.query (uri, null, null, null, null)로 호출합니다.

TaskProvider.java

package com.example.rgher.realmtodo.data; 
 

 
import android.app.job.JobInfo; 
 
import android.app.job.JobScheduler; 
 
import android.content.ComponentName; 
 
import android.content.ContentProvider; 
 
import android.content.ContentUris; 
 
import android.content.ContentValues; 
 
import android.content.Context; 
 
import android.content.UriMatcher; 
 
import android.database.Cursor; 
 
import android.database.MatrixCursor; 
 
import android.net.Uri; 
 
import android.support.annotation.Nullable; 
 
import android.text.format.DateUtils; 
 
import android.util.Log; 
 

 
import io.realm.DynamicRealm; 
 
import io.realm.Realm; 
 
import io.realm.RealmConfiguration; 
 
import io.realm.RealmMigration; 
 
import io.realm.RealmResults; 
 
import io.realm.RealmSchema; 
 

 
import com.example.rgher.realmtodo.data.DatabaseContract.TaskColumns; 
 

 
public class TaskProvider extends ContentProvider { 
 
    private static final String TAG = TaskProvider.class.getSimpleName(); 
 

 
    private static final int CLEANUP_JOB_ID = 43; 
 
    private static final int TASKS = 100; 
 
    private static final int TASKS_WITH_ID = 101; 
 

 
    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
 
    static { 
 
     // content://com.example.rgher.realmtodo/tasks 
 
     sUriMatcher.addURI(DatabaseContract.CONTENT_AUTHORITY, 
 
       DatabaseContract.TABLE_TASKS, 
 
       TASKS); 
 

 
     // content://com.example.rgher.realmtodo/tasks/id 
 
     sUriMatcher.addURI(DatabaseContract.CONTENT_AUTHORITY, 
 
       DatabaseContract.TABLE_TASKS + "/#", 
 
       TASKS_WITH_ID); 
 
    } 
 

 
    @Override 
 
    public boolean onCreate() { 
 

 
     //Innitializing RealmDB 
 
     Realm.init(getContext()); 
 
     RealmConfiguration config = new RealmConfiguration.Builder() 
 
       .schemaVersion(1) 
 
       .migration(new MyRealmMigration()) 
 
       .build(); 
 
     Realm.setDefaultConfiguration(config); 
 

 
     manageCleanupJob(); 
 

 
     return true; 
 
    } 
 

 
    @Nullable 
 
    @Override 
 
    public String getType(Uri uri) { 
 
     return null; /* Not used */ 
 
    } 
 

 
    @Nullable 
 
    @Override 
 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
 
         String sortOrder) { 
 

 
     int match = sUriMatcher.match(uri); 
 

 
     //Get Realm Instance 
 
     Realm realm = Realm.getDefaultInstance(); 
 
     MatrixCursor myCursor = new MatrixCursor(new String[]{TaskColumns._ID, TaskColumns.DESCRIPTION 
 
       , TaskColumns.IS_COMPLETE, TaskColumns.IS_PRIORITY 
 
       , TaskColumns.DUE_DATE 
 
     }); 
 

 
     try { 
 
      switch (match) { 
 
       //Expected "query all" Uri: content://com.example.rgher.realmtodo/tasks 
 

 
       case TASKS: 
 
        RealmResults<RealmTask> tasksRealmResults = realm.where(RealmTask.class).findAll(); 
 
        for (RealmTask myTask : tasksRealmResults) { 
 
         Object[] rowData = new Object[]{myTask.getTask_id(), myTask.getDescription(), myTask.getIs_complete() 
 
           , myTask.getIs_priority(), myTask.getDue_date()}; 
 
         myCursor.addRow(rowData); 
 
         Log.v("RealmDB", myTask.toString()); 
 
        } 
 
        break; 
 

 
       //Expected "query one" Uri: content://com.example.rgher.realmtodo/tasks/{id} 
 
       case TASKS_WITH_ID: 
 
        Integer id = Integer.parseInt(uri.getPathSegments().get(1)); 
 
        RealmTask myTask = realm.where(RealmTask.class).equalTo("task_id", id).findFirst(); 
 
        myCursor.addRow(new Object[]{myTask.getTask_id(), myTask.getDescription(), myTask.getIs_complete(), myTask.getIs_priority(), myTask.getDue_date()}); 
 
        Log.v("RealmDB", myTask.toString()); 
 
        break; 
 
       default: 
 
        throw new UnsupportedOperationException("Unknown uri: " + uri); 
 
      } 
 

 

 
     myCursor.setNotificationUri(getContext().getContentResolver(), uri); 
 
     } finally { 
 
      realm.close(); 
 
     } 
 
     return myCursor; 
 

 
    } 
 

 
    @Nullable 
 
    @Override 
 
    public Uri insert(Uri uri, final ContentValues contentValues) { 
 
     //COMPLETE: Expected Uri: content://com.example.rgher.realmtodo/tasks 
 

 
     //final SQLiteDatabase taskDb = mDbHelper.getReadableDatabase(); 
 
     int match = sUriMatcher.match(uri); 
 
     Uri returnUri; 
 

 
     //Get Realm Instance 
 
     Realm realm = Realm.getDefaultInstance(); 
 
     try { 
 
      switch (match) { 
 
       case TASKS: 
 
        realm.executeTransaction(new Realm.Transaction() { 
 
         @Override 
 
         public void execute(Realm realm) { 
 

 
          Number currId = realm.where(RealmTask.class).max(TaskColumns._ID); 
 
          Integer nextId = (currId == null) ? 1 : currId.intValue() + 1; 
 

 
          RealmTask myNewTask = realm.createObject(RealmTask.class, nextId); 
 
          myNewTask.setDescription(contentValues.get(TaskColumns.DESCRIPTION).toString()); 
 
          myNewTask.setIs_complete((Integer) contentValues.get(TaskColumns.IS_COMPLETE)); 
 
          myNewTask.setIs_priority((Integer) contentValues.get(TaskColumns.IS_PRIORITY)); 
 
          myNewTask.setDue_date((Long) contentValues.get(TaskColumns.DUE_DATE)); 
 
         } 
 
        }); 
 
        returnUri = ContentUris.withAppendedId(DatabaseContract.CONTENT_URI, '1'); 
 
        break; 
 

 
       default: 
 
        throw new UnsupportedOperationException("Unknown uri: " + uri); 
 
      } 
 

 
      getContext().getContentResolver().notifyChange(uri, null); 
 
     }finally { 
 
      realm.close(); 
 
     } 
 
     return returnUri; 
 
    } 
 

 
    @Override 
 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
 

 
     //Expected Uri: content://com.example.rgher.realmtodo/tasks/{id} 
 
     Realm realm = Realm.getDefaultInstance(); 
 

 
      int match = sUriMatcher.match(uri); 
 
      int nrUpdated = 0; 
 
     try { 
 
      switch (match) { 
 
       case TASKS_WITH_ID: 
 
        Integer id = Integer.parseInt(uri.getPathSegments().get(1)); 
 
        RealmTask myTask = realm.where(RealmTask.class).equalTo("task_id", id).findFirst(); 
 
        realm.beginTransaction(); 
 
        myTask.setIs_complete(Integer.parseInt(values.get(TaskColumns.IS_COMPLETE).toString())); 
 
        if (values.get(TaskColumns.DUE_DATE) != null) { 
 
         myTask.setDue_date(Long.valueOf(values.get(TaskColumns.DUE_DATE).toString())); 
 
        } 
 
        nrUpdated++; 
 
        realm.commitTransaction(); 
 
        break; 
 
       default: 
 
        throw new UnsupportedOperationException("Unknown uri: " + uri); 
 
      } 
 

 

 
     } finally { 
 
      realm.close(); 
 
     } 
 

 
     if (nrUpdated != 0) { 
 
      getContext().getContentResolver().notifyChange(uri, null); 
 
     } 
 
     return nrUpdated; 
 
    } 
 

 
    @Override 
 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
 
     int count = 0; 
 
     Realm realm = Realm.getDefaultInstance(); 
 
     try { 
 
      switch (sUriMatcher.match(uri)) { 
 
       case TASKS: 
 
        selection = (selection == null) ? "1" : selection; 
 
        RealmResults<RealmTask> tasksRealmResults = realm.where(RealmTask.class).equalTo(selection, Integer.parseInt(selectionArgs[0])).findAll(); 
 
        realm.beginTransaction(); 
 
        tasksRealmResults.deleteAllFromRealm(); 
 
        count++; 
 
        realm.commitTransaction(); 
 
        break; 
 
       case TASKS_WITH_ID: 
 
        Integer id = Integer.parseInt(String.valueOf(ContentUris.parseId(uri))); 
 
        RealmTask myTask = realm.where(RealmTask.class).equalTo("task_id", id).findFirst(); 
 
        realm.beginTransaction(); 
 
        myTask.deleteFromRealm(); 
 
        count++; 
 
        realm.commitTransaction(); 
 
        break; 
 
       default: 
 
        throw new IllegalArgumentException("Illegal delete URI"); 
 
      } 
 
     } finally { 
 
      realm.close(); 
 
     } 
 
     if (count > 0) { 
 
      //Notify observers of the change 
 
      getContext().getContentResolver().notifyChange(uri, null); 
 
     } 
 

 
     return count; 
 
    } 
 

 
} 
 

 
// Example of REALM migration 
 
class MyRealmMigration implements RealmMigration { 
 
    @Override 
 
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 
 

 
     RealmSchema schema = realm.getSchema(); 
 

 
     if (oldVersion != 0) { 
 
      schema.create(DatabaseContract.TABLE_TASKS) 
 
        .addField(DatabaseContract.TaskColumns._ID, Integer.class) 
 
        .addField(DatabaseContract.TaskColumns.DESCRIPTION, String.class) 
 
        .addField(DatabaseContract.TaskColumns.IS_COMPLETE, Integer.class) 
 
        .addField(DatabaseContract.TaskColumns.IS_PRIORITY, Integer.class); 
 
      oldVersion++; 
 
     } 
 

 
    } 
 
}

당신은

관련 문제