Android Studio 中的 UCanAccess 出现“给定文件不存在”错误
Posted
技术标签:
【中文标题】Android Studio 中的 UCanAccess 出现“给定文件不存在”错误【英文标题】:"given file does not exist" error with UCanAccess in Android Studio 【发布时间】:2017-04-20 14:22:16 【问题描述】:我尝试连接到 Access 数据库,但无论我尝试什么,我都会收到相同的错误:
UCAExc:::0.0 给定文件不存在:
我一直在使用 UCanAccess 和 android Studio v2.3。我试过 YouTube 并且到处搜索,但没有代码 sn-p 有效。
这是否与我使用的是 windows 10 并且我必须将数据库放在一个特殊的文件夹中有关?
我已在代码末尾包含错误日志
package com.example.david.dvd2;
// * Created by David on 2017-04-14.
import java.io.StringWriter;
import java.sql.*;
import java.util.Enumeration;
import android.util.Log;
import org.apache.commons.lang.exception.ExceptionUtils;
public class TestConnection
public static void CreateDBConection()
Log.i("TESTConnection","Inside TestConnection [CreateDBConnection]");
try
Statement st;
ResultSet re;
/*
Layout of the Access Database, a simple database with DVD-Titles
tblDVD Id, m,d,fldTitle, fldSweTitle, fldTime, fldComment, fktyp,
fkyear,
tblType Id, fldType
tblYear Id, fldYear
*/
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String dbFileName = "C:/db/dvd.mdb";
String database = "jdbc:ucanaccess://" + dbFileName + "";
Connection cn = DriverManager.getConnection(database, "", "");
st = cn.createStatement();
re = st.executeQuery("SELECT Id, fldYear FROM tblYear WHERE Id=35");
while (re.next())
String idoo = re.getString("Id");
String fldyearoo = re.getString("fldYear");
Log.i("Result from SQL query", "A selected Year with ID=35: " + fldyearoo);
catch(ClassNotFoundException | SQLException e)
Log.i("ERROR","Info:\n" + e.getMessage());
String s = ExceptionUtils.getStackTrace(e);
Log.i("ERROR","More detailed info\n" + s);
e.printStackTrace(System.err);
这里是 Err.log:
04-21 16:19:04.466 1693-1693/com.example.david.dvd2 I/TESTConnection: Inside TestConnection [CreateDBConnection]
04-21 16:19:04.554 1693-1700/com.example.david.dvd2 W/art: Suspending all threads took: 9.814ms
04-21 16:19:04.648 1693-1709/com.example.david.dvd2 I/art: Background sticky concurrent mark sweep GC freed 8515(456KB) AllocSpace objects, 9(288KB) LOS objects, 16% free, 2MB/3MB, paused 6.486ms total 34.758ms
04-21 16:19:04.680 1693-1709/com.example.david.dvd2 W/art: Suspending all threads took: 32.195ms
04-21 16:19:04.785 1693-1709/com.example.david.dvd2 W/art: Suspending all threads took: 22.748ms
04-21 16:19:04.897 1693-1693/com.example.david.dvd2 I/ERROR: Info:
UCAExc:::0.0 given file does not exist: /C:/db/dvd.mdb
04-21 16:19:04.933 1693-1693/com.example.david.dvd2 I/BERROR: More detailed info
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::0.0 given file does not exist: /C:/db/dvd.mdb
at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:264)
at java.sql.DriverManager.getConnection(DriverManager.java:179)
at java.sql.DriverManager.getConnection(DriverManager.java:213)
at com.example.david.dvd2.TestConnection.CreateDBConection(TestConnection.java:26)
at com.example.david.dvd2.MainActivity.mastermind2(MainActivity.java:20)
at com.example.david.dvd2.MainActivity.onCreate(MainActivity.java:12)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.io.FileNotFoundException: given file does not exist: /C:/db/dvd.mdb
at com.healthmarketscience.jackcess.impl.DatabaseImpl.open(DatabaseImpl.java:372)
at com.healthmarketscience.jackcess.DatabaseBuilder.open(DatabaseBuilder.java:252)
at net.ucanaccess.jdbc.DefaultJackcessOpener.open(DefaultJackcessOpener.java:35)
at net.ucanaccess.jdbc.DBReference.<init>(DBReference.java:161)
at net.ucanaccess.jdbc.DBReferenceSingleton.loadReference(DBReferenceSingleton.java:51)
at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:99)
at java.sql.DriverManager.getConnection(DriverManager.java:179)
at java.sql.DriverManager.getConnection(DriverManager.java:213)
at com.example.david.dvd2.TestConnection.CreateDBConection(TestConnection.java:26)
at com.example.david.dvd2.MainActivity.mastermind2(MainActivity.java:20)
at com.example.david.dvd2.MainActivity.onCreate(MainActivity.java:12)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
04-21 16:19:04.933 1693-1693/com.example.david.dvd2 W/System.err: net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::0.0 given file does not exist: /C:/db/dvd.mdb
04-21 16:19:04.933 1693-1693/com.example.david.dvd2 W/System.err: at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:264)
04-21 16:19:04.933 1693-1693/com.example.david.dvd2 W/System.err: at java.sql.DriverManager.getConnection(DriverManager.java:179)
04-21 16:19:04.933 1693-1693/com.example.david.dvd2 W/System.err: at java.sql.DriverManager.getConnection(DriverManager.java:213)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at com.example.david.dvd2.TestConnection.CreateDBConection(TestConnection.java:26)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at com.example.david.dvd2.MainActivity.mastermind2(MainActivity.java:20)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at com.example.david.dvd2.MainActivity.onCreate(MainActivity.java:12)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.app.Activity.performCreate(Activity.java:5990)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.app.ActivityThread.access$800(ActivityThread.java:151)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.os.Looper.loop(Looper.java:135)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5254)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at java.lang.reflect.Method.invoke(Native Method)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: Caused by: java.io.FileNotFoundException: given file does not exist: /C:/db/dvd.mdb
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at com.healthmarketscience.jackcess.impl.DatabaseImpl.open(DatabaseImpl.java:372)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at com.healthmarketscience.jackcess.DatabaseBuilder.open(DatabaseBuilder.java:252)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at net.ucanaccess.jdbc.DefaultJackcessOpener.open(DefaultJackcessOpener.java:35)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at net.ucanaccess.jdbc.DBReference.<init>(DBReference.java:161)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at net.ucanaccess.jdbc.DBReferenceSingleton.loadReference(DBReferenceSingleton.java:51)
04-21 16:19:04.934 1693-1693/com.example.david.dvd2 W/System.err: at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:99)
【问题讨论】:
如果您的数据库文件确实位于C:
驱动器的根文件夹中,那么您的Java 代码可能没有对该文件的“修改”权限。尝试将文件复制到您知道您将对文件具有读/写权限的位置。
我试图将数据库放在另一个地方并设置正确的权限,但到目前为止没有运气。现在我有 c:/db/dvdjoke.accdb
在您的catch
SQLException 块中,让您的代码e.printStackTrace(System.err);
然后edit 您的问题包含完整的堆栈跟踪。
我在这条评论中有错误的数据库名称,只有在这里,在代码-sn-p 中是正确的。它应该是 dvd.mdb。我现在已更改它,使其与 java 代码-sn-p 匹配。我试图将数据库放在另一个地方并设置正确的权限,但到目前为止还没有运气。现在我有 c:/db/dvd.mdb
/C:/db/dvd.mdb
中的前导斜线是可疑的。如果您在 Android 模拟器中运行此代码,则该环境可能无法直接访问 Windows 文件系统。您可能需要执行this 之类的操作,然后您的 Android 应用才能操作该文件。
【参考方案1】:
在 Android Studio 中的 Android 模拟器下运行的代码显然无法直接访问主机的文件系统。在这种情况下,Windows 路径 C:/db/dvd.mdb
被解释为 Android 路径 /C:/db/dvd.mdb
因此,我们需要将数据库文件导入到 Android“设备”上的文件系统中,如this answer 中所述。
【讨论】:
上面的指南用于从设备保存,使用按钮将文件保存到设备上很重要。首先启动您的设备。导航到要保存文件的位置。使用按钮上传文件,您就完成了。现在您可以访问该文件,在本例中为数据库文件 dvd.mdb。编辑您的连接路径以匹配 dvd.mdb 文件结束的位置。以上是关于Android Studio 中的 UCanAccess 出现“给定文件不存在”错误的主要内容,如果未能解决你的问题,请参考以下文章
无法按照 Google“入门”页面中的说明在 Android Studio 中添加地图; Android Studio 报错
android studio application怎么创建