Levenshtein distance in ROOM database - android

I have created an application that using some predefined dictionaries (for different languages) to show user matching word (each word atm is search by normalised value e.g. "łowić" -> "lowic" and search by given prefix). The problem is it is not very useful as it is usual that user will mistype some characters and using this solution, i am not able to show him proper hint. As it was available in SQLite to add extensions, that in ROOM database i can not find any way to do it. The extra problem here is that the dictionaries can contain enormous number of words so i can not calculate this by my own.
So:
is there any way to use extensions like https://github.com/agusibrahim/android-sqlite-extension in room database?
if not, should i use other database or can i do it other way?
Any advice will be appreciated.

While I have not tried it my guess is no, you cannot use Room with Android SQLite support library.
The reason is that Room depends on the SQLite3 built-in packages and doesn't "know" that this library exists in your project.
You can skip using Room and include that package in your project and then use the extension as explained in the base project:
Android SQLite support library
and the extensions project:
SQLite3 Extension for Android

Related

Android SqliteAssetHelper - merging database tables from asset with the existing one

I am using Android SqliteAssetHelper library (https://github.com/jgilfelt/android-sqlite-asset-helper)
I have shipped my database using this library and the database contains some records on table1.
Now I want to update my app with a new database with additional records which should be inserted in the one which i already shipped. I am not sure how exactly to write the SQL scripts for the upgrade since the schema is same for both the databases. Did anyone try this?
After comments by the op in other answers, it was clarified that there are two databases to merge together. The op wants to know if there is a convenient way to merge two databases together with the SQLiteAssetHelper library.
Unfortunately there isn't a direct way to do that because that library also uses the same Android pattern of running a script to modify an existing database.
The workaround is to transform the second database (set of 50 records) into 50 INSERT statements that will get put next to the existing 50. (There are various tools all over the internet to simplify that step so you don't have to do it by hand.) So as long as the business logic can work with them all together they can all go in the original table if the schemas are the same; or if you need them separated, use the 50 INSERTs still still but have them INSERT to a different table name instead.
Then, once you have these 50 INSERT statements with the data of the 50 new rows, put the statements in an upgrade script and you can follow the standard library documentation on how to get that script to run via this library.
You can make this happen by using sqldiff to find the differences between an old DB and a new one.
You call sqldiff on your two databases and pipe the output into a file that conforms to SQL Asset Helper's upgrade format (i.e. <database_name>_upgrade_<from_version>-<to_version>.sql).
So, the whole thing would be sqldiff database.db database_new.db > database.db_upgrade_1-2.sql
Then just make sure that .sql file is in the assets/databases directory and change the version numbers in your Java code (in the example case, from 1 to 2).

Two languages in sqlite database - Android

I have simple database - one table with 6 collumns. 3 of them i want have in two languages.
Is it possible to do it automatically ? Like add language prefix to collumn and it will choose language(_EN,_PL) that user use ? It will work ?
I must have everything in one database, because I copy it to users device.
I can' t find information about it, thanks for help.
No, that isn't how SQLite DBs work even with Android's localization features. You can do it with strings.xml (for example) by creating...
/res/values/strings.xml
/res/values-pl/strings.xml
...and so on but databases and queries work on absolute column names.
The best way of doing this I can think of is to identify the local language and simply use the abbreviation as a suffix or prefix when building queries etc.

Building of an sqlite database outside an android project?

I'd like to create a project which generates a sqlite database, which will eventually be used by an android application. I'd like to create this project as a standard java application, so I can hook it up to a build script etc. What's a good way to go about doing this, so that the sqlite database I output is conformant with the way android sqlite classes expect to have it in?
I could create this util project as an android project, and then I have access to all the sqlite classes, but the output sqlite file would live on an emulator instance, right? And I'd have to fire up an emulator etc whenever I wanted to run the util, ugh.
Thanks
As others have suggested, I wouldn't build a project for it, I'd find one of the existing utilities out there and create the DB that way. I use SQLite Expert.
Despite what Seva said, there are some things you have to do to make it usable by android. It's readable in any state, but if you want the framework to be able ot make use of it like intended (to populate listviews and other widgets), it has to have certain things.
1) The database must contain a table called "android_metadata"
2) This table must have the column "locale"
3) There should be a single record in the table with a value of "en_US"
4) The primary key for every table needs to be called "_id" (this is so Android will know where to bind the id field of your tables)
Then you put the DB in your assets folder and copy it to your apps data directory on startup.
A good link for this process is here.
Why do you want create a separate Java project to create a SQLite database? There are graphical shells over SQLite out there. I personally like SQLiteStudio.
There's nothing special about the way Android accesses them - SQLite is SQLite, the database format is the same on every platform. Create a new database file, create some tables in it, insert some data, then place it into an Android project and play with it.
can create you other as libray project and can attach it with your project...libaray project may be an android or simple java project as per your need...
Note: use the version of sqlite that comes with the SDK -- it's been modified slightly. If you use the off-the-shelf sqlite3 commandline tool, the databases it generates are incompatible with Android.

Android DB: Merging Two Databases Using SQL Dumps

I'm currently working on the database part of a project where I have to merge the contents of two databases and I would like to ask you if there exists a simple API method
within the Android API/SDK itself that dumps me a database to a SQL text file.
Actually I found no hint in the API documentation about such an implementation myself. And I really doubt there is a single line method somewhere buried behind the curtain.
However I've already made a workaround using the sqlite3 shell tools of Android Linux by invoking:
String[] cmd = {"/system/bin/sh", "-c", ..., "sqlite3 ..."};
Runtime.getRuntime().exec( cmd );
Where I have two choices, a) pipe it directly to an output file or b) write the file using BufferedOutputStream.
Nevertheless, most likely due to compatibility issues am I asking you of a more convenient way within the API itself, rather than using the critical shell trick within the App.
I am also pretty much interested in any fast & pretty clues about merging two databases using Android's database methods.
Thanks.
There's nothing built in to the API that will help you. You could query, and write the INSERT statements yourself. There's a blog entry (http://mgmblog.com/2009/02/06/export-an-android-sqlite-db-to-an-xml-file-on-the-sd-card/) , on building an XML file from the results of your query. A few tweaks, and you coule build your own dump file.
You don't say what kind of merge you need to do, but you might be able to use ORMLite, by doing something like override the equals method on your model objects to compare the records and/or combine data from certain fields (assuming the schema is the same), without having to write a lot of SQL.

RDF databases on Android

I'm working on a project on mobile RDF databases for Android. Therefore I'm looking for open source databases to include in my Android project. However, it's difficult for me to find mobile versions of existing RDF databases.
What I've found so far:
Jena TDB database
Oracle Berkeley database
Unfortunately I haven't found mobile versions of Sesame, Virtuoso, AllegroGraph, etc.
Does anyone know some other RDF databases for Android?
I'm not an Android developer, so perhaps I'm overlooking something, but Sesame comes as a collection of maven modules, each a separate Java jar file. You can pick and choose the jar files you need and as far as I'm aware, you should be able to use them on Android straightaway. I don't think there's any need for a separate "mobile version", is there?
I am taking a look to Triple Place.
a light weight and flexible Triple Store for Android. It uses a
indexing structure similar to the one in Hexastore. TriplePlace uses
TokyoCabinet as persistent storage system.
You can find a brief presentation of its features here.
You can use SQLite to store RDF data and make queries for the triples, but SPARQL couldn't be done. Here is a good reference:
http://infolab.stanford.edu/~melnik/rdf/db.html
I would also take a look at 4store.

Categories

Resources