Im using an sqlite database with provider and databasehelper. In a specific activity and some fragments (ordere by a FragmentPagerAdapter), I am trying to retrieve the name of a specific id to put it in the toolbar. I do this by creating a global variable with input from onLoadFinished in the activity and also in the fragments. This process is however very slow. The name is not immediately displayed. I have to refresh fragments (several times before the name is displayed. How can I make this more quick so that the name is immediately displayed?
Related
Thanks in advance for your advice!
Background
I’m creating a database to track orders placed by customers.
An ‘Orders’ table stores general details about an order like the customer’s name, order date, and delivery-required date.
A separate ‘Order_Items’ table stores the specific items that the customer has ordered.
The is a one-to-many relationship between the ‘Orders’ table and ‘Order_Items’ table, i.e. one ‘Order’ can have many ‘Order_Items’, but each ‘Order_Item’ must be associated with only one ‘Order’.
Current State
Currently, I have a page where the user creates a new ‘Order’ record. The user is then taken to another page where they can create as many ‘Order_Item’ records as are needed for the order.
Desired State
What I would like to achieve is: When a user creates new ‘Order_Item’ records, it automatically allocates the current ‘Order’ record as the foreign key for the new ‘Order_Item’ record.
What I've Tried So Far
Manual Action By The User: One way of establishing the link between an 'Order' and all of its 'Order_Items' would be to add a drop-down widget which which effectively asks the user something like "Which order number do all of these items belong to"? The user's action would then establish the link between the two tables and associate one 'Order' with many 'Order_Items'. However, my goal is for this step to be handled programatically instead.
Official Documentation: I’ve referred to the offical documentation which was useful, but as I'm still learning I don’t really know exactly what to search for. The prefetch feature appeared promising but does not actually establish a link; it just loads associated records more efficiently.
App Maker Tutorials: I found an App Maker tutorial which creates an HR App where a user can create a list of ‘Departments’, then create a list of ‘Employees’, and then link an ‘Employee’ to a ‘Department’. However, in the example app this connection is established manually by the user. In my desired state I would like the link to be established programatically.
Manual Save Mode:
I’ve also tried switching to manual save mode so that the user has to create a draft ‘Orders’ record and then several draft ‘Order Items’ records and then save them all at once. However, I haven’t managed to make this work. I’m not sure whether the failure of this approach is because 1) I’m try to create draft records on more than one table, 2) I’m just not doing it correctly, or 3) I thought I read somewhere that draft records are deprecated.
Other Ideas
I'm very new to this field and am may be wrong, but I have a feeling I may need to use some scripting to establish the link. For example, maybe I could use a global variable to remember which 'Order' the user creates. Then, for each 'Order_Item' I could use the onBeforeCreate event to trigger a script that establishes the link between the 'Order_Item' and the 'Order' that was remembered from the previously established global variable.
Updated Question
Thanks Markus and Morfinismo for your answers. I have been using both answers with some success.
Morfinismo: I've successfully used the code you directed me to on existing records but cannot seem to get it to work for newly created records.
For example:
widget.datasource.createItem(); // This creates a new record
var managerRecord = app.datasources.Manager.item; // This sets the Manager of the currently selected parent record as a variable successfully.
var teamRecord = app.datasources.Teams.item; // This attempts to set the Manager of the currently selected record as a variable. However, the record that was created in line 1 is not selected. Therefore, App Maker does not seem to know which record this line of code relates to and returns the error Cannot set property ‘Manager’ of null.
// Assign the manager to the team.
teamRecord.Manager = managerRecord; // This successfully assigns the manager but only in cases where the previous line of code was successful (i.e. existing records and not newly created ones).
Do you have any suggestions or comments on how to apply this code to records that are created by the initial line of code in line 1?
I have found the easiest way to create related items for situations such as yours is to actually import a form with the datasource set to Parent: Child (relation) or Parent: Child (relation) (create). So in your case the datasource would need to be set to Order: Order_Items (relation).
You can get this accomplished in two different ways using the form widget wizard:
Option 1:
If your page datasource is set to Order_Items, drag your form on your page.
In the datasource selection section, your datasource in the form widget should default to `Inherited: Order_Items'. Click the 'Advanced' button in the bottom left corner, then from the datasources category find Order as your datasource, then select relations in the next field, and then Order_Items in the next field, choose 'Insert only' or 'Edit' form and then the appropriate fields you want in the form.
Now every item that gets created in that form will automatically be a child record of the currently selected record in your Order datasource.
Option 2:
If your page datasource is set to Order, drag your form on your page.
In the datasource selection section, your datasource in the form widget should default to Inherited: Order. Scroll down in your datasource selection section until you find Order: Order_Items (relation), then choose 'Insert only' or 'Edit' form and then the appropriate fields you want in the form.
Now every item that gets created in that form will automatically be a child record of the currently selected record in your Order datasource.
In your Order model, make sure that the security setting is set appropriately that a user is allowed to create relations of Order_Items in Order. That is the simplest approach in my opinion since you don't have to hard code the parent into your form or client/server scripts. It is automatically based on the currently selected parent, and is essentially doing the same thing that #Morfinismo explained in the client script section.
The comment I placed under your question included a link to the official documentation that explains what you need. Anyways, your question is not clear enough to determine whether you are creating the records via client script or server script, hence this is a very general answer.
To manage relations via client script:
var managerRecord = app.datasources.Manager.item;
var teamRecord = app.datasources.Teams.item;
// Assign the manager to the team.
teamRecord.Manager = managerRecord;
// Changes are saved automatically if the datasource in auto-save mode
// Add a team member to a Manager's team.
// Note: Retrieve Members on the client before proceeding, such as by using prefetch option in datasource - datasources Team -> Members)
var engineerRecord = app.datasources.TeamMember.item;
teamRecord.Members.push(engineerRecord);
To manage relations via server script:
// Get the record for the Team to modify.
var teamRecord = app.models.Teams.getRecord("team1");
// Assign a manager to the Team.
var managerRecord = app.models.EmployeeDB.getRecord("manager1");
teamRecord.Manager = managerRecord;
// Note: The new association is not saved yet
// Assign a team member to the Team.
var engineerRecord = app.models.EmployeeDB.getRecord("engineer1");
teamRecord.Members.push(engineerRecord);
// Save both changes to the database.
app.saveRecords([teamRecord]);
The above information is taken directly from the official documentation, which like I said, I referred to in the comment I placed under your question.
Whenever i will upload the data to the firebase it give random name to the child node. In the image "Upload" this name in given by me but what about inside name i want to change the name of inside the upload root how i can do that
The name inside the Upload is generated using push(), that you are using in your code, that is why you see it.
push() is a method that creates a random id to be able to seperate records in the database and also to be able to easily identify records in the Firebase Database.
push()
Create a reference to an auto-generated child location. The child key is generated client-side and incorporates an estimate of the server's time for sorting purposes. Locations generated on a single client will be sorted in the order that they are created, and will be sorted approximately in order across all clients.
more info here: https://firebase.google.com/docs/reference/android/com/google/firebase/database/DatabaseReference.html#push()
I have a webpage in which users input some data and that data is supposed to be stored in the database and then at the same moment should be displayed in the display section.
I have a very trivial question please. How can I take the result from the database to be displayed the same moment the user inputs it in the database? Is it like something cronjob, which checks the database every second that the new results have been input or not?
e.g. I have a registration form to register the properties in a property webpage. if a user submits a form to my database, how can I keep checking whether the database is updated or not? The users would expect their property listing to be displayed on the webpage within a second
I have been working with InfoPath forms for the last two months or so, and I now have the following requirement:
I have a form which is filled in by certain users, then sent to other users. The latter, after viewing the data on the form, have the possibility to either Accept & Reply or Reject.
When they click on Accept & Reply, another form is triggered, in which some of the fields are repeated. I would like to know how to get the values from the first form to that triggered form.
Let me precise that I am not using SharePoint; they are accessing the forms from a shared folder on the LAN.
Thanks in advance for your help on this.
Yusuf
That I know of you can't directly access the new form since Infopath keeps all instances separate (SDI vs MDI). You need a "middle" storage location. A database isn't a bad idea if you have one available - when the user clicks the button, data is saved to the DB, then the new form is opened and reads from the DB on form load.
Another way we have used (which is equally as cumbersome), is to use a blank copy of the form itself (not the original xsn). It is bad because you have to manually keep the blank copy up to date if you change the template but works well for what you are doing. Only recommended if you REALLY need those fields populated and you don't have a DB you can use for temp storage.
Open your form template like you are going to fill in the form but just save a "blank" copy to the share (it will save as xml). The process behind the button on your source form is: create a unique copy of the blank form (we store them all in a subfolder that gets cleaned out nightly), programmatically open and edit that new blank copy (easy since it is xml) putting data in the correct fields, save the edited copy, open the edited copy for the user instead of the xsn.
I have an asp.net page that calls a dll that will start a long process that updates product information. As the process is running, I want to provide the user with constant updates on which product that process is on and the status of the products. I've been having trouble getting this to work. I add information to a log text file and I was thinking that I'd redirect to a new page and have that page use Javascript to read from the text file every few seconds. My question is has anyone else tried this and does it work fairly well?
I would use Ajax and poll that text file for updates.
Make the long process so that it updates some state about the progress - status, last product processed, etc.
Once started, you might want to update the progress on only say every 50th item processed, to spare resources (you might not, it depends on what you want) on the ASP.NET side.
If the processing is associated with the current session, you might want to put the state in the session. If it is not - e.g. global - put it in some global state.
Then poll the state once in a while through Ajax from javascript, using e.g. JSON and update the UI accordingly.
Make sure you use proper locking when accessing the shared state.
Also, try to keep the state small (store only what is absolutely required to get the data for the js gui).
Rather than outputting the status to a text based log file (or, in addition to using the log file; you can use both), you could output the status to a Database table. For example, structure the table as so:
Queue:
id (Primary Key)
user_id (Foreign Key)
product_id (Foreign Key) //if available
batch_size //total set of products in the batch this message was generated from
batch_remaining //number remaining in this batch
message
So now you have a queue. Now when a user goes on a particular page, you can do one of two things:
Grab some relevant data from the Queue and display it in the header. This will be updated every time the page is refreshed.
Create an AJAX handler that will poll a web service to grab the data at intervals. This way you can have the status update every 15 or 20 seconds, even if the user is on the same page without refreshing.
You can delete the rows from the Queue after they've been sent, or if you want to retain that data, add another column called sent and set it to true once the user has seen that data.