praeclarum / sqlite-net

Simple, powerful, cross-platform SQLite client and ORM for .NET
MIT License
4.02k stars 1.42k forks source link

Question: Unity Support #1023

Open rdcm opened 3 years ago

rdcm commented 3 years ago

Hi!

Could the SQLite-net be used in Unity projects?

In the official description Unity not mentioned.

SQLite-net is an open source, minimal library to allow .NET, .NET Core, and Mono applications to store data in SQLite 3 databases. It was first designed to work with Xamarin.iOS, but has since grown up to work on all the platforms (Xamarin.*, .NET, UWP, Azure, etc.).

But I see a merged fix for IL2CPP: https://github.com/praeclarum/sqlite-net/pull/993

shiena commented 3 years ago

@rdcm

diff --git a/src/SQLite.cs b/src/SQLite.cs
--- a/src/SQLite.cs (date 1618732310971)
+++ b/src/SQLite.cs (date 1618732310971)
@@ -4356,7 +4356,11 @@
            Serialized = 3
        }

+#if UNITY_ANDROID && !UNITY_EDITOR
+       const string LibraryPath = "sqliteX";
+#else
        const string LibraryPath = "sqlite3";
+#endif

 #if !USE_CSHARP_SQLITE && !USE_WP8_NATIVE_SQLITE && !USE_SQLITEPCL_RAW
        [DllImport(LibraryPath, EntryPoint = "sqlite3_threadsafe", CallingConvention=CallingConvention.Cdecl)]
gindemit commented 2 years ago

Hey @shiena, can you please explain, or send some information how SQLite works on Mac/iOS? Why the native library is not necessary?

shiena commented 2 years ago

@khindemit Mac/iOS includes sqlite3 so it works without adding native libraries. On my macOS Catalina, /usr/lib/libsqlite3.dylib exists.

wiverson commented 2 years ago

Just to add a comment after doing some research - on macOS, if the library asked for in sqlite-net is "sqlite3" macOS will automatically look for a library with libsqlite3.dylib, which is included in the library lookup path by default. The lib prefix and .dylib are magic strings added to the lookup.

wiverson commented 2 years ago

Even more magic - I just checked my macOS Monterey 12.0.1 M1 install, and it's now /usr/lib/sqlite3 alone. Interesting.

shiena commented 2 years ago

I forgot that DllImport should be __Internal in iOS. So the patch is as follows, along with the one for Android. https://docs.unity3d.com/2022.1/Documentation/Manual/NativePlugins.html

diff --git a/src/SQLite.cs b/src/SQLite.cs
index e5712f3..dc9e0d4 100644
--- a/src/SQLite.cs
+++ b/src/SQLite.cs
@@ -4468,7 +4468,13 @@ namespace SQLite
            Serialized = 3
        }

+#if UNITY_IOS && !UNITY_EDITOR
+       const string LibraryPath = "__Internal";
+#elif UNITY_ANDROID && !UNITY_EDITOR
+       const string LibraryPath = "sqliteX";
+#else
        const string LibraryPath = "sqlite3";
+#endif

 #if !USE_CSHARP_SQLITE && !USE_WP8_NATIVE_SQLITE && !USE_SQLITEPCL_RAW
        [DllImport(LibraryPath, EntryPoint = "sqlite3_threadsafe", CallingConvention=CallingConvention.Cdecl)]
heshuimu commented 2 years ago

@shiena For iOS, If the intent is using the system-provided libsqlite3, LibraryPath should be kept as sqlite3. __Internal is only for linking extern methods with statically-linked native functions in Unity IL2CPP. Unity's documentation was not updated to include the fact that dynamic linking was supported since iOS 8. However, if the Unity project integrates SQLite using static library or source code, then LibraryPath should be kept as __Internal for all platforms, including Android.