我将使用 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 设备(如三星平板电脑)。
有人可以告诉我为什么上面的代码在三星平板电脑上不起作用吗?或者我必须在代码中添加哪一个?
谢谢 埃尔坎·卡普兰
最佳答案
您可以加载每个平台所需的驱动程序,并使用 Gluon Charm-Down了解该平台并加载它。
使用胶子 plugin在 IDE 的 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 对其中的三个进行了测试,但前者比后者更好地管理平台依赖性。
关于Android 设备上的 Javafxports 和 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33655851/