我试图用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脚本中:
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) { }