SqLiteDatabase可写Vs.只读

时间:2017-10-29 18:05:06

标签: java android samba sqliteopenhelper

我不明白为什么他们在Logical OR中写两个相反的变量。 真|| False = True,或False || True = True 。为什么需要这项检查?

result = "' {} '".format(",".join('"{}"'.format(i) for i in lst))

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

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

上面介绍的代码存根是在第222行到第231行的SQLiteOpenHelper类中

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

2 个答案:

答案 0 :(得分:1)

您误解了writable参数。它不指示当前数据库或连接的状态。它指示用户是否需要可以写入的数据库连接,或者只读连接是否足够。

这一特定行说 - 如果用户不想要可写连接,,如果数据库允许用户写,那么当前数据库就可以了。换句话说,如果用户专门请求了可写数据库,那么我们将超过这一行(并做更多连接),但当前连接是只读的。

答案 1 :(得分:1)

Writable定义为:

  1. 如果磁盘是R-W
  2. 如果写入数据库的进程具有写入权限。
  3. 注意:可写与此处的理解无关。

    对于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)。现在,从这个&操作,ReadOnly始终确保即使数据库是OPEN_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 +单击来查看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仍然因为没有磁盘空间而无法写入。现在,我相信,你很清楚。