SqLiteDatabase 可写 Vs。只读
SqLiteDatabase writable Vs. ReadOnly
我不明白为什么他们在逻辑或中写两个相反的变量。 正确 ||假 = 真,或假 ||真=真。为什么这个检查是必要的?
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 class 从第 222 行到 231
您误解了 writable
参数。它不指示当前数据库或连接的状态。它表明 用户 是否需要他们可以写入的数据库连接,或者只读连接是否足够。
这一行说 - 如果用户不想要可写连接,或如果数据库允许用户写入,那么当前数据库就可以了.换句话说,如果用户明确请求可写数据库,但当前连接是只读的,我们将越过这一行(并做更多的连接工作)。
可写定义为:
- 如果磁盘是R-W
- 如果写入数据库的进程有写权限。
注意:Writable与你在这里的理解无关。
对于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 变为假。
这就是为什么对于每个文件和数据库,上面实现的 & 操作都是可靠的。
证明:
如果你ctrl+Alt点击isReadOnly()的方法,你会看到下面的代码行。
public boolean isReadOnly() {
synchronized (mLock) {
return isReadOnlyLocked();
}
}
你进一步Ctrl+Alt+点击方法isReadOnlyLocked(),你会看到下面的代码行。
private boolean isReadOnlyLocked() {
return (mConfigurationLocked.openFlags & OPEN_READ_MASK) == OPEN_READONLY;
}
你可以看到 OPEN_READ_MASK 和 OPEN_READONLY 是如何通过进一步的 Ctrl+Alt+click 来定义的,你会看到下面的代码行。
/**
* 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 仍然因为没有磁盘 space,您无法写入。现在,相信你已经清楚了。
我不明白为什么他们在逻辑或中写两个相反的变量。 正确 ||假 = 真,或假 ||真=真。为什么这个检查是必要的?
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 class 从第 222 行到 231
您误解了 writable
参数。它不指示当前数据库或连接的状态。它表明 用户 是否需要他们可以写入的数据库连接,或者只读连接是否足够。
这一行说 - 如果用户不想要可写连接,或如果数据库允许用户写入,那么当前数据库就可以了.换句话说,如果用户明确请求可写数据库,但当前连接是只读的,我们将越过这一行(并做更多的连接工作)。
可写定义为:
- 如果磁盘是R-W
- 如果写入数据库的进程有写权限。
注意:Writable与你在这里的理解无关。
对于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 变为假。
这就是为什么对于每个文件和数据库,上面实现的 & 操作都是可靠的。
证明:
如果你ctrl+Alt点击isReadOnly()的方法,你会看到下面的代码行。
public boolean isReadOnly() {
synchronized (mLock) {
return isReadOnlyLocked();
}
}
你进一步Ctrl+Alt+点击方法isReadOnlyLocked(),你会看到下面的代码行。
private boolean isReadOnlyLocked() {
return (mConfigurationLocked.openFlags & OPEN_READ_MASK) == OPEN_READONLY;
}
你可以看到 OPEN_READ_MASK 和 OPEN_READONLY 是如何通过进一步的 Ctrl+Alt+click 来定义的,你会看到下面的代码行。
/**
* 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 仍然因为没有磁盘 space,您无法写入。现在,相信你已经清楚了。