0

Im writing an kotlin desktop application that will allow me to read data from text files and save it into database. After saving this database as a file, i want to use it in my android application. I'm using Exposed, kotlin library, and H2 for my task. But i cant open database in android studio using Exposed syntax and i dont know how to deal with them.

Here i'm trying to open existing database and log all ids saved in Cheats database

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)
}

Expectations: file with database is opened sucessfully. I can read its table properly and its not giving any errors back. What i got actually:

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)
MadRat
  • 1
  • 1

1 Answers1

0

This isn't an issue with Exposed, your approach is just wrong.

The error that's causing this Exception is partway down your attached trace:

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

It's choking on the path to your database file before Exposed really even gets started. Are you running this in the Android test VM? It won't be able to read the database file from your C drive, and that Windows-style file path is invalid for Android.

See H2's Android documentation on how to construct your URL.

You will have to find a way to get your database file into your VM or onto your test device in a location that your application has access to and complies with H2's URL format.