我不知道为什么他们在逻辑OR中编写两个相反的变量。真实|| False = True,或False ||正确=正确。为什么需要进行此检查?

if (mDatabase != null) {
            if (!mDatabase.isOpen()) {
                // Darn!  The user closed the database by calling mDatabase.close().
                mDatabase = null;
            } else if (!writable || !mDatabase.isReadOnly()) {
                // The database is already open for business.
                return mDatabase;
            }
        }


注意:相同的逻辑也适用于Samba文件共享。有一个Samba解释http://www.linuxtopia.org/online_books/network_administration_guides/using_samba_book/ch04_05_06.html

有人可以在这里澄清我吗?

我上面介绍的代码存根在SQLiteOpenHelper类中,从222行到231行

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/database/sqlite/SQLiteOpenHelper.java

最佳答案

可写的定义为:


如果磁盘是R-W
如果写入数据库的进程具有写入权限。


注意:可写与您在此处的理解无关。

对于ReadOnly,存在逻辑,因为ReadOnly与Writable不相反。这是您感到困惑的地方。

ReadOnly中包含三项内容:OPEN_READONLY,OPEN_READ_MASK和OpenFlags。

注意:OPEN_READONLY与Writable完全相反。这是您不清楚的地方。

说明
OPEN_READ_MASK-我们将其设置为1(即十六进制为0X00000001)
OPEN_READONLY-我们将其设置为1(即十六进制为0X00000001)

OpenFlags-有时为1,有时为0。如果磁盘未满,则为1。如果磁盘已满,则为0。

并且,我们计算ReadOnly =(OpenFlags和OPEN_READ_MASK == OPEN_READONLY)。现在,通过此&操作,即使数据库是OPEN_READONLY,ReadOnly始终可以确保它仍然需要满足它未满的要求。如果已满,则ReadOnly变为false。

因此,对于每个文件和数据库,上述实现和操作都是可靠的。

证明:

如果按ctrl + Alt键,单击isReadOnly()方法,将看到以下代码行。

public boolean isReadOnly() {
        synchronized (mLock) {
            return isReadOnlyLocked();
        }
    }


进一步按Ctrl + Alt +单击方法isReadOnlyLocked(),您将看到以下代码行。

private boolean isReadOnlyLocked() {
        return (mConfigurationLocked.openFlags & OPEN_READ_MASK) == OPEN_READONLY;
    }


您可以看到通过进一步的Ctrl + Alt + click定义OPEN_READ_MASK和OPEN_READONLY的方式,您将看到以下代码行。

/**
     * Open flag: Flag for {@link #openDatabase} to open the database for reading only.
     * This is the only reliable way to open a database if the disk may be full.
     */
    public static final int OPEN_READONLY = 0x00000001;           // update native code if changing

    private static final int OPEN_READ_MASK = 0x00000001;         // update native code if changing


如果磁盘已满,则系统会将openFlags更改为0,以确保即使由于没有磁盘空间而磁盘仍为Openly readOnly,也无法写入。我相信您现在很清楚。

07-24 09:15