2015-11-11 68 views
1

我想用javafxports编码一个简单的sqlite代码。Javafxports和SQLite - >打开失败:EPERM(不允许操作)

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

感谢 二崁卡普兰

+0

什么是你在哪里试图创建数据库文件的目录中的文件权限? – ItachiUchiha

+0

嗨,我不知道。我使用“./gredlew launchIOSDevice”将它部署在我的Ipad中,但是如果我使用“./gredlew run”在桌面上尝试,则everthing是可以的,我可以看到我的数据库并使用SELECT,UPDATE等...仅在Ipad不要在上面的代码中工作。 –

回答

1

由于@ItachiUchiha所指出的,你的问题涉及到你正在尝试创建数据库的地方:

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

您提供可在工作中的网址您桌面上,但不在移动设备上,应用程序访问存储的权限非常有限,并且只允许访问私有本地存储。

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

嗨,何塞,我编辑我的** build.gradle **上面,并添加“魅力”线和forceLinkClasses ....如果我尝试**“./gredlew干净”**和**“./gredlew构建”* *我收到以下错误:'/Users/erkankaplan/Downloads/version16/src/main/java/com/gluonapplication/version16.java:54:error:can not find symbol File dir = PlatformFactory.getPlatform()。getPrivateStorage(); ^ 符号:方法getPlatform() 位置:类PlatformFactory 1错误 :compileJava FAILED' –

+0

和上线** “文件DIR = PlatformFactory.getPlatform()getPrivateStorage();” **是**” getPlatform()“**红色标记(也是错误)......我安装了IntelliJ 5.0CE和Gluon 1.0.1 ... –

+0

确保每次添加时都同步项目(Gradle工具栏上的刷新按钮)依赖。之后,尝试清理并再次构建,依赖关系应该在那里。 –

0

非常感谢JOSE,

这里是我的build.gradle,所以我可以连接到我的Lan上的mysql-server,并将结果保存为ipad-devices上的sqlite.db;

buildscript { 
    repositories { 
     jcenter() 
     mavenCentral() 
     maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } 
    } 
    dependencies { classpath 'org.javafxports:jfxmobile-plugin:1.0.6' } 
} 

apply plugin: 'org.javafxports.jfxmobile' 


repositories { 
    jcenter() 
    mavenCentral() 
    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 'mysql:mysql-connector-java:3.1.12' 
    compile 'org.xerial:sqlite-jdbc:3.9.0-SNAPSHOT' 

    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.mtt8.version15' 

jfxmobile { 
    android { 
     manifest = 'src/android/AndroidManifest.xml' 
     packagingOptions { 
      exclude 'META-INF/INDEX.LIST' 
     } 
    } 

    ios { 
     infoPList = file('src/ios/Default-Info.plist') 
     forceLinkClasses = ['com.mtt8.**.*', 'com.mysql.**.*', 'SQLite.**.*', 'com.gluonhq.**.*'] 
    } 

} 

和sqlite.java

import com.gluonhq.charm.down.common.PlatformFactory; 

import java.io.File; 
import java.io.IOException; 
import java.sql.*; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 



/** 
* Created by erkankaplan on 10.11.15. 
*/ 
public class sqliteDBConnector { 

    public static void testSqli() throws SQLException, ClassNotFoundException{ 
     Class.forName("SQLite.JDBCDriver"); 

     String dbName = "mtt8.db"; 
     File dir = null; 
     try { 
      dir = PlatformFactory.getPlatform().getPrivateStorage(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     File db = new File (dir, dbName); 
     String dbUrl = "jdbc:sqlite:" + db.getAbsolutePath(); 




     Connection conn = DriverManager.getConnection(dbUrl); 

     //create table 
     Statement st=null; 

      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); 

        System.out.println("id:"+ id+ ", name: "+ name); 
       st.executeUpdate("DELETE from village"); 
       rs.close(); 

     } 

    } 

} 
相关问题