2017-04-19 75 views
1

所以,我已經使用Realm一段時間了。目前,我有一項任務是與其他應用程序共享登錄數據。與內容提供商的領域

由於登錄數據使用境界存儲。我選擇使用Content Provider。

我發現了一個例子:https://speakerdeck.com/androhi/realm-with-contentprovider

不幸的是,我無法使它工作。這是我的內容提供商應用程式

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(這需要獲得登錄數據)得到了掛在我

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

我不知道爲什麼,但它的工作以及當我使用SQlite時。所以我假設Realm與Content Provider smh不能很好地協作。真的嗎?

如果不是,請告訴我一個樣品,使用內容提供商與境界。

謝謝!

+0

你設置'androi d:multiprocess'爲true? – Dalinaum

回答

1

Content Provider與RealmDB很好地協作。

所有你需要做的是重寫的ContentProvider內部的CRUD方法。請看下面的內容提供者類。 3個注意事項:

  1. RealmDB在 ContentProvider的(而不是應用程序活動)

  2. 你重寫CRUD方法的onCreate()方法初始化(查詢,插入,刪除,更新)以適合RealmDB的方式。檢查下面的樣品。

  3. 這就是你需要做的一切。在其餘代碼中,您將使用回收查看器,適配器,加載器,服務等本機組件。在任何需要查詢的地方,您都可以使用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++; 
 
     } 
 

 
    } 
 
}

您可以在這裏找到完整的工作程序 https://github.com/rgherta/RealmTodo

好運