在Android 11及以上的设备上,由于Google限制了对外部存储的访问权限,我们需要使用特殊的应用程序间共享方法来进行数据库传输。以下是一种可能的解决方案,其使用ContentProvider进行数据共享。
在发送设备中的应用程序中,需要创建一个ContentProvider类来使另一个设备的应用程序访问数据库。以下是一个示例ContentProvider类:
public class MyContentProvider extends ContentProvider {
private MyDBHelper mDBHelper;
@Override
public boolean onCreate() {
Context context = getContext();
mDBHelper = new MyDBHelper(context);
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.query(MyDBHelper.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(),uri);
return cursor;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
SQLiteDatabase db = mDBHelper.getWritableDatabase();
long id = db.insert(MyDBHelper.TABLE_NAME,null,values);
if(id != -1){
getContext().getContentResolver().notifyChange(uri,null);
return ContentUris.withAppendedId(uri,id);
}
return null;
}
...
//其他ContentProvider方法
}
在另一个设备的应用程序中,您可以使用ContentResolver来访问ContentProvider并进行数据库操作。以下是一个示例:
public class MyActivity extends AppCompatActivity {
private static final String AUTHORITY = "com.example.mycontentprovider";
private static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + MyDBHelper.TABLE_NAME);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);