Android Tutorial [B4X] CloudKVS - synchronized key / value store

luke2012

Well-Known Member
Licensed User
Longtime User
@Erel I'm thinking to implement CloudKVS within an existing app that store data in solite db tables.

Is it correct if I assume that a single sqlite db tablet could be mapped (ported) to a KVS store?

KVS Key ---> SQLite col. Name
KVS Value ---> SQLite col. Valute
 

luke2012

Well-Known Member
Licensed User
Longtime User
You need to read the data from the current database and add it with CKVS.Put. How you map the items depends on your requirements.

The primary key for example can be used as the key and all the records can be stored as the value (with a custom type).

Ok.
So assume that I have to do a SQLite INSERT statement porting where I have a record primary key set as an auto increment (numeric id) within the SQLite table.
In this case, we assume that the KVS Key must handle (emulate) the SQLite auto increment ID.

Within an INSERT (Put) statement I have to compute the new auto increment ID like : KVSObj.size + 1 ?
In this way (for example) I'm sure that the new numeric id (key) is unique because the KVSObj.size + 1 element doesn't exist within the KVS store. I'm right?
 

luke2012

Well-Known Member
Licensed User
Longtime User
You shouldn't write directly to the SQLite database. You need to use ckvs.Put to insert data. Otherwise it will not work properly.

@Erel I agree with you and I understand it, so assuming that my custom type represent my data record (for example) in order to insert a new element (with a unique key) in the ckvs I have to write:

B4X:
private myUniqueKey as int = ckvs.size + 1
private MyVal as object = MyCustType
ckvs.put (myUniqueKey, MyVal)

Is it correct ?
 
Last edited:

luke2012

Well-Known Member
Licensed User
Longtime User
You are missing the user field (see the example).

A key / value store works better with a real, meaningful key. Your solution can only work if the data (related to the same user) will never be updated by multiple clients at the same time.

In other words within the kvs cloud I cannot write (.put) a kvs store using multiple clients at the same time using the same user field. It is correct?
 

luke2012

Well-Known Member
Licensed User
Longtime User
You are missing the user field (see the example).

A key / value store works better with a real, meaningful key. Your solution can only work if the data (related to the same user) will never be updated by multiple clients at the same time.

@Erel, thank you for your helpful answer.
In order to let my solution works fine within a scenario With 2 clients that runs a Put at the same time using the same user field (for ex. "User1) I Need to generate a unique key (unique key across All clients that run the Put using the same user field).

Client1
ckvs.put ("User1", Key1, aValue)

Client2
ckvs.put ("User1", Key2, aValue)

Can I generate a unique key across client1 and client2 also if client1 and client2 runs the Put at the same time ?
Is it possibile?
 
Last edited:

luke2012

Well-Known Member
Licensed User
Longtime User
Using CloudKVS can I Put an image (blob) as value within a custom type ?
 

luke2012

Well-Known Member
Licensed User
Longtime User
A little true / false to understand better the KVSCloud solution

1) Each KVSClient handle a "private" store (SQLite db). So ckvs1 handle "store1" and ckvs2 handle "store2" that are two indipendent SQLite db on the device storage.
2) When I put an item (key / value) for a specific user (ex. "User1") I cannot change / switch the user field (ex. from "User1" to "User2") after it has been stored into KVSClient store (SQLite db).
3) When the kvs (server) store is lost (ex. storage failure) all the data that the user putted in the store is lost.
4) The KVSCloud Server can be accessible on internet by KVSClients using a Dynamic DNS service like DUCK DNS
 

Erel

B4X founder
Staff member
Licensed User
Longtime User
I think that you didn't understand it correctly.

1) You should use a single client on every app.
2) Each field is uniquely determined based on the user and key fields. You cannot modify existing items. You can remove and add (or replace) items.
3) The connection can be lost and nothing bad will happen (don't be confused from the online demo). The server database should never be lost. Make a backup if you need.
4) This is not really related to CloudKVS. If the computer doesn't have a static ip address then you need to use a service such as duck dns to manage the ip address.
 

luke2012

Well-Known Member
Licensed User
Longtime User
You need to read the data from the current database and add it with CKVS.Put. How you map the items depends on your requirements.

The primary key for example can be used as the key and all the records can be stored as the value (with a custom type).

I understood your example. This example is valid for one specific table.
I think that if I have more than one table I need to add the table name info within the key (as primary key prefix for example) in order to bind all the values (records) to the corresponding table. It is correct?
 

luke2012

Well-Known Member
Licensed User
Longtime User
There are no tables. It is a key/value store. It is not a SQL database (technically it is based on a SQL database however the API exposed is different).

https://en.wikipedia.org/wiki/Key-value_database

Ok @Erel, thanks for your info. Now It's quite clear.

But my great doubt is:

If I have to do a porting of an old B4A Android App that works with a local Database (many SQL query and some SQL tables) and within this database I have more than one data sets (orders table, catalog table...) to a distributed data platform (where all app instances within all devices share the same App data).
Which is the most advantageous solution considering a balance between development cost (time) and development complexity (porting and project maintenance):

1) KVSCloud
2) Server Data Collection Solution (https://www.b4x.com/android/forum/t...olution-device-desktop-and-web-reports.37254/)

P.S.
Considering that my target is to obtain a cheap development total cost (for my customer)
 

Fernando Melo

Member
Licensed User
Longtime User
Suppose i need to sync local off-line data with RDC. Using a flag for deleted rows and date-time columns for sync issues is a way? Or KVSCloud should be better for this scenario? I know that kvs is different. But i see that KVSCloud can act as a transaction log.
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…