gpt4 book ai didi

sqlite - Javafxports 和 SQLite -> 打开失败 : EPERM (Operation not permitted)

转载 作者:行者123 更新时间:2023-12-02 14:33:13 28 4
gpt4 key购买 nike

我正在尝试使用 javafxports 编写一个简单的 sqlite 代码。

build.gradle:

    buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.javafxports:jfxmobile-plugin:1.0.6'
}
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
jcenter()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
url "https://oss.sonatype.org/content/repositories/releases"
}

}

ext.CHARM_DOWN_VERSION = "1.0.0"

dependencies{
compile 'org.xerial:sqlite-jdbc:3.8.11'

compile "com.gluonhq:charm-down-common:$CHARM_DOWN_VERSION"
desktopRuntime "com.gluonhq:charm-down-desktop:$CHARM_DOWN_VERSION"
androidRuntime "com.gluonhq:charm-down-android:$CHARM_DOWN_VERSION"
iosRuntime "com.gluonhq:charm-down-ios:$CHARM_DOWN_VERSION"
}
mainClassName = 'com.gluonapplication.version16'

jfxmobile {
android {
manifest = 'src/android/AndroidManifest.xml'
}
ios {
infoPList = file('src/ios/Default-Info.plist')
forceLinkClasses= ['com.gluonhq.**.*', 'org.sqlite.**.*']
}
}

我的Java代码:

public static Label msg = new Label();

@Override
public void start(Stage stage) {
StackPane root = new StackPane();

root.getChildren().add(msg);
Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();
Scene scene = new Scene(root, visualBounds.getWidth(), visualBounds.getHeight());

stage.getIcons().add(new Image(version16.class.getResourceAsStream("/icon.png")));
stage.setScene(scene);
stage.show();

try {
testSqli();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void testSqli() throws SQLException, ClassNotFoundException {
String driver = "org.sqlite.JDBC";
//Class.forName("SQLite.JDBCDriver");
Class.forName(driver);
String dbName = "mtt8.db";
String dbUrl = "jdbc:sqlite:" + dbName;

//create table
Statement st = null;
Connection conn = DriverManager.getConnection(dbUrl);
st = conn.createStatement();
st.executeUpdate("DROP TABLE IF EXISTS village;");
st.executeUpdate("CREATE table village (id int, name varchar(20))");
//insert row?
st.executeUpdate("INSERT INTO village VALUES (111, 'Concretepage')");

//select?
String query = "SELECT id, name from village";
ResultSet rs = null;
rs = st.executeQuery(query);

while (rs.next()) {
int id = 0;
id = rs.getInt(1);
String name = null;
name = rs.getString(2);
msg.setText("id:" + id + ", name: " + name);
System.out.println("id:" + id + ", name: " + name);
st.executeUpdate("DELETE from village");
rs.close();
}
}

我用./gradlew launchIOSDevice发送它并收到以下错误:

java.sql.SQLException: opening db: 'mtt8.db': open failed: EPERM (Operation not permitted)
at org.sqlite.core.CoreConnection.open(CoreConnection.java:203)
at org.sqlite.core.CoreConnection.<init>(CoreConnection.java:76)
at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:24)
at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:23)
at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:45)
at org.sqlite.JDBC.createConnection(JDBC.java:114)
at org.sqlite.JDBC.connect(JDBC.java:88)
at java.sql.DriverManager.getConnection(DriverManager.java:179)
at java.sql.DriverManager.getConnection(DriverManager.java:144)
at com.gluonapplication.version16.testSqli(version16.java:48)
at com.gluonapplication.version16.start(version16.java:32)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.LauncherImpl$$Lambda$81.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl$$Lambda$93.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at com.sun.javafx.application.PlatformImpl$$Lambda$105.run(Unknown Source)
at java.security.AccessController.doPrivileged(AccessController.java:52)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.javafx.application.PlatformImpl$$Lambda$92.run(Unknown Source)
at org.robovm.apple.uikit.UIApplication.main(Native Method)
at org.robovm.apple.uikit.UIApplication.main(UIApplication.java:369)
at org.javafxports.jfxmobile.ios.BasicLauncher.main(BasicLauncher.java:115)
IOSWindowSystemInterface : setSwapInterval unimp
setSwapInterval(1)

有人可以帮我吗,我如何在代码中提供访问权限以便我可以创建 sqlite DB?

谢谢埃尔坎·卡普兰

最佳答案

正如 @ItachiUchiha 指出的,您的问题与您尝试创建数据库的位置有关:

String dbUrl = "jdbc:sqlite:" + dbName;
Connection conn = DriverManager.getConnection(dbUrl);

您提供的 URL 可能适用于桌面设备,但不适用于移动设备,因为移动设备上的应用对存储的访问权限非常有限,并且仅授予对私有(private)本地存储的访问权限。

使用 Gluon 的开源库 Charm-Down ,无论应用程序运行在哪个平台上,都可以很容易地获取本地存储的路径。

首先,将这些依赖项添加到您的 build.gradle 脚本中:

ext.CHARM_DOWN_VERSION = "1.0.0"
dependencies {
compile "com.gluonhq:charm-down-common:$CHARM_DOWN_VERSION"
desktopRuntime "com.gluonhq:charm-down-desktop:$CHARM_DOWN_VERSION"
androidRuntime "com.gluonhq:charm-down-android:$CHARM_DOWN_VERSION"
iosRuntime "com.gluonhq:charm-down-ios:$CHARM_DOWN_VERSION"
}

现在,在您的代码中,URL 应该是:

try {
File dir = PlatformFactory.getPlatform().getPrivateStorage();
File db = new File (dir, dbName);
String dbUrl = "jdbc:sqlite:" + db.getAbsolutePath();
Connection conn = DriverManager.getConnection(dbUrl);
...
} catch (Exception e) { }

关于sqlite - Javafxports 和 SQLite -> 打开失败 : EPERM (Operation not permitted),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33649149/

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