Building A Global Object in Titanium to be written to sqlite3 database - sqlite

This question is about implementation.
I'm building an android application with titanium.
There are multiple screens and i take data in each of them.
Each screen is a commonJS module
I want to write all the data i take to an sqlite3 database, but i suppose it would be inefficient to write them as i take inputs. Two ways come to my mind as to how to do this.
create an object and pass to each module to hold the data as i take them
create an object in the first module to hold the data and pass each data item to it by firing a custom event.
What i'm asking, is if there's a better approach to this or which of these two would be more efficient.
NB: I don't have a lot of screens, but that could change though.
Thanks.

Titanium.App.Properties are widely used for Global variable creation.
The following methods will help you to create global variable
setBool : Sets the value of a property as a Boolean data type
setDouble : Sets the value of a property as a double (double-precision, floating point) data type
setInt : Sets the value of a property as an integer data type
setList : Sets the value of a property as an array data type
setObject : Sets the value of a property as an object data type
setString : Sets the value of a property as a string data type
All the above methods will allow user to save corresponding type of data as gloabl. You may retrieve saved values using getBool, getDouble, getInt, getList, getObject, getString methods respectively.

i think Ti.App.properties set and get string would do fine for you here is example too
http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.App.Properties
Thanks

Related

create objects dynamically according database values

I have a Flex project. I want to dynamically create mx.controls.Image objects and add them to the display. However, the number of images and it properties deponds on the value stored in a database. Hence, I have to connect to the database,read the values for data table, then create objects dynamically according the values.
Then, I wonder if this is possible and how to do this.
Thanks in advance.
Felix
Just try declaring a variable as *.
Like var any:*; And check always for null. So it will take any type of value.
Hope it will help.

crossfilter filter does not apply on update data. Is it by design?

I am managing a large dateset using crossfilter in my recent project, in which I will need ability to change the data value (a bool). However after the value changed, the filter on this property does not filter out changed item. For instance I have large dataset whose data has a property of Boolean named as 'Ignore'; I create a dimension for this property to filer out the data have ignore= true. In app, user has a capability to change this value from false to true. after value changed true, clear filters and refilter the data on this dimension, I am still getting the data item which supposed being filterred out. Is it by design or there is way to around it?
From the API Docs and source it appears this behaviour is not supported.
https://github.com/square/crossfilter/wiki/API-Reference

dynamodb creating a string set

