Android设备上的Javafxports和SQLite [英] Javafxports and SQLite on Android Device
问题描述
我将用sqlite编写一个示例代码,它必须同时适用于ANdroid和IOS(和桌面)
i will write a sample code with sqlite, that must work both ANdroid and IOS (and Desktop)
这是我的 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设备(如三星平板电脑)。
This work on Ipad Devices and Desktop but not on Android-Devices (like Samsung Tablet).
任何人都可以告诉我为什么上面的代码不适用于三星平板电脑?或者哪个必须添加我的代码?
Can anybody please say me why this code above dont work on Samsung Tablets? or which depends i must add in my code?
谢谢
Erkan Kaplan
thanks Erkan Kaplan
推荐答案
你可以加载每个平台所需的驱动程序,以及使用Gluon Charm-Down 了解有关平台并加载它。
You can load the driver you need for each platform, and with Gluon Charm-Down find out about the platform and load it.
使用Gluon 插件在IDE上,在 build.gradle
文件中,可以根据平台轻松添加不同的依赖项。
Using Gluon plugin on your IDE, in the build.gradle
file it's easy to add different dependencies depending the platform.
编辑
还添加了桌面。
对于桌面,我们可以使用 org.sqlite.JDBC
对于Android,我们可以使用 org.sqldroid.SQLDroidDriver
。对于iOS,不需要依赖,因为 SQLite.JDBCDriver
它已被Robovm包含。
For Desktop we can use org.sqlite.JDBC
and for Android we can use org.sqldroid.SQLDroidDriver
. For iOS no dependency is required since SQLite.JDBCDriver
it's already included by 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
选项:
But we need to add it to the forceLinkClasses
option:
jfxmobile {
android {
manifest = 'src/android/AndroidManifest.xml'
}
ios {
forceLinkClasses = [ 'your.package.**.*', 'SQLite.**.*']
infoPList = file('src/ios/Default-Info.plist')
}
}
现在,在您的代码中,您可以加载一个驱动程序或另一个驱动程序,具体取决于运行该应用程序的平台,并创建一个连接,提供一个本地路径,如所讨论的这里:
Now, in your code you can load one driver or the other depending on the platform the app is running on, and create a connection, providing a local path like discussed 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对其中的三个进行了测试,但前者比后者更好地管理平台依赖。
Now you should be able to run it on Desktop, Android and on iOS. I've tested on the three of them, both with NetBeans and with IntelliJ, but the former manages the platform dependencies better than the latter.
这篇关于Android设备上的Javafxports和SQLite的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!