【问题标题】:Does Android Support JDBCAndroid 是否支持 JDBC
【发布时间】:2010-12-16 06:07:15
【问题描述】:

我知道在 Android 上有 android.database.sqlite 包,它提供了有用的类来管理内部 android 数据库。

问题是 - 我可以使用标准 java.sql 包来操作 Android 的数据库而不使用 android.database.sqlite 中的任何内容。* 我尝试使用 SQLite JDBC 驱动程序打开连接,但是当我将库添加为 e 引用时Eclipse 项目因“java heap out of memory ... 无法转换为 dalvik VM”而崩溃。

【问题讨论】:

    标签: android sqlite jdbc


    【解决方案1】:

    您无法轻松导入实现 java.* 类的 JAR。而且,JDBC 需要移植到 Android,因为它可能依赖于 Android 缺乏的 JavaSE 中的类。而且,无论如何,您都需要为 SQLite 编写自己的 JDBC 驱动程序,包装 Android 已经提供的 API,因为我怀疑现有的 JDBC 驱动程序使用 JNI。而且,当所有这些都完成后,您将拥有一个会增加很多臃肿的应用程序,从而降低人们下载和保留您的应用程序的可能性。

    简而言之,我不会走这条路。

    【讨论】:

    • 这有点误导:JDBC 框架本身存在于 Android 中并且可以使用(只是以这种方式连接到 HSQLDB)。纯 Java JDBC 驱动程序(与 HSQLDB 一样)可以像任何其他 JAR 一样在 Android 上工作(除了使用 Android 上不支持的 API,这不是专门的 JDBC 问题)。问题是大多数 JDBC 驱动程序,包括 SQLite,都是围绕本机代码的核心构建的,必须移植。
    【解决方案2】:

    Android 的 SQLite 数据库有一个(未记录的?)JDBC 驱动程序。尝试这个: (来自http://groups.google.com/group/android-developers/browse_thread/thread/cf3dea94d2f6243c

        try {
            String db = "jdbc:sqlite:" + getFilesDir() + "/test.db";
    
            Class.forName("SQLite.JDBCDriver");
            Connection conn = DriverManager.getConnection(db);
            Statement stat = conn.createStatement();
            stat.executeUpdate("create table primes (number int);");
            stat.executeUpdate("insert into primes values (2);");
            stat.executeUpdate("insert into primes values (3);");
            stat.executeUpdate("insert into primes values (5);");
            stat.executeUpdate("insert into primes values (7);");
    
            ResultSet rs = stat.executeQuery("select * from primes");
            boolean b = rs.first();
            while (b) {
                Log.d("JDBC", "Prime=" + rs.getInt(1));
                b = rs.next();
            }
    
            conn.close();
        } catch (Exception e) {
            Log.e("JDBC", "Error", e);
        } 
    

    【讨论】:

    • 根据我发现的其他信息,这似乎适用于 2.x 范围内的 Android 版本。在 4.4.4 及更高版本上,它不再存在。
    【解决方案3】:

    JDBC 驱动程序未记录且不受支持。请不要使用此代码。

    避免使用 java.sql 并改用 android.database.sqlite。

    【讨论】:

      【解决方案4】:

      现在有这样一个驱动:SQLDroid

      【讨论】:

      • 不幸的是,它没有维护,并且缺少很多功能,例如在插入后获取生成的密钥:(
      【解决方案5】:

      Android 从第一天起就提供完整的 JDBC 支持,但没有附带任何驱动程序(至少官方如此)。 JDBC 驱动程序的一般问题是大多数依赖于本机代码,这限制了可移植性,除非开发人员特别考虑 Android。

      • 似乎有一个非官方的 SQLite JDBC 驱动程序 SQLite.JDBCDriver,支持 jdbc:sqlite:/path/to/db,在 2.x 左右的 Android 版本中。但是,它似乎早已被删除(至少从 4.4.4 开始)。
      • SQLDroidXerial SQLite-JDBC 是为 Android 编写的第三方 JDBC 驱动程序。但是,一些用户用这些报告了各种issues;我自己一个都没试过。
      • 就我个人而言,我已经成功地将HSQLDB 与平面文件数据库一起使用(它也可以在客户端/服务器模式下运行,我还没有在 Android 上尝试过)。作为纯 Java(无本机代码),它可以在 Android 和 JRE 之间完全移植。

      在 Android 上使用 JDBC 时您可能会遇到的另一个问题是,某些 Android 机制(例如内容提供程序)需要 Cursor 实例,正如 android.database.sqlite.* 所使用的那样,而 JDBC 具有用于此目的的 ResultSet。由于这两者在很大程度上是功能等价物,而Cursor 是一个接口,您可以编写一个适配器类来实现Cursor 并将其方法转换为它们的ResultSet 等价物。

      【讨论】:

        【解决方案6】:

        那里还有另一个SQLite-jdbc 驱动程序。如here 所述,我让它在我的应用程序中工作。但是,并非所有应用程序二进制接口都支持它,但支持大多数设备。

        【讨论】:

          猜你喜欢
          • 2011-03-10
          • 2013-03-23
          • 2021-01-06
          • 2013-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-03
          • 2018-03-26
          相关资源
          最近更新 更多