【问题标题】:SQLite JDBC driver on AndroidAndroid 上的 SQLite JDBC 驱动程序
【发布时间】:2017-10-24 21:11:45
【问题描述】:

我正在尝试使用 xerial sqlite-jdbc 在 Android 中管理我的数据库,但没有成功。我收到了一个 java.lang.NoClassDefFoundError: org.sqlite.SQLiteConnection 异常。我已将此依赖项 'org.xerial:sqlite-jdbc:3.18.0' 导入我的毕业生。 我的代码如下,

 try {

        Class.forName("org.sqlite.JDBC");
        Connection connection = DriverManager.getConnection("jdbc:sqlite:hs.db");

    } catch (ClassNotFoundException eString) {System.err.println("Could not init JDBC driver - driver not found");
    } catch (java.sql.SQLException e) {e.printStackTrace();}

在我的项目中使用 android.database.sqlite 不是选项,所以请不要建议作为答案。

【问题讨论】:

标签: android sqlite jdbc


【解决方案1】:

这是我的方式:

  1. app/build.gradle 中做一些配置,然后复制一个so 文件,看起来很难看,但在我的Android 9.0 系统中确实有效。
android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
dependencies {
    implementation 'org.xerial:sqlite-jdbc:3.34.0'
}
  1. 然后将此文件sqlite-jdbc-3.34.0.jar!\org\sqlite\native\Linux\android-arm\libsqlitejdbc.so 复制到app/libs/armeabi-v7a/,如下所示:

  2. 并且构建的 apk 看起来像:

  3. 现在你可以在android上享受javax.sql.DataSource的sqlite了。

【讨论】:

  • 就我而言,我必须在 proguard 规则文件中定义以下几行:-keep class org.sqlite.** { ; } -keepnames 类 org.sqlite.* { *; }
【解决方案2】:

我需要在我的服务器数据库和手机数据库之间共享一些数据库代码,所以我花了很多时间编写通用代码来使用 JDBC。

然而,在我深陷这一努力之后,我发现Android 上基本上没有有效的 JDBC 实现。我会强烈敦促您不要走这条路 - Xerial 和 SQLDroid JDBC 驱动程序都存在我仅在测试期间发现的重大问题。

Xerial 的问题

它无法在 Android 上运行 :) 它甚至无法加载 - 我遇到了 this issue,即使尝试了几个小时也无法解决它。

SQLDroid 的问题

  1. Open Issues page - 其中一些对我来说非常可怕。对我来说最大的问题是缺少批量支持。
  2. 开始前请查看Known Issues page

最后,我使用 android.database.sqlite 类创建了我需要的 java.sql 接口和方法的一小部分实现。这远没有我想象的那么痛苦(我只花了几个小时,我需要的功能子集)而且效果很好!

【讨论】:

  • 你能说更多关于“我需要的 java.sql 接口和方法的小子集的实现”吗?您是否在服务器上使用了相同的子集?你用什么 API 来实现它? java中有没有更直接的sqlite API?
  • 对于我在服务器上使用的每个 java.sql 接口,我在我的 Android 项目中创建了一个类。例如,对于java.sql.Connection 接口,我创建了以下类:public final class SQLiteConnection implements Connection 然后在 Android Studio 中,我选择“实现方法”操作来创建其每个方法的虚拟实现。然后,我只使用android.database.sqlite 类实现了我实际使用的那些方法。我希望这可以澄清。有许多 SQLite JDBC 实现,但我找不到任何(2019 年)适用于 Android 的。
【解决方案3】:

分级

 compile 'org.sqldroid:sqldroid:1.0.3'

JAVA

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;

public class MainActivity extends AppCompatActivity {

    private Connection connection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            DriverManager.registerDriver((Driver) Class.forName("org.sqldroid.SQLDroidDriver").newInstance());
        } catch (Exception e) {
            throw new RuntimeException("Failed to register SQLDroidDriver");
        }
        String jdbcUrl = "jdbc:sqldroid:" + "/data/data/" + getPackageName() + "/my-database.db";
        try {
            this.connection = DriverManager.getConnection(jdbcUrl);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onDestroy() {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        super.onDestroy();
    }
}

https://github.com/SQLDroid/SQLDroid

【讨论】:

  • 正如我所说,这不是这个项目的一个选项。我必须使用 JDBC 连接
  • 谢谢。这是我直到最近才使用的。但是在最近升级 gradle 和 Android Studio 之后,我得到了这个异常“java.lang.NoClassDefFoundError: org.sqlite.SQLiteConnection”。所以我我现在正在尝试 xerial,但我遇到了同样的问题。
  • 这可能是xerial jdbc没有安装,如果不工作尝试清理项目尝试少这一行 Class.forName("org.sqlite.JDBC");因为在 github 存储库中没有这一行 github.com/xerial/sqlite-jdbc
猜你喜欢
  • 1970-01-01
  • 2016-01-01
  • 2014-09-11
  • 2011-05-16
  • 1970-01-01
  • 2011-11-05
  • 2019-11-23
  • 1970-01-01
  • 2020-03-08
相关资源
最近更新 更多