【问题标题】:Javafxports and SQLite on Android DeviceAndroid 设备上的 Javafxports 和 SQLite
【发布时间】:2015-11-11 17:05:30
【问题描述】:

我将使用 sqlite 编写一个示例代码,该代码必须同时适用于 Android 和 IOS(以及桌面)

这是我的 build.gradle

  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 'org.sqldroid:sqldroid:1.0.3'
    compile "com.gluonhq:charm-down-common:$CHARM_DOWN_VERSION"
    desktopRuntime "com.gluonhq:charm-down-desktop:$CHARM_DOWN_VERSION"

    //desktopRuntime 'org.xerial:sqlite-jdbc:3.9.0-SNAPSHOT'

    androidRuntime "com.gluonhq:charm-down-android:$CHARM_DOWN_VERSION"
    androidRuntime 'org.sqldroid:sqldroid:1.0.3'

    iosRuntime "com.gluonhq:charm-down-ios:$CHARM_DOWN_VERSION"
}
mainClassName = 'com.version17.Version17'
jfxmobile {
    android {
        manifest = 'src/android/AndroidManifest.xml'
        packagingOptions {
            exclude 'META-INF/INDEX.LIST'
        }
    }
    ios {
        infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = ['com.version17.**.*', 'com.mysql.**.*', 'SQLite.**.*', 'com.gluonhq.**.*']
    }
}

sqliteHelper.java

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
    for (int i=0; i<50; i++){
        st.executeUpdate("INSERT INTO village VALUES (" +i+ ", 'Erkan Kaplan')");
    }


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

    }

}

这适用于 Ipad 设备和台式机,但不适用于 Android 设备(如三星平板电脑)。

谁能告诉我为什么上面的代码不能在三星平板电脑上运行?或者我必须在我的代码中添加哪个?

谢谢 埃尔坎卡普兰

【问题讨论】:

    标签: java android sqlite javafxports


    【解决方案1】:

    您可以为每个平台加载所需的驱动程序,并使用 Gluon Charm-Down 了解平台并加载它。

    在您的 IDE 上使用 Gluon plugin,在 build.gradle 文件中,可以根据平台轻松添加不同的依赖项。

    编辑

    还添加了桌面。

    对于桌面,我们可以使用org.sqlite.JDBC,对于Android,我们可以使用org.sqldroid.SQLDroidDriver。对于 iOS,不需要依赖,因为 SQLite.JDBCDriver 已经包含在 Robovm 中。

    repositories {
        jcenter()
        maven { 
            url 'https://oss.sonatype.org/content/repositories/snapshots' 
        }
    }
    
    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"
        desktopRuntime 'org.xerial:sqlite-jdbc:3.9.0-SNAPSHOT'
    
        androidRuntime "com.gluonhq:charm-down-android:$CHARM_DOWN_VERSION"
        androidRuntime 'org.sqldroid:sqldroid:1.0.3'
    
        iosRuntime "com.gluonhq:charm-down-ios:$CHARM_DOWN_VERSION"
    }
    

    但我们需要将其添加到forceLinkClasses 选项中:

    jfxmobile {
        android {
            manifest = 'src/android/AndroidManifest.xml'
        }
    
        ios {
            forceLinkClasses = [ 'your.package.**.*', 'SQLite.**.*']
            infoPList = file('src/ios/Default-Info.plist')
        }
    }
    

    现在,在您的代码中,您可以根据应用运行的平台加载一个或另一个驱动程序,并创建一个连接,提供一个本地路径,如讨论的here

    private void testSqli() throws SQLException, ClassNotFoundException {
    
        if (JavaFXPlatform.isAndroid()) {
            Class.forName("org.sqldroid.SQLDroidDriver");
        } else if (JavaFXPlatform.isIOS()) {
            Class.forName("SQLite.JDBCDriver");
        } else if (JavaFXPlatform.isDesktop()) {
            Class.forName("org.sqlite.JDBC");
        }
    
        File dir;
        String dbUrl = "jdbc:sqlite:";
        try {
            dir = PlatformFactory.getPlatform().getPrivateStorage();
            String dbName = "yourDatabase.db";
            File db = new File (dir, dbName);
            dbUrl = dbUrl + db.getAbsolutePath();
            Connection conn = DriverManager.getConnection(dbUrl);
            ...
        } catch (IOException ex) { }
    }
    

    现在您应该可以在桌面、Android 和 iOS 上运行它了。 我用 NetBeans 和 IntelliJ 测试了这三个,但前者比后者更好地管理平台依赖关系。

    【讨论】:

    • 你好,谢谢,我在上面编辑了我的 build-gradle,如果我在 Android 上部署会出现以下错误:pastebin.com/hzyWii1S
    • 如果您使用 IntelliJ,可能androidRuntime 不起作用(在 NetBeans 中它起作用)。尝试将其移动到runtime 'org.sqldroid:sqldroid:1.0.3'。它在 iOS 上也可以正常工作,因为它不会被添加。
    • 何塞,可能,他们有冲突?如果我评论或删除行 compile 'org.xerial:sqlite-jdbc:3.9.0-SNAPSHOT' 这样我就可以 ./gredlew androidinstall 没有任何问题。但是如果我尝试编译一些时间结果总是像这里一样pastebin.com/hzyWii1S
    • 为什么要添加 org.xerial 呢?
    • 如我所说,我会写一个小应用程序。首先连接到我的局域网上的mysql-server,并将结果保存为客户端中的sqlite.db ...客户端可能是IOS或Android...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多