当前位置: 首页 > 面试题库 >

Javafxports和SQLite->打开失败:EPERM(不允许操作)

从景曜
2023-03-14
问题内容

我试图用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.**.*']
    }
}

我的JavaCode:

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数据库?

谢谢


问题答案:

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

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

您提供的URL可能在您的桌面上工作,但不能在移动设备上工作,在该设备上,该应用对存储的访问非常受限,并且仅授予对私有本地存储的访问权限。

使用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) { }


 类似资料:
  • 我正在做一个Android Studio项目,有几个活动。我目前正在尝试读取localhost上的Java Servlet的输出,但它似乎由于套接字权限而崩溃。 我做了一个新的项目,使用了完全相同的代码,工作很完美。所以我不明白为什么不愿意在我的项目上工作。 我希望它读取数据,但它在这一行崩溃: 这是错误输出:

  • 问题内容: 我跑了 运行该命令后,当尝试在Windows OS上运行任何npm命令时,我不断收到以下内容。 已从删除所有文件 它不起作用。 有什么建议吗? 问题答案: 运行此命令是我的错误。 npm config设置前缀/ usr / local 路径不适用于Windows。此命令在以下位置更改了前缀变量 要访问此目录并对其进行更改,我需要以管理员身份运行cmd。 所以我做了: 以管理员身份运行c

  • 我跑 在运行该命令之后,当尝试在Windows操作系统上运行任何npm命令时,我不断得到以下信息。 已从中删除所有文件 它没有工作。 有什么建议吗?

  • 嗨,我是java laungage一个有一个映射片段,如果我经常打开对话框并执行一些操作。我得到了 set_timerslack_ns写入失败:不允许操作 我已经尝试过这个解决方案,当运行地图活动时,应用程序崩溃,但问题是一样的。什么时候研发的,它显示在地图碎片上显示对话框导致了这个问题。有没有办法解决...?将标记添加到清单无法解决我的问题。

  • 我在OpenVZ服务器上创建LXC容器时遇到问题,当LXC尝试创建接口时,我收到下面的错误提示。我不确定OpenVZ是否允许这种配置,这是我第一次尝试。我一直在互联网上寻找解决方案,但我没有找到任何方法来解决我的问题。谢谢你的帮助。谢谢 root@websrv:~#lxc启动ubuntu: 18.04 ubuntu 创建ubuntu启动ubuntu错误:运行失败: /usr/lib/lxd/lxd

  • 在我的windows服务器上安装了nodejs和npm。运行命令npm install-g botium cli,然后上载工作的botium。json和COVA文件。 这是一个全新的装置。我需要更改任何设置吗? 启动botium时,出现以下错误: C:\用户\管理员 错误: EPERM:不允许操作,在GlobSyncbject.readdir同步(fs.js:790: 3)扫描“C:/用户/管理员