While Connecting to Neo4j to Android I'm getting an error

164 Views Asked by At

I wanted to use neo4j DB in my Android project. I'm trying to connect with Neo4j database with Android, while connecting I'm getting an error. I have added a dependency in my Android app level gradle .

compile 'org.neo4j.driver:neo4j-java-driver:1.3.0'

MainActivity.java

Driver driver = GraphDatabase.driver( "bolt://localhost:7687", AuthTokens.basic("neo4j", "neo4j") );
                Session session = driver.session();
                session.run( "CREATE (a:Person {name: {name}, title: {title}})",
                        parameters( "name", "Arthur", "title", "King" ) );

                StatementResult result = session.run( "MATCH (a:Person) WHERE a.name = {name} " +
                                "RETURN a.name AS name, a.title AS title",
                        parameters( "name", "Arthur" ) );
                while ( result.hasNext() )
                {
                    Record record = result.next();
                    System.out.println( record.get( "title" ).asString() + " " + record.get( "name" ).asString() );
                }
                session.close();
                driver.close();

Logs

06-22 16:24:05.627 4990-4990/com.example.prateek.neo4jtest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.prateek.neo4jtest, PID: 4990
java.lang.NoClassDefFoundError: java.net.StandardSocketOptions
at org.neo4j.driver.internal.net.ChannelFactory.create(ChannelFactory.java:39)
at org.neo4j.driver.internal.net.SocketClient.start(SocketClient.java:124)
at org.neo4j.driver.internal.net.SocketConnection.startSocketClient(SocketConnection.java:92)
at org.neo4j.driver.internal.net.SocketConnection.<init>(SocketConnection.java:67)
at org.neo4j.driver.internal.net.SocketConnector.createConnection(SocketConnector.java:77)
at org.neo4j.driver.internal.net.SocketConnector.connect(SocketConnector.java:50)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool$ConnectionSupplier.get(SocketConnectionPool.java:204)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool$ConnectionSupplier.get(SocketConnectionPool.java:186)
at org.neo4j.driver.internal.net.pooling.BlockingPooledConnectionQueue.acquire(BlockingPooledConnectionQueue.java:96)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool.acquireConnection(SocketConnectionPool.java:137)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool.acquire(SocketConnectionPool.java:76)
at org.neo4j.driver.internal.DirectConnectionProvider.acquireConnection(DirectConnectionProvider.java:45)
at org.neo4j.driver.internal.NetworkSession.acquireConnection(NetworkSession.java:340)
at org.neo4j.driver.internal.NetworkSession.run(NetworkSession.java:104)
at org.neo4j.driver.internal.NetworkSession.run(NetworkSession.java:94)
at com.example.prateek.neo4jtest.MainActivity$1.onClick(MainActivity.java:29)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18431)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
at dalvik.system.NativeStart.main(Native Method)

Any help will be appreciated. Thanks!

2

There are 2 best solutions below

5
On BEST ANSWER

Just because there's a Java Driver, doesn't mean it works on Android.

(Although, it seems there's an outdated Android driver on Github)

Neo4j exposes a REST API you can use given HTTP requests, which is probably the safest approach to use, although it'll require learning how that works on Android and dealing with JSON parsing.

More specifically to the error, StandardSocketOptions is not part of Android until API 24, so you could try making your compileSdk and minimumSdk to be 24, but no guarantees it'll still work.


By the way, you can't connect to localhost from the Android device unless you are running Neo4j Server on that Android device itself

0
On

java.net.StandardSocketOptions was added to the Android platform in API level 26.

So, if it is acceptable for your app to target API level 26 or above, then you can at least get past that exception. However, you might still see similar issues with other classes needed by the driver.