I have a lot of objects with unique IDs. Every object can have several labels associated to it, like this:
123: ['a', 'hello']
456: ['dsajdaskldjs']
789: (no labels associated yet)
I'm not planning to store all objects in DynamoDB, only these sets of labels. So it would make sense to add labels like that:
find a record with (id = needed_id)
if there is one, and it has a set named label_set, add a label to this set
if there is no record with such id, or the existing record doesn't have an attribute named label_set, create a record and an attribute, and initialize the attribute with a set consisting of the label
if I used sets of numbers, I could use just ADD operation of UPDATE command. This command does exactly what I described. However, this does not work with sets of strings:
If no item matches the specified primary key:
ADD— Creates an item with supplied primary key and number (or set of numbers) for the attribute value. Not valid for a string type.
so I have to use a PUT operation with Expected set to {"label_set":{"Exists":false}}, followed (in case it fails) by an ADD operation. These are two operations, and it kinda sucks (since you pay per operation, the costs of this will be 2 times more than they could be).
This limitations seems really weird to me. Why are something what works with numbers sets would not work with string sets? Maybe I'm doing something wrong.
Using many records like (123, 'a'), (123, 'hello') instead of one record per object with a set is not a solutions: I want to get all the values from the set at once, without any scans.
I use string sets from the Java SDK the way you describe all the time and it works for me. Perhaps it has changed? I basically follow the pattern in this doc:
http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_UpdateItem.html
ADD— Only use the add action for numbers or if the target attribute is
a set (including string sets). ADD does not work if the target
attribute is a single string value or a scalar binary value. The
specified value is added to a numeric value (incrementing or
decrementing the existing numeric value) or added as an additional
value in a string set. If a set of values is specified, the values are
added to the existing set. For example if the original set is [1,2]
and supplied value is [3], then after the add operation the set is
[1,2,3], not [4,5]. An error occurs if an Add action is specified for
a set attribute and the attribute type specified does not match the
existing set type.
If you use ADD for an attribute that does not exist, the attribute and
its values are added to the item.
When your set is empty, it means the attribute isn't present. You can still ADD to it. In fact, a pattern that I've found useful is to simply ADD without even checking for the item. If it doesn't exist, it will create a new item using the specified key and create the attribute set with the value(s) I am adding. If the item exists but the attribute doesn't, it creates the attribute set and adds the value(s). If they both exist, it just adds the value(s).
The only piece that caught me up at first was that the value I had to add was a SS (String set) even if it was only one string value. From DynamoDB's perspective, you are always merging sets, even if the existing set is an empty set (missing) or the new set only contains one value.
IMO, from the way you've described your intent, you would be better off not specifying an existing condition at all. You are having to do two steps because you are enforcing two different situations but you are trying to perform the same action in both. So might as well just blindly add the label and let DynamoDB handle the rest.
Maybe you could: (pseudo code)
try:
add_with_update_item(hash_key=42, "label")
except:
element = new Element(hash_key=42, labels=["label"])
element.save()
With this graceful recovery approach, you need 1 call in the general case, 2 otherwise.
You are unable to use sets to do what you want because Dynamo Db doesn't support empty sets. I would suggest just using a string with a custom schema and building the set from that yourself.
To avoid two operations, you can add a "ConditionExpression" to your item.
For example, add this field/value to your item:
"ConditionExpression": "attribute_not_exists(RecordID) and attribute_not_exists(label_set)"
Source documentation.
Edit: I found a really good guide about how to use the conditional statements

How determine primitive type in WPF DataGrid (when using AutoGenerateColumn)?

How can I determine the primitive Type of the bound column to a DataGrid control, when the control is created using AutoGeneratingColumn?
I have looked in all these classes: DataGridColumn, DataGridBoundColumn, DataGridTextColumn, and DataGridBoundColumn.Binding.
I am unable to determine which Type (primitive type) the columns are bound to. (They are Bound to a SQL table.) I want to apply different styles and converters based on the type. I could Hard Code these styles and converters based on the column name (which I can get from DataGridTextColumn.Header), but I want to AVOID THAT AT ALL COSTS!
Looks like I found the answer.
The type is passed into the "AutoGeneratingColumn" handler as e.PropertyType.
The problem is, it isn't the real type. It must be boxed, because even though the database column is "nullable" the type passed isn't.
So, I am going to have to "Hard Code" my solution, based on Column Name. :(

Flex DataGridColumn with array of objects as data provider

I have a datagrid that uses an array of objects as the data provider. The objects are essentially key/value pairs:
{ foo:"something"}
{ bar:"hello"}
{ caca:"lorem"}
The datagrid has 2 columns. The first column is the key and the second column is the value. Right now my grid looks like:
My dataFormatter function makes sure that depending on the column (i.e. the dataField value) the correct key or value gets printed out. This works fine for displaying. However, as soon as I try and edit the value field it essentially adds a new value into the object with a key of '1'. For example, if I edit the {caca:"lorem"} object it will then contain the value {caca:"lorem",1:"new value"}.
Is there any possible way I can set the DataGridColumn so that when I edit a value it will update the value associated with the key rather than inserting a new value? I've tried using a custom item editor but it still does the insert. It seems like I need to be able to update the 'dataField' with the actual key value but I'm not sure how to do that.
Looks like you need to think about where your data is going to be stored. I would recommend listening for a CollectionEvent.COLLECTION_CHANGE event on your data model. That event object will contain info about what change occurred, and you can make any updates you need to make.

Resources