0

我的应用程序使用 SQLite DB,用 aSQLiteOpenHelper和 a包装ContentProvider。我在应用程序中添加了登录功能,现在我希望每个用户只能看到自己的数据。我认为实现这一点的方法是让应用程序为登录到应用程序的每个用户创建一个单独的数据库,并在数据库的文件名中使用用户的 ID。

我有这个ContentProvider

public class MyProvider extends ContentProvider {

    //...

    @Override
    public boolean onCreate() {
    dbHelper = new MyDBHelper(getContext());
    return true;
}

我有这个SQLiteOpenHelper

public class MyDBHelper extends SQLiteOpenHelper {

哪个有这个构造函数:

public MyDBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

到目前为止,该应用程序不能拥有多个用户,因此它只有一个数据库。所以DB_NAME总是相同的字符串。我现在尝试这样设置:

private static String UID = FirebaseAuth.getInstance().getCurrentUser().getUid();
public static final String DB_NAME = String.format("data%s.db", UID);

(如您所见,我正在使用Firebase身份验证)

但这导致了崩溃,因为显然内容提供者是在应用程序启动时创建的,在用户进行身份验证之前。(user空值也是如此。是的,我应该user在尝试调用之前检查它是否为空值getUid()。但这不会使这件事起作用)

所以这似乎不是正确的方法。如何根据签名用户使用不同的数据库?我可以在用户通过身份验证后首先创建内容提供者吗?

我也可以将所有内容保存在一个数据库中并添加一UID列。但这是否能很好地保护不同用户的数据?此外,这将意味着更多的代码更改。

4

2 回答 2

0

似乎这里正确的解决方案是不使用ContentProviders. 所以我接受了另一个答案。

但要回答我的实际问题,对于那些决心让不同的数据库与一个数据库一起工作的人ContentProvider来说,这是如何完成的:

我将 customSQLiteOpenDBHelper的构造函数更改为也采用uid

    public MyDBHelper(Context context, String uid) {
        super(context, String.format(DB_NAME, uid), null, DB_VERSION);
        UID = uid;
    }

我改变了onCreate我的ContentProvider不创建DBHelper. 我创建了这个函数来初始化DBHelper

    public void initDB(Uri uri) {
        String uid = uri.getPathSegments().get(0);
        if (dbHelper == null){
            dbHelper = new MyDBHelper(getContext(), uid);
        } else if (!uid.equals(dbHelper.UID)){
            dbHelper.close();
            dbHelper = new MyDBHelper(getContext(), uid);
        }
    }

query我在、insert和方法update的开头调用此delete方法。

因此DBHelper,只要内容提供者对 DB 执行某些操作,但与 DB 尚不存在连接,或者该连接与不同用户的 DB 连接,就会初始化与 DB 的打开连接。

这不是解决此问题的正确方法,并且在某些情况下可能会产生后果。但我不想让我提出的问题得不到回答。

于 2018-07-09T14:05:42.667 回答
0

如何根据签名用户使用不同的数据库?

简单的解决方案是摆脱ContentProvider. 使用 a 的唯一原因ContentProvider是您要将这些数据提供给其他应用程序。

另外,我会小心翼翼地getUid()把它放在一个文件名中。您无法控制getUid()返回的内容,并且有一天它可能包含文件名中无效的字符。

我可以在用户通过身份验证后首先创建内容提供者吗?

不,对不起。

于 2018-07-07T17:37:04.393 回答