SQLib

SQLib

存储所有Minecraft数据的最简单方式!

基础库

Maintenance PRs Welcome

ko-fi

SQLib

SQLib 是满足您所有 Minecraft 数据存储需求的最简单方式!一个专注于 Minecraft 用例的简单 SQL 封装库。

重要说明:

该库并非功能完整的 SQL 封装库,也未提供对许多 SQL 功能的完整访问。该库的主要目标是为您的模组提供一种简便的数据存储方式。如果您需要更高级的数据库,建议参考 Nitrite 等类似项目。

配置

模组在首次启动时会生成一份配置文件,允许您配置所有依赖 sqlib 的模组所使用的数据库。默认数据库是运行在 sqlib 目录下的 SQLite 数据库。

数据类型

数据类型可以通过 JavaTypes、MinecraftTypes 或 AdventureTypes 类进行访问。我倾向于在自己的项目中遇到新类型时添加相应的支持。如果您希望添加某类型,请提交问题!

标准 Minecraft Adventure
Byte Vec3i Key
Byte[] BlockPos Component
Bool ChunkPos
Short Text
Int Identifier
Float Sound
Double Json
Long NbtElement
String
Char
Date
Color
UUID
URI
URL

您也可以像下面这样添加自己的自定义类型:

设置

在您的 build.gradle 中包含:

repositories {
    maven { url "https://api.modrinth.com/maven" }
}

dependencies {
  modImplementation("maven.modrinth:sqlib:3.2.2")
}

开发者用法

以下示例使用由 sqlib 管理的内置数据库。对 99% 的模组而言,使用内置数据库已经足够,不过下文还有自定义数据库管理的示例。

// 不要在模组早期初始化阶段调用 SQLib.getDatabase()。否则很可能会导致您的模组崩溃。
// 在常规模组初始化阶段或之后调用是安全的。
Database db = SQLib.getDatabase();

DataStore store = db.dataStore("myModId", "userdata");
        
DataContainer playerData = store.createDataContainer();
playerData.put(JavaTypes.STRING, "username", "CoolGuy123");
playerData.put(MinecraftTypes.BLOCKPOS, "home", new BlockPos(304, 62, 37));
playerData.put(MinecraftTypes.NBT, "nbt", new NbtCompound());

System.out.println(playerdata.get(JavaTypes.STRING, "username"));
System.out.println(playerdata.get(MinecraftTypes.BLOCKPOS, "home"));
System.out.println(playerdata.get(MinecraftTypes.NBT, "nbt"));

自定义数据库管理

Postgres db = new Postgres("name", "192.168.1.69", "3306", "cooluser", "radman");
// 或者
MySQL db = new MySQL("name", "192.168.1.69", "3306", "cooluser", "radman");
// 或者
SQLite db = new SQLite("name", "some/dir");

事务支持

此功能会将多个 SQL 命令批量合并为一个命令,以提高大量数据的读写速度。

DataStore store = db.dataStore("modId", "userdata");

DataContainer playerData = table.createDataContainer();
playerData.transaction().put("username", "CoolGuy123").put("home", new BlockPos(304, 62, 37).commit();

自定义类型

您可以按照 JavaTypes、MinecraftTypes 和 AdventureTypes 中的实现方式添加自定义类型。然后就可以像使用其他 SQLib 原生类型一样使用它。

// SQLPrimitive 是用于序列化的基础类型,两个函数式的 Lambda 参数分别用于序列化和反序列化
public static final SQLibType<JsonElement> JSON = new SQLibType<>(SQLPrimitive.STRING, JsonElement::toString, JsonParser::parseString);

// 您也可以这样扩展一个类型:
public static final SQLibType<Identifier> IDENTIFIER = new SQLibType<>(SQLPrimitive.STRING, Identifier::toString, Identifier::tryParse);
public static final SQLibType<SoundEvent> SOUND = new SQLibType<>(IDENTIFIER, SoundEvent::getId, SoundEvent::of);