Android 具有内容提供者的领域
所以,我已经用了一段时间了。目前,我的任务是与其他应用程序共享登录数据 因为登录数据是使用领域存储的。我选择使用内容提供商 我发现了一个例子: 不幸的是,我无法让它工作。这是应用程序A中的我的内容提供商Android 具有内容提供者的领域,android,realm,android-contentprovider,Android,Realm,Android Contentprovider,所以,我已经用了一段时间了。目前,我的任务是与其他应用程序共享登录数据 因为登录数据是使用领域存储的。我选择使用内容提供商 我发现了一个例子: 不幸的是,我无法让它工作。这是应用程序A中的我的内容提供商 static final String[] sColumns = new String[]{ "LoginResultData" }; public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @N
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;
}
我不知道为什么,但当我使用SQlite时,它工作得很好。所以我假设Realm与内容提供商smh不能很好地协同工作。这是真的吗
如果没有,请向我展示一个将内容提供商与领域结合使用的示例
谢谢 内容提供程序与RealmDB配合良好 您所需要做的就是重写ContentProvider中的CRUD方法。请查看下面的内容提供商类。需要注意的三件事:
package com.example.rgher.realmtodo.data;
导入android.app.job.JobInfo;
导入android.app.job.JobScheduler;
导入android.content.ComponentName;
导入android.content.ContentProvider;
导入android.content.ContentUris;
导入android.content.ContentValues;
导入android.content.Context;
导入android.content.UriMatcher;
导入android.database.Cursor;
导入android.database.MatrixCursor;
导入android.net.Uri;
导入android.support.annotation.Nullable;
导入android.text.format.DateUtils;
导入android.util.Log;
导入io.realm.dynamicrelm;
导入io.realm.realm;
导入io.realm.RealmConfiguration;
导入io.realm.RealmMigration;
导入io.realm.RealmResults;
导入io.realm.RealmSchema;
导入com.example.rgher.realmtodo.data.DatabaseContract.TaskColumns;
公共类TaskProvider扩展了ContentProvider{
私有静态最终字符串标记=TaskProvider.class.getSimpleName();
私有静态最终整型清理作业ID=43;
私有静态最终整数任务=100;
私有静态final int TASKS_,_ID=101;
私有静态最终UriMatcher sUriMatcher=新UriMatcher(UriMatcher.NO_匹配);
静止的{
// content://com.example.rgher.realmtodo/tasks
sUriMatcher.addURI(DatabaseContract.CONTENT\u权限,
DatabaseContract.TABLE_任务,
任务);
// content://com.example.rgher.realmtodo/tasks/id
sUriMatcher.addURI(DatabaseContract.CONTENT\u权限,
DatabaseContract.TABLE_TASKS+“/#”,
任务(具有任务ID);
}
@凌驾
公共布尔onCreate(){
//重新初始化RealmDB
Realm.init(getContext());
RealmConfiguration config=newrealmconfiguration.Builder()
.阴谋厌恶(1)
.migration(新的MyRealmMigration())
.build();
Realm.setDefaultConfiguration(配置);
manageCleanupJob();
返回true;
}
@可空
@凌驾
公共字符串getType(Uri){
返回null;/*未使用*/
}
@可空
@凌驾
公共游标查询(Uri、字符串[]投影、字符串选择、字符串[]选择、字符串,
字符串排序器){
int match=sUriMatcher.match(uri);
//获取领域实例
Realm Realm=Realm.getDefaultInstance();
MatrixCursor myCursor=新MatrixCursor(新字符串[]{TaskColumns.\u ID,TaskColumns.DESCRIPTION
,TaskColumns.IS_完成,TaskColumns.IS_优先级
,TaskColumns.DUE\u日期
});
试一试{
开关(匹配){
//预期的“查询所有”Uri:content://com.example.rgher.realmtodo/tasks
案例任务:
RealmResults tasksRealmResults=realm.where(RealmTask.class).findAll();
对于(RealmTask myTask:tasksrelamresults){
Object[]rowData=新对象[]{myTask.getTask_id(),myTask.getDescription(),myTask.getIs_complete()
,myTask.getIs_priority(),myTask.getDue_date()};
myCursor.addRow(rowData);
Log.v(“RealmDB”,myTask.toString());
}
打破
//预期的“查询一”Uri:content://com.example.rgher.realmtodo/tasks/{id}
具有\u ID的案例任务\u:
整数id=Integer.parseInt(uri.getPathSegments().get(1));
RealmTask myTask=realm.where(RealmTask.class).equalTo(“任务id”,id).findFirst();
myCursor.addRow(新对象[]{myTask.getTask_id(),myTask.getDescription(),myTask.getIs_complete(),myTask.getIs_priority(),myTask.getDue_date());
Log.v(“RealmDB”,myTask.toString());
打破
违约:
抛出新的UnsupportedOperationException(“未知uri:+uri”);
}
myCursor.setNotificationUri(getContext().getContentResolver(),uri);
}最后{
realm.close();
}
返回myCursor;
}
@可空
@凌驾
公共Uri插入(Uri Uri,最终ContentValues ContentValues){
//完成:预期Uri为:content://com.example.rgher.realmtodo/tasks
//最终SQLiteDatabase taskDb=mDbHelper.getReadableDatabase();
int match=sUriMatcher.match(uri);
urireturnuri;
//获取领域实例
Realm Realm=Realm.getDefaultInstance();
试一试{
开关(匹配){
案例任务:
realm.executeTransaction(新realm.Transaction(){
@O
getContentResolver.query(uri, null, null, null, null);
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++;
}
}
}