API Reference - zuki/Dexie.js GitHub Wiki
- Dexie
- DexieError
- Collection
- IndexSpec
- ModifyError
- Promise
- Table
- TableSchema
- Transaction
- Version
- WhereClause
- WriteableCollection extends Collection
- WriteableTable extends Table
ã¯ã€ãã¯ã»ãªãã¡ã¬ã³ã¹ãžãžã£ã³ã
Typescriptã§ã®Dexieã®äœ¿çš
var db = new Dexie("MyDatabase");
db.version(1).stores({
friends: "++id, name, age, *tags",
gameSessions: "id, score"
});
++ | Auto-incremented primary key |
& | Unique |
* | Multi-entry index |
[A+B] | Compound index |
db.version(1).stores({
friends: "++id,name,age,*tags",
gameSessions: "id,score"
});
db.version(2).stores({
friends: "++id, [firstName+lastName], yearOfBirth, *tags", // Change indexes
gameSessions: null // Delete table
}).upgrade(function () {
// Will only be executed if a version below 2 was installed.
return db.friends.modify(function (friend) {
friend.firstName = friend.name.split(' ')[0];
friend.lastName = friend.name.split(' ')[1];
friend.birthDate = new Date(new Date().getFullYear() - friend.age, 0);
delete friend.name;
delete friend.age;
});
});
ããŒã¿ããŒã¹ã®ããŒãžã§ã³ãã³ã°ã«é¢ããŠããã«èªã
class Friend {
// ãããã¿ã€ãã¡ãœãã
save() {
return db.friends.put(this); // èªèº«ã®ããããã£ã®ã¿ä¿å.
}
// ãããã¿ã€ãããããã£
get age() {
return moment(Date.now()).diff (this.birthDate, 'years');
}
}
db.friends.mapToClass(Friend);
åç §: Table.mapToClass()
db.friends.add({name: "Josephine", age: 21});
åç §: WriteableTable.add()
db.people.bulkAdd([{name: "Foo"},{name: "Bar"}]);
åç §: WriteableTable.bulkAdd()
db.friends.put({id: 4, name: "Foo", age: 33});
åç §: WriteableTable.put()
db.friends.bulkPut([
{id: 4, name: "Foo2", age: 34},
{id: 5, name: "Bar2", age: 44}
]);
åç §: WriteableTable.bulkPut()
db.friends.update(4, {name: "Bar"});
åç §: WriteableTable.update()
db.customers
.where("age")
.inAnyRange([ [0, 18], [65, Infinity] ])
.modify({discount: 0.5});
åç §: WriteableCollection.modify()
db.friends.delete(4);
åç §: WriteableTable.delete()
db.friends.bulkDelete([1,2,4]);
åç §: WriteableTable.bulkDelete()
db.logEntries
.where('timestamp').below(Date.now() - 100000)
.delete();
åç §: WriteableCollection.delete()
db.friends
.where("age").between(20, 25)
.offset(150)
.limit(25)
.toArray()
.then(function (friends) {
//
});
db.friends
.where("name").equalsIgnoreCase("josephine")
.each(function(friend) {
console.log("Found Josephine: " + JSON.stringify(friend));
})
.then(...);
db.friends
.where("name")
.startsWithAnyOfIgnoreCase(["a", "b", "c"])
.toArray()
.then (function (friends) {
...
});
åç §: Table.where(), WhereClause, Collection
db.friends
.where('age')
.inAnyRange([[0,18], [65, Infinity]])
.modify({discount: 0.5});
åç §: Table.where(), WhereClause, WriteableCollection.modify()
db.friends
.filter(friend => /a/i.test(friend.name))
.toArray()
.then(function (friendsContainingLetterA) {
...
});
åç §: Table.filter()
db.friends
.where('[firstName+lastName]')
.equals(["Hillary", "Clinton"])
.first()
.then(function (president) {
...
});
[è€åã€ã³ããã¯ã¹ã«é¢ããŠããã«èªã](Compound Index)
db.friends
.where('age').above(25)
.or('shoeSize').below(8)
.or('interests').anyOf('sports', 'pets', 'cars')
.modify(friend => friend.tags.push("marketing-target"));
åç §: Collection.or()
db.gameSessions
.orderBy("score")
.reverse()
.limit(5)
.toArray()
.then(function(sessions) {
console.log (
"My 5 top sessions: " +
sessions.map(function (s) { return s.date }));
});
åç §: Table.orderBy(), Collection.reverse(), Collection.limit()
var db = new Dexie('music');
db.version(1).stores({
genres: '++id,name',
albums: '++id,name,year,*tracks',
bands: '++id,name,*albumIds,genreId'
});
var all = Dexie.Promise.all;
function getBandsStartingWithA () {
// ã¯ãšãª
return db.bands
.where ('name')
.startsWith ('A')
.toArray()
.then (bands => {
// Set genre and albums as direct properties on each result
return all (bands.map (band =>
all([
db.genres.get (band.genreId),
db.albums.where('id')
.anyOf (band.albumIds)
.toArray ()
]).then (result => {
[band.genre, band.albums] = result;
return band;
});
));
});
}
Dexie.spawn(function*() {
var id = yield db.friends.add({name: 'Simon', age: 3});
console.log("Simon got id: " + id);
var oldFriends = yield db.friends.where('age').above(75).toArray();
console.log("Old friends: " + oldFriends.map(f => f.name));
// 9æ³ä»¥äžã®ãã¹ãŠã®åéã«ç¬ãããã:
var addedPetIds = yield db.transaction('rw', db.friends, function* () {
// ç¬ããããããã¹ãŠã®åéã®äž»ããŒãåŸã:
var primaryKeys = yield db.friends.where('age').above(8).primaryKeys();
return yield Dexie.Promise.all(
// æ°ãã«ç¬ã远å ããŠããã®å€éšããŒã«äžããåéãã»ãã
primaryKeys.map(friendId => db.pets.add({kind: 'dog', ownerId: friendId})
);
});
}).catch (function (err) {
console.error (err.stack);
});
var birthday = Dexie.async(function* (friendId) {
yield db.friends
.where('id')
.equals(friendId)
.modify(friend => {
friend.age++;
});
});
birthDay(2).catch(err => console.error(err.stack));
function goodFriends() {
return db.friends
.where('tags')
.equals('close-friend');
}
function addComment(friendId, comment) {
return db.friends
.where('id')
.equals(friendId)
.modify(friend => {
friend.comments.push(comment);
});
}
function spreadYourLove() {
// 倿Žã®ã¢ãããã¯å:
return db.transaction('rw', db.friends, function* () {
var goodFriendKeys = yield goodFriends().primaryKeys();
yield Dexie.Promise.all(
goodFriendKeys.map(id => addComment(id, "I like you!"))
);
});
}
äžã®ã³ãŒãã¹ããããã¯ããã©ã³ã¶ã¯ã·ã§ã³ãªããã®ã³ãŒã(颿° goodFriends() ãš addComment()) ãåå©çšããŠããã©ã³ã¶ã¯ã·ã§ã³å (spreadYourLove())ã§å®è¡ã§ããããšã瀺ããŠããã
åç §: Dexie.transaction()
// ãã§ã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠããä»ã®é¢æ°ãåŒã¶1ã€ã®å€§ããªã¢ãããã¯ãªå€æŽã«ãã
db.transaction('rw', db.friends, db.diary, function*() {
yield spreadYourLove();
yield db.diary.log({date: Date.now(), text: "Today I successfully spread my love"});
}).catch (err => {
console.error ("I failed to spread my love :( " + err.stack);
});
äžã®ã³ãŒãã¹ããããã¯å®éã«ãã©ã³ã¶ã¯ã·ã§ã³ãèªèããŠããã³ãŒããåå©çšã§ãããã®ãããªè€æ°ã®é¢æ°ããŸãšããŠ1ã€ã®ã¢ã³ãã¬ã©ãã©ã³ã¶ã¯ã·ã§ã³ã«ã«ãã»ã«åããããšãã§ããããšã瀺ããŠãã
åç §: Dexie.transaction()
Dexie.js ã¯éåæAPIã§ãããåæAPIã§ã¯ãšã©ãŒã¯éåžžäŸå€ã䜿ã£ãŠåŠçããããããã¯éåžžã«äŸ¿å©ã§ããããªããªããããããšããã§ãšã©ãŒããã§ãã¯ããããšãªããããé«ãã¬ãã«ã§äŸå€ããã£ããããã°è¯ãããã§ãããéåæAPIã§ã¯éåžžãæåããã³ãšã©ãŒã€ãã³ãã䜿ã£ãŠãæäœãçµäºããéã«éç¥ãããindexedDBã¯äŸå€ãšãšã©ãŒã€ãã³ãã®çµã¿åããã䜿ã£ãŠåŒã³åºãå (caller)ã«éç¥ããã®ã§ããšã©ãŒåŠçãæ£ããã³ãŒãã£ã³ã°ããããšã¯éåžžã«é¢åã§ãããåã ãã¹ãŠã®ãªã¯ãšã¹ãã«å¯ŸããŠtry..catchãšrequest.onerrorã®äž¡è ãè¡ãå¿ èŠãããããã§ãããDexie.jsã¯ECMAScript6æºæ ã®Promises ã䜿ãããšã§ãã®åé¡ã解決ãããšã©ãŒåŠçãtry..catchãšã©ãŒåŠçãè¡ãåæAPIãšåããããç°¡åãªãã®ã«ããŠããã
(Dexie.jsã®ãããª)PromiseããŒã¹ã®APIã¯ã€ãã³ãããŒã¹ã®APIãšããããåæAPIã®ããã«èŠããã ããããã ããçµæãè¿ãã®ã§ã¯ãªãPromiseãè¿ããECMAScript6ã®Promiseã¯2ã€ã®ã¡ãœãããthen() ãš catch()ãæã£ãŠããããããã®ã¡ããœãã¯åã æäœãæåãŸãã¯å€±æããéã«åŒã°ããã³ãŒã«ããã¯ãèŠæ±ãããDexieã®éåæã¡ãœããã¯ãã¹ãŠPromiseã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããããã«ããããããžã§ã¯ãã«å«ãŸããäŸã§èŠãããããã«ãAPIã¯äœ¿ãããããã®ã«ãªã£ãŠããã
Dexieã®Promises㯠A+ / ES6 æºæ ã§ãããbluebird ã Qããã€ãã£ãPromiseãªã©ã®ä»ã®Promiseã©ã€ãã©ãªãšãéæ³ã®ããã«ããŸãåããããšãã§ãããDexieã®Promisesã¯Typescript ãES7ã®async / await ã§ã䜿çšããããšãã§ããããã ããDexie.Promise
ã¯ãã©ã³ã¶ã¯ã·ã§ã³å
ã®æäœãè¡ãéã®äœ¿çšã«çããŠããããšãéèŠã§ãããããã§ãªããšindexedDBèªäœã®å¶éã«ããå®è¡äžã®ãã©ã³ã¶ã¯ã·ã§ã³ãæå³ããæ©ãã³ããããããããšãããããã ãããã©ã³ã¶ã¯ã·ã§ã³ã®æçµçµæïŒdb.transaction()ã«ããè¿ãããæçµçãªPromiseïŒã¯ä»ã®ä»»æã®Promiseã©ã€ãã©ãªãšå®å
šã«æ··ããããšãã倿ããããšãå¯èœã§ããã
Dexieã®Promisesã¯ã¹ã¬ããã»ããŒã«ã«ã»ã¹ãã¬ãŒãž ãšåããã¿ãŒã³ããµããŒãããŠãããå®è¡äžã®Promiseããã³ãã®åPromiseã«ãã€ã³ããããã¹ã¿ãã£ãã¯ããããã£ãæã€ããšãã§ãããããã¯Angularã®zone.js ãšåãã§ãããã察象ã¯Promiseã ãã§ãããglobalã倿Žããããšã¯ã§ããªããDexie.jsãšãã®ãã©ã³ã¶ã¯ã·ã§ã³APIã¯ããã«åŒ·ãäŸåããŠããããªããªããããã«ããã³ãŒãã¯ãã©ã³ã¶ã¯ã·ã§ã³ãªããžã§ã¯ããæž¡ãããšãªãå®è¡äžã®ãã©ã³ã¶ã¯ã·ã§ã³ãç¥ãããšãã§ããããã§ããã Promise-Specific Data doc supports a pattern similar to where it is possible to have static properties that is bound to the executing promise and all it's child-promises. This is similar Angular's zone.js but only for Promises and without having to modify globals. Dexie.js and it's transaction API heavily depends on it since it enables code to be aware of the currently executing transaction without having to pass transaction objects around. PromiseåºæããŒã¿.
Dexieã§ã¯indexedDBãšã¯ç°ãªããPromise.catch()ã¡ãœãããšãããäŸå€ãæããåäžã®æ¹æ³ãååšãããæšæºçãªtry..catch()ã䜿çšããå¿ èŠã¯ã©ãã«ããªãããã®çç±ã¯callerã«è€æ°ã®ãšã©ãŒåŠçã®æ¹æ³ãèããå¿ èŠããªããããšã§ããããã©ã³ã¶ã¯ã·ã§ã³ã䜿çšãããšãããŒã¿ããŒã¹æäœæ¯ã«promiseã®catch()åŠçãããã®ã§ã¯ãªãããã©ã³ã¶ã¯ã·ã§ã³ã®æçµå°ç¹ã®äžç®æã§ãã¹ãŠã®ãšã©ãŒãæãããããšããå©ç¹ããããä»»æã®æªææãšã©ãŒïŒãšã©ãŒã€ãã³ãã§ãããäŸå€ã§ãããã³ãŒãäžã®å€æ°ã®ãã¹ã¹ãã«ã§ããïŒã¯å®è¡äžã®ãã©ã³ã¶ã¯ã·ã§ã³ãã¢ããŒããããè¿ãå€ã®Promise ã®rejectãåŒã³åºãããã©ã³ã¶ã¯ã·ã§ã³ã¹ã³ãŒãã«ä»äžãããä»»æã®catch()ç¯ãåŒã³èŠãŸãããšã«ãªãã
db.transaction('rw', db.friends, function() {
...
window.MissSpelledVar.NonExistingVar = 3; // 倱æãã!
}).catch (function (err) {
// ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¢ããŒã!
console.error(err);
});
ãã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³Promiseã¯catchãããããcallerã«è¿ãããã¹ãã§ããããã®ãã¿ãŒã³ã«åŸããªãå Žåã¯ãPromise.on('error') ãçºç«ããã
Dexie.Promise.on('error', function (err) {
// æªææã®DBé¢é£ã®ãšã©ãŒãšäŸå€ããã¹ãŠè£è¶³ãã
console.error(err);
});
ãã©ã³ã¶ã¯ã·ã§ã³å ã§ããŒã¿ããŒã¹æäœããã®Promiseãè£è¶³ããå Žåãããã¯åŠçããããšèãããããã©ã³ã¶ã¯ã·ã§ã³ã¯ã¢ããŒãããªããããã¯ããã©ã³ã¶ã¯ã·ã§ã³ãã¢ããŒãããããšãæåŸ ããŠããã°åºåã®ããã ãã«ãã©ã³ã¶ã¯ã·ã§ã³å ã§Promiseãè£è¶³ããæãäžè¬çãªèœãšã穎ã«ãªãå¯èœæ§ãããããããé¿ããæ¹æ³ã¯åŠçããªããšã©ãŒãre-throwããããšã§ããã
db.transaction('rw', db.friends, function() {
db.friends.add({id: 1, name: "Foo"}).catch(function(e) {
console.error("Failed to add Foo friend");
throw e; // ãã©ã³ã¶ã¯ã·ã§ã³ãã¢ããŒãããããã«Rethrow
});
})
2ã€ä»¥äžã®æäœãè¡ãããå Žåã¯åžžã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿ãããšã§ã³ãŒããç°¡çŽ åã§ããããã©ã³ã¶ã¯ã·ã§ã³ã䜿ãããšã«ãã以äžã®å©ç¹ã享åã§ããã
- ããŒã¿ããŒã¹ãæŽæ°äžã«äœããã®ãšã©ãŒïŒããããçš®é¡ã®ãšã©ãŒã€ãã³ããäŸå€ïŒãçºçããå Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯ã¢ããŒããããã¹ãŠã®å€æŽã¯ããŒã«ããã¯ãããã
- ããããªããã°PromiseãåŠçããå¿ èŠããŸã£ãããªãããããåŠçã§ããããã«ãã¹ãŠã¯ãã©ã³ã¶ã¯ã·ã§ã³ã«ã«ãã»ã«åãããã
- æäœã¯ãã¹ãŠåæçã«æžãããšãã§ããåŠçãè¡ãåã«åã®åŠçãçµããã®ãåŸ ã€å¿ èŠããªãïŒä»¥äžã®2ã€ãã®ã³ãŒãäŸãåç §ïŒã
- writeæäœåŸã®readæäœãwriteã®çµäºãåŸ ããã«è¡ãããšãã§ããããã®å Žåã§ããçµæã«ã¯ãã¹ãŠã®å€æŽãå«ãŸããããããå¯èœãªã®ã¯ãçŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³ã§å®è¡ããä¿çäžã®writeæäœãããå Žåã¯ãã¹ãŠã®æäœããã¥ãŒã€ã³ã°ãããããã§ããã
- ã©ã®ãšã©ãŒãèŠéãããããšã¯ãªããæçµçãªcatch()ã¡ãœããã§ãã¹ãŠã®ãšã©ãŒïŒããããçš®é¡ã®ãšã©ãŒã€ãã³ããšéåžžã®äŸå€ã®äž¡è ïŒãè£è¶³ããã
以äžã¯ãã©ã³ã¶ã¯ã·ã§ã³ãããã¯ã®å©çšæ³ã§ãã:
db.transaction('rw', db.friends, db.pets, function () {
// çºçããä»»æã®ããŒã¿ããŒã¹ãšã©ãŒã€ãã³ãã¯ãã©ã³ã¶ã¯ã·ã§ã³ãã¢ããŒããã
// 以äžã®catch()ã¡ãœããã«éãããã
// ä»»æã®äŸå€ãæããããŠãåãã
return db.pets.add({name: 'Bamse', kind: 'cat'}).then(function (petId) {
return db.friends.add({name: 'Kate', age: 89, pets: [petId]});
});
}).catch(function (error) {
// ãšã©ãŒããã°åºåããã衚瀺ããã
console.error (error.stack || error);
});
泚:
- 'friends' ãš 'pets' ã¯Version.stores()ã¡ãœããã䜿ã£ãŠç»é²ãããobjectStoreã§ããã
- readæäœããããªãå Žåã¯ã
"rw"
ã¯"r"
ã«çœ®ãæããã - ãã©ã³ã¶ã¯ã·ã§ã³å ã®é£ç¶çãªããŒã¿ããŒã¹æäœã§çºçãããšã©ãŒããäžé£ã®then()ã³ãŒã«ããã¯ã§çºçããäŸå€ãããã©ã³ã¶ã¯ã·ã§ã³ã®catch()ã¡ãœããã§è£è¶³ãããã
- 倱æããDBæäœãæç€ºçã«è£è¶³ããå Žåã¯ããã©ã³ã¶ã¯ã·ã§ã³ãã¢ããŒããããªãå Žåãããã
db.transaction('rw', db.friends, function() {
db.friends.add({id:1, name:"Fredrik"});
db.friends.add({id:1, name:"Fredrik"}).catch(function (err) {
// åãäž»ããŒã2床ç»é²ããããšãããšãã¡ãã倱æããããããã
// ãã®ãšã©ãŒãæç€ºçã«è£è¶³ããŠããã®ã§ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¢ããŒãããªãã
// ããããããšã§ãã©ã³ã¶ã¯ã·ã§ã³ãç¶ç¶ãããããšãã§ããã
// ãã©ã³ã¶ã¯ã·ã§ã³ãã¢ããŒãããããå Žåã¯ã
// Dexie.currentTransaction.abort()ãå®è¡ããããäŸå€ãæãããã
// åã«æ¬¡ãå®è¡ãã:
// return Dexie.Promise.reject(err);
});
}).then (function () {
alert ("Transaction successfully completed");
});
ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠããå Žåã¯ãadd(), put(), update(), delete(), modify()æäœã®å¯Ÿè±¡ã次ã®è¡ã§åŠçãåŸ ã€ããšãªãåãåãããããšãã§ãããåŸ ã€ããšã¯ãã¬ãŒã ã¯ãŒã¯ã§åŠçãããŠããããã©ã³ã¶ã¯ã·ã§ã³ã䜿ãããšã§æ¯å .then()ãã³ãŒã«ããå¿ èŠããªããããã«ã³ãŒããç°¡çŽ åãããã以äžã®ã³ãŒãã®éããèŠãŠãããããã
db.friends.add({ name: "Ulla Bella", age: 87, isCloseFriend: 0 }).then(function () {
return db.friends.add({ name: "Elna", age: 99, isCloseFriend: 1 });
}).then(function (){
return db.friends.where("age").above(65).each(function (friend) {
console.log("Retired friend: " + friend.name);
});
}).catch(function (error) {
console.error(error);
})
db.transaction("rw", db.friends, function () {
db.friends.add({ name: "Ulla Bella", age: 87, isCloseFriend: 0 });
db.friends.add({ name: "Elna", age: 99, isCloseFriend: 1 });
db.friends.where("age").above(65).each(function (friend) {
console.log("Retired friend: " + friend.name);
});
}).catch(function (error) {
console.error(error);
});
äžã®äŸã§ã¯ãåäžã®ãã©ã³ã¶ã¯ã·ã§ã³å ã§ã¯add()æäœãåŸ ã€å¿ èŠãç¡ãããšã瀺ããŠããã
IndexedDBã¯tickå ã§äœ¿çšãããªããªããåŠããã©ã³ã¶ã¯ã·ã§ã³ãã³ããããããããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã¹ã³ãŒãå ã§ã¯ä»ã®éåæAPIãåŒãã§ã¯ãããªãïŒå°ãªããšãããã®çµäºãåŸ ã£ãŠããããªãïŒããšãæå³ãããããããããšãã©ã³ã¶ã¯ã·ã§ã³ã®äœ¿çšãç¶ç¶ãããšãããåŠãTransactionInactiveErrorãæããããããšã«ãªããããã¯IndexedDBã®ãµããŸããªã®ã§Dexie.Promiseã§ã³ãŒã«ãã«ãã»ã«åããŠãåé¿ããããšã¯ã§ããªãã
ããŒãžã§ã³0.9.8以é, Dexieã¯å ¥ãåã®ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒãããã
db.transaction('rw', db.friends, db.pets, function () {
// ã¡ã€ã³ãã©ã³ã¶ã¯ã·ã§ã³ãããã¯
db.transaction('rw', db.pets, function () {
// ãµããã©ã³ã¶ã¯ã·ã§ã³ãããã¯
});
});
å ¥ãåã®ãã©ã³ã¶ã¯ã·ã§ã³ãæã€èœåã¯ããã©ã³ã¶ã¯ã·ã§ã³ã䜿çšãã颿°ãããã®ãã¹ãŠã®ã³ãŒã«ããã倧ããªãã©ã³ã¶ã¯ã·ã§ã³ã«å ã¿èŸŒãããé«ã¬ãã«ãªã³ãŒãã«ããåå©çšã§ããããšã§ããã
ãã詳现ãªãã©ã³ã¶ã¯ã·ã§ã³ã®äœ¿çšæ³ã«ã€ããŠã¯Dexie.transaction()ãåç §ããããã