在树莓派上使用Java和sqlite

4
我可以帮您翻译成中文。这段文本是关于编程和数据库的,作者已经创建了一个小的Java SQLite数据库代码。下面是连接数据库的代码:
Class.forName("org.sqlite.JDBC");

objConnection=DriverManager.getConnection("jdbc:sqlite:/etc/javaData/Test.db");

在这段代码中,第二行的getConnection()方法抛出了异常。我正在树莓派上尝试这段代码。如何解决与此相关的异常?
异常
SQLITE addDeviceInfo()-[SQLITE] SQL Exception occured. RetryCount:1 (MAX Retry: 2) ErrorCode: 27154 Exception Message: Error opening connection Stack Trace: java.sql.SQLException: Error opening connection
  at org.sqlite.core.CoreConnection.open(CoreConnection.java:140)
  at org.sqlite.core.CoreConnection.<init>(CoreConnection.java:66)
  at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:21)
  at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:23)
  at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:45)
  at org.sqlite.JDBC.createConnection(JDBC.java:114)
  at org.sqlite.JDBC.connect(JDBC.java:88)
  at java.sql.DriverManager.getConnection(DriverManager.java:571)
  at java.sql.DriverManager.getConnection(DriverManager.java:215)
  at kmbt.DCA.SQLite.DCASQLiteUtility.getSQliteConnection(DCASQLiteUtility.java:152)
  at kmbt.DCA.SQLite.ManagedDeviceSetting.SQLite_ManagedDeviceSettingManager.addDeviceInfo(SQLite_ManagedDeviceSettingManager.java:981)
  at kmbt.DCA.DCAChildProcessMng.InitManagedDeviceInfo(DCAChildProcessMng.java:5726)
  at kmbt.DCA.DCAChildProcessMng.InitSQLite(DCAChildProcessMng.java:4387)
  at kmbt.DCA.DCAChildProcessMng.start(DCAChildProcessMng.java:365)
  at kmbt.DCA.DCAChildProcess.main(DCAChildProcess.java:23)
 Caused by: java.lang.Exception: Error loading native library: /org/sqlite/native/Linux/arm/libsqlitejdbc.so
  at org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBCLoader.java:243)  at org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:65)
  at org.sqlite.core.NativeDB.load(NativeDB.java:53)
  at org.sqlite.core.CoreConnection.open(CoreConnection.java:136)
  ... 14 more

你解决了吗? - kidmose
2个回答

1
我也遇到了 java.lang.Exception: Error loading native library: /org/sqlite/native/Linux/arm/libsqlitejdbc.so 的问题。
查看 sqlite-jdbc-3.8.6.jar,我发现 /org/sqlite/native/Linux/ 中没有 arm 文件夹,说明 sqlite 没有为 arm 编译。
通过这些更改,我成功在树莓派上构建了:https://bitbucket.org/kidmose/sqlite-jdbc/commits/cb7a7ef62c034938e8ecb737b148e5c80877c083
pi@raspberry ~/sqlite-jdbc $ export JAVA_HOME=/usr/lib/jvm/jdk-7-oracle-armhf/
pi@raspberry ~/sqlite-jdbc $ chmod 755 ./amalgamation_version.sh
pi@raspberry ~/sqlite-jdbc $ make

用新构建的jar替换旧的解决了我的问题。
所有功劳归于:https://pidome.wordpress.com/2013/10/01/java-goes-hard-on-the-raspberry-pi-so-does-pidome/

1
你的代码看起来正确,抛出的异常似乎与某些库的问题无关。唯一让我感到有点奇怪的是,你将数据库放在了 /etc 文件夹中。首先这不是很正确,因为 /etc 文件夹用于存储配置文件而不是数据。此外,可能存在读/写文件夹权限的问题。尝试将数据库移动到你的主目录或任何由你拥有而非 root 用户拥有的目录中。
希望对你有所帮助。
-- 编辑 --
好的,问题在于你下载了错误的库:
Error loading native library: /org/sqlite/native/Linux/arm/libsqlitejdbc.so

你需要使用ARM版本的sqlite库。可以参考以下链接了解更多信息: 在树莓派上打开SQLite连接时出现错误 在树莓派上使用Sqlite4java

你能否在问题中添加完整的堆栈跟踪信息? - wyr0
好的,问题在于您下载了错误的库。您必须使用ARM版本的sqlite库。请尝试查看以下链接:http://stackoverflow.com/questions/23665796/error-opening-connection-sqlite-on-raspberry-pi - wyr0
如何将libsqlitejdbc.so文件添加到sqlite-jdbc-3.8.6.jar文件中? - Amol
我认为你需要重新构建库,包括对你的系统的支持。实际上,我从未做过这样的事情,所以我不能直接帮助你。也许你会发现这个有用:https://dev59.com/Knzaa4cB1Zd3GeqPQHNU - wyr0
我已经将这个.so文件包含到.jar文件中,并且替换了.jar文件,现在它不会显示与getConnection()相关的错误,但是在getConnection()之后它不会处理下一行,而是直接进入finally块。 - Amol
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接