Closed SalazarRiva closed 3 years ago
Salut recomand sa mergi pe varianta accesibila si sa folosesti direct api-ul getSharedDB.
Buna seara -
Am reusit sa obtin un db object cu getWalletDB - care dupa ce m-am uitat in cod este un alias pentru getSharedDB:
let storageSSI = keyssispace.createSeedSSI("default");
let mydb = db.getWalletDB(storageSSI, "mydb");
// mydb.insertRecord("mytable", "key", "recordding");
//
setTimeout(function () {
console.log(mydb.getRecord("mytable", "key", function (err, record) {
console.log("the record is", record)}
));
}, 2000);
Daca fac readul imediat dupa write imi tot dadea undefined - a trebuit sa las o pauza de 2 secunde ca altfel nu merge. Am reusit sa scriu si sa citesc entry-uri, dar daca dau build la aplicatie si dupa o pornesc iar in browser (un refresh/ un nou incognito window etc) nu persista nimic.
Q: De ce nu se salveaza datele? - am incercat sa comentez insertul - si dupa cand da read again, da undefined.
Folosesti acelasi keyssi la initializare ? Sau faci de fiecare data cate unul nou, astfel fortand db-ul sa foloseasca cate un dsu nou?
Fac de fiecare data unul nou - cred - nu asa obtin SSI let storageSSI = keyssispace.createSeedSSI("default"); ?
Exact, tu faci cate un keyssi nou de fiecare data de asta “nu se persista” datele. Keyssiurile pot fi serializate si deserializate. Vezi functia de getIdentifier() de pe keyssi si poti vedea si functia de parse din loadApi(“keyssi”)
Am printat ssi-ul serial generat automat de
let storageSSI = keyssispace.createSeedSSI("default");
console.log(storageSSI.getIdentifier());
L-am copiat din consola de la browser, si acuma am ceva de genul in cod
let storageSSI = keyssispace.parse("BBudGH6ySHG2G5ffNrTWs9R4cplozWmqnViwH83w4oppnmwvdzw8w8cv5txGO6GPY9E7x24T5UrtvRetVrSuDK");
let mydb = db.getWalletDB(storageSSI, "mydb");
si pare sa mearga, in sensul ca persista datele - nu stiu daca e cea mai buna abordare, dar functioneaza :) - daca aveti alta sugestie - nu ezitati sa imi spuneti.
Va multumesc ca m-ati indrumat si ca am reusit sa ajung pana aici - documentatia m-a bagat putin in ceata.
O seara buna.
Sunt foarte multe concepte si metode de lucru noi, trebuie sa acorzi rabdare un pic mai mult. Sper ca ti-a fost de folos experienta.
Revin - sper ca pentru ultima oara - Am intampinat o neclaritate cand fac retrieve la date din db. Eu am un json in care stochez perechi de forma data:event. pentru inceput ma rezum la doar prima luna din calendar si o sa am ceva de genul: 1: 'First event'. Acest JSON il serializez si il scriu sub o cheie in db.
Ce nu inteleg este de ce atunci cand fac retrieve cu getRecord() primesc un json de forma:
0: "{", 1: """, 2: "1", 3: """, 4: ":", 5: """, 6: "F", 7: "i", 8: "r", 9: "s", 10: "t", 11: " ", 12: "e", 13: "v", 14: "e", 15: "n", 16: "t", 17: """, 18: "}", __version: 0, pk: "events", __timestamp: 1622581079850}
0: "{"
1: "\""
2: "1"
3: "\""
4: ":"
5: "\""
6: "F"
7: "i"
8: "r"
9: "s"
10: "t"
11: " "
12: "e"
13: "v"
14: "e"
15: "n"
16: "t"
17: "\""
18: "}"
pk: "events"
__timestamp: 1622581079850
__version: 0
__proto__: Object
Din ce inteleg, eu practic trebuie sa iterez peste atributele obiectului sa vad care sunt de tip int si sa concatenez valoarea la un master string pe care dupa sa il deserializez (lucru care sunt sigur ca nu trebuie sa il fac si gresesc ceva) - dar nu vad ce.
Am incercat sa fac asta:
setTimeout(function () {
console.log(mydb.getRecord("eventsTable", "events", function (err, record) {
let res = '';
for (let prop in record) {
if (typeof prop === 'number') {
res += record[prop];
}
console.log(prop, typeof prop);
}
console.log("thes res is ", res);
console.log("the record is", record)}
));
Dar strategia cu typeof nu merge pentru ca 0, 1, 2, ..18 sunt defapt strings
0 string
ExampleController.js:48 1 string
ExampleController.js:48 2 string
ExampleController.js:48 3 string
ExampleController.js:48 4 string
ExampleController.js:48 5 string
ExampleController.js:48 6 string
ExampleController.js:48 7 string
ExampleController.js:48 8 string
ExampleController.js:48 9 string
ExampleController.js:48 10 string
ExampleController.js:48 11 string
ExampleController.js:48 12 string
ExampleController.js:48 13 string
ExampleController.js:48 14 string
ExampleController.js:48 15 string
ExampleController.js:48 16 string
ExampleController.js:48 17 string
ExampleController.js:48 18 string
ExampleController.js:48 __version string
ExampleController.js:48 pk string
ExampleController.js:48 __timestamp string
Din ce inteleg acuma in loc de typeof
trebuie sa fac un regex match sa vad care contine numere si pe ele sa le concatenez, si nu am garantia ca le concatenez in ordinea in care trebuie. Nu e cam mare overheadul pentru a citi un record? Fac eu ceva gresit?
Am gasit alta metoda cu readkey si writekey, dar tot sunt confuz de cum se stocheaza datele.
Cred ca problema ta este la scrierea in baza de date, nu la citire. Uitate in testele din opendsu/tests/db cum sunt facute apelurile de scriere si citire.
Intararile in baza de date pot fi direct obiecte nu trebuie tu sa faci la mana json.stringify pe ele, se face automat serializarea dupa ce in prealabil se injecteaza meta info pe recorduri, etc.
Am incercat aseara sa imi faca o instanta de basicDB, dar din ce vad pe documentatie trebuie sa ii dau argument un Storage strategy. M-am uitat prin codul de privatesky, unde se mai folosesc basicDB-uri si am vazut ca ceva de genul asta trebuie:
Dar din ce vad - acest
MemoryStorageStrategy
- e din openDSU. Asa ca am incercat si eu in aplicatia mea sa daulet MemoryStorageStrategy = require("MemoryStorageStrategy");
, dar imi da eroare. Asa ca am luat fisierul de MemoryStorageStrategy.js din openDSU si l-am pus in bundles la ssapp-ul meu si am facut refference din index.html asa:Tot primeasc o eroare de genul:
Ma puteti ajuta cu un hint pentru a importa un strategy de storage din ssapp-ul meu - cat sa pot sa am un obiect de basic db? Intuiesc ca un shared db ar fi fost mai ok pentru tema, dar din ce vad overheadul de a crea unul e un pic mai mare si ma voi multumi cu un basic db pentru moment - sa stochez calendar events.