我有一个复杂的场景。我有2个应用程序共享其中一个的数据库。这是通过使用相同的"共享ID"它工作正常。但是,我还需要授予一个App系统权限来更改设备时间。这也很好。当我想从该应用程序访问SD时出现问题。如果我给它系统权限,我就不能再访问SD了(有没有解决方法?)。我考虑让其他应用程序完成这项工作,但是为了访问数据库,它应该具有相同的#34;共享ID",因此它也应该具有系统权限。
简单地说,我希望应用程序具有系统权限并同时访问SD。我有另一个共享数据库的应用程序。
我找到的一个解决方案是使用ContentProvider,这样我就可以将数据传输到另一个应用程序(不共享相同的ID)并在那里处理SD访问。然而,这种方法需要对我已经拥有的解决方案进行大量修改,这是我的最后手段。我还检查过可以将数据库公开(Mode_world_read),但现在已弃用。
还有其他方法可以克服这个限制吗?一种想法可能是将数据库保存在另一个应用程序可以访问的自定义文件夹中。这可能吗?应用可以访问Android设备上的其他文件夹吗?我可以从不在/ data / data / {package name} / databases /中的数据库中读取吗?请注意,应用程序是私有的,他们不会在应用程序商店中,所以在提供系统权限方面没有问题。
答案 0 :(得分:0)
将数据库共享给其他应用程序的最佳(和正确)方式可能是通过内容提供程序公开数据,否则您可能很快就会遇到任何同步问题,或者两个应用程序都会尝试立即修改DB文件。
我不确定为什么你没有SD访问但听起来你不想访问另一个应用程序的私人存储,这通常是不可能的?
我可以从不在/ data / data / {package中的数据库中读取 name} / databases /?
是。 SQLiteOpenHelper
通过上下文访问数据库。要覆盖数据库路径,您可以使用ContextWrapper
,如:
public class TestContext extends ContextWrapper{
public TestContext(Context base) {
super(base);
}
@Override
public File getDatabasePath(String name) {
// name is passed here from SQLiteOpenHelper
return new File("path to DB on SD card");
}
}
然后,当您创建数据库帮助程序时,请使用TestContext
:
public class TestSQLiteHelper extends SQLiteOpenHelper {
public TestSQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(new TestContext(context), name, factory, version);
}
}
当TestSQLiteHelper
尝试访问数据库文件时,它会调用getDatabasePath()
,其中File
将返回您的自定义路径。