#include "objectbox-model.h"
#include "tasklist.obx.h"
obx_err print_last_error() {
printf("Unexpected error: %d %s\n",
obx_last_error_code(), obx_last_error_message());
return obx_last_error_code();
int main(int argc, char* args[]) {
// Firstly, we need to create a model for our data and the store
OBX_model* model = create_obx_model(); // generated in objectbox-model.h
if (!model) goto handle_error;
if (obx_model_error_code(model)) {
printf("Model definition error: %d %s\n",
obx_model_error_code(model), obx_model_error_message(model));
OBX_store_options* opt = obx_opt();
obx_opt_model(opt, model);
store = obx_store_open(opt);
if (!store) goto handle_error;
// obx_store_open() takes ownership of model and opt and frees them.
box = obx_box(store, Task_ENTITY_ID); // Note the generated "Task_ENTITY_ID"
Task new_task = {.text = "Buy milk"};
id = Task_put(box, &new_task); // generated in tasklist.obx.h
if (!id) goto handle_error;
printf("New task inserted with ID %d\n", id);
task = Task_Get(store, box, id); // generated in tasklist.obx.h
if (!task) goto handle_error;
printf("Task %d read with text: %s\n", id, task->text);
const char* appendix = " & some bread";
// Updating a string property is a little more involved
// because of C memory management.
size_t old_text_len = task->text ? strlen(task->text) : 0;
(char*) malloc((old_text_len + strlen(appendix) + 1) * sizeof(char));
memcpy(new_text, task->text, old_text_len);
// free the memory allocated previously before overwritting below
memcpy(new_text + old_text_len, appendix, strlen(appendix) + 1);
printf("Updated task %d with a new text: %s\n", id, task->text);
if (obx_box_remove(box, id) != OBX_SUCCESS) goto handle_error;
free_resources: // free any remaining allocated resources
if (task) Task_free(task); // free allocs by Task_new_from_flatbuffer()
if (store) obx_store_close(store); // and close the store
handle_error: // print error and clean up