0

我正在编写一个 kotlin 桌面应用程序,它允许我从文本文件中读取数据并将其保存到数据库中。将此数据库保存为文件后,我想在我的 android 应用程序中使用它。我正在使用 Exposed、kotlin 库和 H2 来完成我的任务。但是我无法使用 Exposed 语法在 android studio 中打开数据库,而且我不知道如何处理它们。

在这里,我正在尝试打开现有数据库并记录保存在 Cheats 数据库中的所有 ID

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

Database.connect("jdbc:h2:file:C:\\CurrentProjects\\Databases\\NL_Cheats.db", driver = "org.h2.Driver")

transaction {
for (cheat in Cheats.selectAll()) {
Log.d("", "${cheat[Cheats.id]}")
}
}
//SchemaUtils.

/*transaction {
for (cheat in Cheats.selectAll()) {
println("${cheat[Cheats.id]}: ${cheat[Cheats.title]}: \n${cheat[Cheats.description]}")
}
}*/
}

object Cheats: Table() {
val id = integer("id").autoIncrement().primaryKey()
val title = varchar("title", length = 50)
val description = varchar("description", length = 1500)
}

期望:成功打开带有数据库的文件。我可以正确阅读它的表格,并且不会返回任何错误。我实际上得到了什么:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.madrat.j2me_cheetah, PID: 23102
java.lang.ExceptionInInitializerError
at com.madrat.j2me_cheetah.MainActivity$onCreate$1.invoke(MainActivity.kt:21)
at com.madrat.j2me_cheetah.MainActivity$onCreate$1.invoke(MainActivity.kt:12)
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:104)
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:75)
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:58)
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:58)
at com.madrat.j2me_cheetah.MainActivity.onCreate(MainActivity.kt:20)
at android.app.Activity.performCreate(Activity.java:7087)
at android.app.Activity.performCreate(Activity.java:7078)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2763)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2888)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97)
at kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Instance.call(CallerImpl.kt:113)
at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:106)
at kotlin.reflect.jvm.internal.KProperty1Impl.get(KProperty1Impl.kt:35)
at org.jetbrains.exposed.sql.Table.clone(Table.kt:209)
at org.jetbrains.exposed.sql.Table.cloneWithAutoInc(Table.kt:354)
at org.jetbrains.exposed.sql.Table.autoIncrement(Table.kt:358)
at org.jetbrains.exposed.sql.Table.autoIncrement$default(Table.kt:358)
at com.madrat.j2me_cheetah.MainActivity$Cheats.<clinit>(MainActivity.kt:35)
at com.madrat.j2me_cheetah.MainActivity$onCreate$1.invoke(MainActivity.kt:21) 
at com.madrat.j2me_cheetah.MainActivity$onCreate$1.invoke(MainActivity.kt:12) 
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:104) 
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:75) 
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:58) 
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:58) 
at com.madrat.j2me_cheetah.MainActivity.onCreate(MainActivity.kt:20) 
at android.app.Activity.performCreate(Activity.java:7087) 
at android.app.Activity.performCreate(Activity.java:7078) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2763) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2888) 
at android.app.ActivityThread.-wrap11(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:171) 
at android.app.ActivityThread.main(ActivityThread.java:6606) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Ошибка при создании файла "/C:"
Error while creating file "/C:" [90062-199]
at org.h2.store.fs.FilePathDisk.createDirectory(FilePathDisk.java:290)
at org.h2.store.fs.FileUtils.createDirectory(FileUtils.java:43)
at org.h2.store.fs.FileUtils.createDirectories(FileUtils.java:315)
at org.h2.store.fs.FileUtils.createDirectories(FileUtils.java:314)
at org.h2.store.fs.FileUtils.createDirectories(FileUtils.java:314)
at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:74)
at org.h2.engine.Database.getPageStore(Database.java:2739)
at org.h2.engine.Database.open(Database.java:769)
at org.h2.engine.Database.openDatabase(Database.java:319)
at org.h2.engine.Database.<init>(Database.java:313)
at org.h2.engine.Engine.openSession(Engine.java:69)
at org.h2.engine.Engine.openSession(Engine.java:201)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:178)
at org.h2.engine.Engine.createSession(Engine.java:161)
at org.h2.engine.Engine.createSession(Engine.java:31)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:336)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148)
at org.h2.Driver.connect(Driver.java:69)
at java.sql.DriverManager.getConnection(DriverManager.java:569)
at java.sql.DriverManager.getConnection(DriverManager.java:219)
at org.jetbrains.exposed.sql.Database$Companion$connect$7.invoke(Database.kt:188)
E/AndroidRuntime:     at org.jetbrains.exposed.sql.Database$Companion$connect$7.invoke(Database.kt:146)
at org.jetbrains.exposed.sql.Database$Companion$doConnect$3.invoke(Database.kt:167)
at org.jetbrains.exposed.sql.Database$Companion$doConnect$3.invoke(Database.kt:146)
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManager$ThreadLocalTransaction$connectionLazy$1.invoke(ThreadLocalTransactionManager.kt:26)
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManager$ThreadLocalTransaction$connectionLazy$1.invoke(ThreadLocalTransactionManager.kt:23)
at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManager$ThreadLocalTransaction.getConnection(ThreadLocalTransactionManager.kt:32)
at org.jetbrains.exposed.sql.Transaction.getConnection(Unknown Source:2)
at org.jetbrains.exposed.sql.Database.metadata$exposed(Database.kt:28)
at org.jetbrains.exposed.sql.Database$url$2.invoke(Database.kt:31)
at org.jetbrains.exposed.sql.Database$url$2.invoke(Database.kt:16)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at org.jetbrains.exposed.sql.Database.getUrl(Unknown Source:7)
at org.jetbrains.exposed.sql.Database$dialect$2.invoke(Database.kt:34)
at org.jetbrains.exposed.sql.Database$dialect$2.invoke(Database.kt:16)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at org.jetbrains.exposed.sql.Database.getDialect(Unknown Source:7)
at org.jetbrains.exposed.sql.vendors.DefaultKt.getCurrentDialect(Default.kt:385)
at org.jetbrains.exposed.sql.vendors.DefaultKt.getCurrentDialectIfAvailable(Default.kt:389)
at org.jetbrains.exposed.sql.Column.getOnDelete$exposed(Column.kt:17)
4

1 回答 1

0

这不是 Exposed 的问题,您的方法是错误的。

导致此异常的错误在您附加的跟踪的中途:

Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Ошибка при создании файла "/C:"
Error while creating file "/C:" [90062-199]

在 Exposed 真正开始之前,它就在你的数据库文件的路径上阻塞了。您是否在 Android 测试虚拟机中运行它?它将无法从您的 C 盘读取数据库文件,并且 Windows 样式的文件路径对 Android 无效。

请参阅H2 的 Android 文档,了解如何构建您的 URL。

您必须找到一种方法将您的数据库文件放入您的 VM 或您的测试设备中的应用程序可以访问并符合 H2 的 URL 格式的位置。

于 2019-08-08T21:37:23.000 回答