Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

SQLiteKit

Discussion in 'Assets and Asset Store' started by Oksana-Iashchuk, Sep 11, 2012.

  1. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    http://u3d.as/content/orange-tree/sqlite-kit/3ka

    - No DLL, only C# code! So, no headache with cross-platform support!
    - Helps organize statistics or score in one single database file to enjoy sophisticated search using SQL language and benefits of keeping everything in one place.
    - All platforms are supported as long as it is just a pure C# library. Tested on WebGL, IPhone, Android, PC and Mac.
    - It can be used for game scenarios or settings storage which could be easily modified by great tools like SQLite Database Browser.
    - Best advantage is that you can read or download database file into memory, which is crucially important for platforms like WebPlayer where access to the file system is restricted because of security reasons.
    - UTF8 and BLOB supported and tested.
    - true SQLite file format.
    - SQLite API nicely wrapped in C#.

    example code:

    Code (CSharp):
    1.   // database file name.
    2.   //
    3.   string filename = Application.persistentDataPath + "/demo.db";
    4.  
    5.   // create database object
    6.   //
    7.   SQLiteDB db = new SQLiteDB();
    8.  
    9.   // initialize database
    10.   //
    11.   db.Open(filename);            
    12.  
    13.   // make a query object
    14.   //
    15.   SQLiteQuery qr = new SQLiteQuery(db, "SELECT * FROM test_values;");
    16.  
    17.   // read result
    18.   //
    19.   while( qr.Step() )
    20.   {
    21.      string astring = qr.GetString("str_field");
    22.      byte[] ablob = qr.GetBlob("blob_field");
    23.   }
    24.  
    25.   // release query object
    26.   //
    27.   qr.Release();          
    28.  
    29.   // close database
    30.   //
    31.   db.Close();
     
    Last edited: Dec 16, 2022
  2. kenlem

    kenlem

    Joined:
    Oct 16, 2008
    Posts:
    1,630
    Just noticed this on sale at the Asset Store for $30! I snapped it right up. Thanks.
     
  3. dannyskim

    dannyskim

    Joined:
    Jul 20, 2011
    Posts:
    87
    I sent you an e-mail, but I figured this would be a good question for the boards.

    What dependencies does this kit have on the .NET API? It seems you can't strip or use the subset, which is pretty painful in terms of build size and to me, is a pretty big downside.
     
  4. kenlem

    kenlem

    Joined:
    Oct 16, 2008
    Posts:
    1,630
    I just tried this using Unity 3.5.6f4 (iOS Pro) and I was able to get it to run on the device with stripping and .Net 2.0 subset. The only problem I ran into was when I tried to use micro mscorelib which results in the following:

    Code (csharp):
    1.  
    2. UnityException: Failed assemblies stripper: /Applications/Unity/Unity.app/Contents/Frameworks/Mono/bin/mono "/Applications/Unity/Unity.app/Contents/Frameworks/Tools/UnusedBytecodeStripper/UnusedBytecodeStripper.exe" -l none -c link -a "Assembly-CSharp.dll" -out output -x "/Applications/Unity/Unity.app/Contents/Frameworks/Tools/UnusedBytecodeStripper/link.xml" -d "Temp/StagingArea/Data/Managed" -x "tmplink.xml" current dir : Temp/StagingArea/Data/Managed
    3.  result file exists: False
    4. stdout:
    5. stderr: Unhandled Exception: Mono.Linker.ResolutionException: Can not resolve reference: System.Boolean System.Threading.WaitHandle::WaitOne(System.Int32)  at Mono.Linker.Steps.MarkStep.MarkMethod (Mono.Cecil.MethodReference reference, System.Object markedby) [0x00000] in <filename unknown>:0   at Mono.Linker.Steps.MarkStep.MarkInstruction (Mono.Cecil.Cil.Instruction instruction, Mono.Cecil.MethodDefinition markedby) [0x00000] in <filename unknown>:0   at Mono.Linker.Steps.MarkStep.MarkMethodBody (Mono.Cecil.Cil.MethodBody body) [0x00000] in <filename unknown>:0   at Mono.Linker.Steps.MarkStep.ProcessMethod (Mono.Cecil.MethodDefinition method) [0x00000] in <filename unknown>:0   at Mono.Linker.Steps.MarkStep.ProcessQueue () [0x00000] in <filename unknown>:0   at Mono.Linker.Steps.MarkStep.Process () [0x00000] in <filename unknown>:0   at Mono.Linker.Steps.MarkStep.Process (Mono.Linker.LinkContext context) [0x00000] in <filename unknown>:0   at Mono.Linker.Pipeline.Process (Mono.Linker.LinkContext context) [0x00000] in <filename unknown>:0   at UnusedBytecodeStripper.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
    6.  
    7. UnityEditor.MonoProcessUtility.RunMonoProcess (System.Diagnostics.Process process, System.String name, System.String resultingFile)
    8. UnityEditor.MonoAssemblyStripping.MonoLink (BuildTarget buildTarget, System.String managedLibrariesDirectory, System.String[] input, System.String[] allAssemblies, UnityEditor.RuntimeClassRegistry usedClasses)
    9. UnityEditor.HostView:OnGUI()
    10.  
     
  5. dannyskim

    dannyskim

    Joined:
    Jul 20, 2011
    Posts:
    87
    Thanks for the fast reply and e-mails late last night Oksana, and kenlem that is definitely good news!

    I have another question. I'm currently using the MemoryStream method of accessing my database from the streaming assets folder. All I'm doing on Awake() of one of my scripts is opening the DB connection, and then running 9 GetDouble queries and 1 GetInteger query, but it seems like this takes 6 seconds for some reason. It doesn't seem like there's enough Debug output from our plug-in to really get an in-depth look.

    So is this normal? Or am I most likely doing something wrong. This is for Android btw.
     
  6. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Hello dannyskim, I submitted version 1.4 to assetstore with full code, so I will fix problem with Android, I notes that unity is really bad with dll on android, since i have no problem anywhere else. The delay happens because i do dll delay load. so please email me I'll send Version 1.4, asset store is delay to publish last version.
    Thanks
     
  7. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    New version come with full code, so no issue, please email to get it till asset store release 1.4.
     
  8. Batty_Z

    Batty_Z

    Joined:
    Oct 9, 2012
    Posts:
    4
    What was the resolution to the problem mentioned above getting the "failed assemblies stripper" build error when building for iOS?
     
  9. Batty_Z

    Batty_Z

    Joined:
    Oct 9, 2012
    Posts:
    4
    To answer my own question, under "Build Settings", select "Player Settings", then in the Inspector window in the Unity IDE, select the iOS target, then under "Other Settings" set "Stripping Level" to "Disabled".
     
  10. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    With last version you will get full source code (no dll), so it gonna work no problem.
     
  11. Gokhan Dogramaci

    Gokhan Dogramaci

    Joined:
    Oct 22, 2012
    Posts:
    6
    Hi, I've just bought your SQLite3 plugin for my Unity3D Pro but I have problems with the queries. "SELECT" command works perfectly but the queries with the "UPDATE" and "DELETE" command don't work at all, even they are working perfectly in the command line. I think all I need to do is:

    SQLiteQuery query = new SQLiteQuery(Db, "UPDATE ...");
    query.Step();
    query.Release();

    It is working in the command line in windows and in the navigators for the SQL. But it's not working in the game. How can fix this? Thanks in advance...
     
  12. kenlem

    kenlem

    Joined:
    Oct 16, 2008
    Posts:
    1,630
    I wonder if you have set you done the setup. Are you able to run the examples?

     
  13. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Hello,

    Please share your database creation code, I think that is readonly problem. It's looks like you are trying to write to readonly database.

    Thanks
     
  14. Gokhan Dogramaci

    Gokhan Dogramaci

    Joined:
    Oct 22, 2012
    Posts:
    6
    I've changed the access types and it solved the problem! Thanks...
     
  15. cageymage

    cageymage

    Joined:
    Oct 19, 2012
    Posts:
    2
    Hello, first off, is there any other places we can ask for help / support other than here?

    2nd - How does working with aggregate queries work? I tried SELECT MAX(dbfield) FROM table; and I got an exception. It looks like the class iterates through each field in the query by splitting on the word SELECT and commas? Please advise.
     
  16. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    my email is: orangetree.unity@gmail.com
    please contact me directly.

    regarding 2 question, i guess it doesn't - please send me more information, because it should works if your table has "dbfield"
    Mainly you could try your query with SQLiteDatabaseBrowser to see the errors and replay as long as it use the same dll,

    Best regards,
     
  17. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    Can you please explain how SQLLite kit allows access to a SQL Lite database with the web player?
    Is it running through the memory?

    In that case there is no way to persist data?
     
  18. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Exactly , it simulate file system for sqlite library in memory, so in fact you have bynary byte stream which is reflect real sqlite3 format file, so you could download and upload back to the server as regular file.
     
  19. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    Hi i bought your plugin, and seem to be a great plugin, but haven't tested exhaustively, just two questions how can i get the number of rows the query returns? and second when i save the db which the size is 2mb on the persistent data path from the streamingAssets, the db is backup on icloud, and apple will not approve my app, so how can i prevent that the db is backup on icloud.
     
  20. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Sqlite library doesn't support receiving number of rows from query.there is the reason - sqlite don't read all records in memory but execute by steps. So they just don't have it. But if you need a count you could use request like this: select count(*) as count from table where...

    For second question if you have read-only data you may load database in to memory each time, so you will not have a file at all, plus that be works on webplayer automatically.
     
    Last edited: Dec 18, 2012
  21. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    If you are working with an in-memory database, how do you persist the data between different scenes?

    And does SQLLite kit support downloading a file from the server and backing it up again?
    If not, how would you suggest I do that?
     
    Last edited: Dec 18, 2012
  22. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    I have two options:
    1. Pure memory :)memory:) which is original sqlite3 options - with that option you can't get from sqlite3 library data back as file to save later.
    2. Is made by me new feature - I simulate file system in memory and let open sqlite3 library my "memory" file , so sqlite think that it works with file system. so with my solution you will get MemoryStream which is reflect real file so you can save it stream as file.

    Originally I design the system to be able works on WebPlayer which DON'T have any HDD access, so the options for persystent data on WebPlayer is to be downloaded and uploaded each session to server.

    For IPhone as you describe before you face a problem to save into particular folder, so you could ether use Documents foder or a server to act as on WebPlayer - but ofcurze it will requery to be online..
     
  23. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    I am building this all for web player.

    How is the file saved on server? Which server? What permissions are needed for you to be able to save this file on the server.

    Have you also thought about writing out a Memory Stream as a byte array to PlayerPrefs?
     
    Last edited: Dec 18, 2012
  24. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Wow I never think abour PlayerPrefs, but that is Great IDEA!!!! I think it has to work!

    regarding server - you could make PHP server or GAE with we are using (GAE has the size limit for binary)

    Personally I love Ruby, but it require to make your personal managed server.

    I'll suggests to use a asset from asset store with GAE integration, so you could upgrade the example with blob data.

    Basically it depend on your personal experience.
     
    Last edited: Dec 18, 2012
  25. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    I think you should make memory Stream to byte array into playerprefs work :)
    You will have lots of happy customers if you can get SQLLite working with web player quite easily and can persist data between scenes.
     
  26. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    There is no issue to have database between scenes, it will work even now.

    I was talking about between application runs (sessions).

    I will add to sqlite example the PlayerPrefs demo.

    Thank you for great idea!
     
  27. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    Ok let me know when you have a version that works between sessions and I'll definately buy a copy of SQLLite kit :)
     
  28. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    on my early question about icloud, i found that unity already thought on that so when i save my file the i call the method iPhone.SetNoBackupFlag(filename), this method can be found on this link Link to doc, so if one is having the same issue this how i resolved.

    Now that i resolved that i have another question, i found that sqlite support transactions but could't make this works with the sqlitekit, so if someone knows how can i achieve this? I'm making some insert,updates and deletes, but if the user close the app on the middle of this operations i want to make a roll back to a stable version of the database, also if transactions is not supported, what is the best method to make safe operations on the db and rollback when something wrong happen, using sqlitekit.
     
  29. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Thank you for help,

    Regarding transaction -> it supported, plus i just SQLite command : http://www.sqlite.org/lang_transaction.html


    so you just do:

    qr = new SQLiteQuery("BEGIN TRANSACTION");
    qr.Step()
    qr.Release()

    ..
    ..
    ..
    // your insert here
    qr = new SQLiteQuery("INSERT....")
    qr.Bind(111);
    qr.Step()
    qr.Release()

    ....
    ...

    qr = new SQLiteQuery("COMMIT");
    qr.Step()
    qr.Release()



    if you want to cancel use

    qr = new SQLiteQuery("ROLLBACK");
    qr.Step()
    qr.Release()



    If crash happens in between, don't worry sqlite will handle that. data will be safe.
     
  30. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    thx i make something like this:

    db.Open(filename);
    SQLiteQuery qr = null;

    try{
    qr = new SQLiteQuery("BEGIN TRANSACTION");
    qr.Step();
    qr.Release();

    foreach(list_of_inserts){
    qr = new SQLiteQuery("INSERT OR REPLACE INTO TBL_Name ......");
    qr.Step();
    qr.Release();
    }
    }catch{
    qr = new SQLiteQuery("ROLLBACK");
    qr.Step();
    qr.Release();
    }
    finally{
    db.Close();
    }

    and all this works great on pc, mac, ios, but on android crash and make a rollback, if i change the INSERT OR REPLACE for just INSERT, works great, but i need to UPDATE if the row already exist and if not INSERT, but i don't want to have the over-heading of making a Select to check if already exit, and then make a update or insert.

    Some have any ideas why this happening?

    PD. the catch trows this error on the logcat:
    System.Exception: SQLite step fail! error: unable to open database file
    at SQLiteQuery.Step () [0x00000] in <filename unknown>:0
    at DB.updateEvents (System.Collections.Generic.List`1 list_inserts) [0x00000] in <filename unknown>:0
     
  31. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    That is not relative to your particular problem, but you need to make COMMIT for transaction,

    But normally android has less memory, if you do TRANSACTION - it's keep data in memory, so on android you have to really care how many data you putting between BEGIN TRANSACTION ---> COMMIT.

    INSERT OR UPDATE - will get much more memory because it do select for you inside library, what is the reason.

    For your android build I'll recommend two options:
    1. remove: BEGIN TRANSACTION ---> COMMIT. - it will safe a lot of memory
    2. reduce number of inserted items per one transaction. something like split on patches for 100 items each.
     
    Last edited: Dec 20, 2012
  32. siliwangi

    siliwangi

    Joined:
    Sep 25, 2009
    Posts:
    303
    Planned to get this, does the encryption already fixed ?
     
  33. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Hi HGarry,

    It's still a problems with my test function but one of my customers found a solution (but it don't helps for my test function)

    the status is:
    it's works it you don't reopen the save database during the same session.
    Multiple tables are fine now.

    Any way we will fix that. What is your dead line?
     
  34. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    thx, yeah i forgot here on thread but of course i'm doing the commit on my code, and is weird because this this error happen when i'm doing my sixth insert on the db
     
  35. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    Did you get local playerprefs for memoryStream working yet?
    Let me know when you do so I can purchase a copy :)
     
  36. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    hi, i was working with sqlitekit for a month and is a great tool, but i'm having some performance issues on some old devices like iphone 4 and iphone 3gs, when i'm doing a select with INNER JOIN and ORDER BY.

    So i if there a suggestion to improve the speed, it would be great.
     
  37. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Hello darkmax,

    I will suggest to try asynchronous solution in case if you do select run-time.

    Could you explan more about your case
    1. is it runtime , during game logic call you do sqlite call?
    2. Is it possible to put "please wait" in your situation?
     
  38. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Hello Meltdown ,
    Yes, it in example code now - last button in DemoObject.cs :)
     
  39. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    i thought about asynchronous but i can't because i need to receive the information from the database to show my menu, if i made asynchronous other things will break.

    My project is not a game, instead is an app for tourism of my city, and is use the database to administrate the content of the app, and because the content is dynamic i use a db for my menus, and use some joins to build the content that i'm going to display to the user.

    The "please wait" also other member of the team thought it, but because this for some menus, and there are several menus, i don´t want to show please wait to many times
     
  40. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Hi, darkmax

    I think in your case the best is using webplayer demo.
    If you will keep your database in memory it will super fast.

    But how big is your database?
     
  41. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    the database is like 2mb but with the time could increase more, when it has more places.

    but the problem of slow queries is on old devices like iphones 3gs and 4, because on high end devices there is not problem,and the ram on devices like iphone 3gs and 4 they don't have to much, i don't know how much i can put on memory because i have other things on memory and i don't want have high consume on memory.

    but i will try like you said.
     
  42. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Bwt, from my database programming experience in some cases LEFT JOIN could be replaced by select by IDs, but here you will have to do more coding.
    The theory the idea of optimization is that: to make one record with JOIN sqlite/mysql/oracle... library do read SSD/HDD two time from different place of SSD/HDD so driver clean cache (it's calls hdd miss cache). But if you do select one time for some records - driver will don't clean cache and read all record in one time, and do second select selected by ids, (to replace JOIN). It really common optimization for social networks to make db select fast, but be aware on memory so use LIMIT at least 100 or less for mobile.
     
  43. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    Hi Oksana, can you please tell me if you have SQLLite kit working well now with web player, where you are streaming the database to PlayerPrefs for permanent storage? Did you get it working? Please let me know if it is as I'd like to buy it then.
     
  44. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Yes it works as you suggest, but be aware that PlayerPrefs has limit on WebPlayer in 1Mb and as soon as I need save binary stream as string the actual database size is less then 512Kb, so it is ok only for non heavy database.

    In DemoObject.cs at code of the last button you could find good example how to put binary stream in to PlayerPrefs.

    Best regards.
     
  45. Meltdown

    Meltdown

    Joined:
    Oct 13, 2010
    Posts:
    5,816
    That's great work Oksana, thanks, I will be buying it shortly :)
     
  46. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    thx i will try your suggestion about the select, another thing that is happening in some weird cases when i make a query throws this error when i execute the query (the query is correct), this happens when i have open my app and i update the app with unity, and run the the app and when i execute the query trows this:

    Code (csharp):
    1.  
    2. I/Unity   ( 6200): System.ExecutionEngineException: SIGILL
    3. I/Unity   ( 6200):   at Community.CsharpSqlite.Sqlite3.yy_reduce (Community.CsharpSqlite.yyParser yypParser, Int32 yyrul
    4. eno) [0x00000] in <filename unknown>:0
    5. I/Unity   ( 6200):   at Community.CsharpSqlite.Sqlite3.sqlite3Parser (Community.CsharpSqlite.yyParser yyp, Int32 yymajor
    6. , Community.CsharpSqlite.Token yyminor, Community.CsharpSqlite.Parse pParse) [0x00000] in <filename unknown>:0
    7. I/Unity   ( 6200):   at Community.CsharpSqlite.Sqlite3.sqlite3RunParser (Community.CsharpSqlite.Parse pParse, System.Str
    8. ing zSql, System.String pzErrMsg) [0x00000] in <filename unknown>:0
    9. I/Unity   ( 6200):   at Community.CsharpSqlite.Sqlite3.sqlite3Prepare (Community.CsharpSqlite.sqlite3 db, System.String
    10. zSql, Int32 nBytes, Int32 saveSqlFlag, Community.CsharpSqlite.Vdbe pReprepare, Community.CsharpSqlite.Vdbe ppStmt, Syst
    11. em.String pzTail) [0x00000] in <filename unknown>:0
    12. I/Unity   ( 6200):   at Community.CsharpSqlite.Sqlite3.sqlite3LockAndPrepare (Community.CsharpSqlite.sqlite3 db, System.
    13. String zSql, Int32 nBytes, Int32 saveSqlFlag, Community.CsharpSqlite.Vdbe pOld, Co
    14.  
    i always open the db, execute the query, release query, and close db, i don't know why this happens.

    Also i want to ask you what is the best practice when i try to open the db but it said that the db is already open, what is the best method when i receive that exception, i know that i always need to close the db (in fact i do), but i want to know what is the best thing to do in case this happens.

    thx, in advance
     
    Last edited: Jan 14, 2013
  47. darkmax

    darkmax

    Joined:
    Feb 21, 2012
    Posts:
    83
    Just another question is possible to load a db on StreamingAssets to memory?, something like the example that copies the db from StreamingAssets to PerssistentDataPath and then open it
     
  48. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Please tell which platform?
    Did you read simultaneously from two application the same database?

    Update: please email me, I'll sent an update. I think I have to send some fixes from new build.
     
    Last edited: Jan 17, 2013
  49. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    Sure . DemoObject.cs. It's all about it.
     
  50. Oksana-Iashchuk

    Oksana-Iashchuk

    Joined:
    Sep 10, 2012
    Posts:
    126
    I think is the best do try ... catch ... . I do like that. Where is no functions in sqlite library which could tells you without try to open,