gpt4 book ai didi

java - SqLiteDatabase 可写 Vs。只读

转载 作者:行者123 更新时间:2023-11-29 19:06:35 27 4
gpt4 key购买 nike

我不明白他们为什么要在逻辑或中写两个相反的变量。 正确||假 = 真,或假 ||真 = 真。为什么这个检查是必要的?

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

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

我上面给出的代码 stub 在 SQLiteOpenHelper 类中的第 222 行到第 231 行

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

最佳答案

可写定义为:

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

注意:这里的可写与你的理解无关。

对于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 仍然因为没有磁盘空间,您无法写入。现在,我相信您已经清楚了。

关于java - SqLiteDatabase 可写 Vs。只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com