事务仅查找使用2个对象存储初始化IndexedDB之后创建的第一个对象存储

时间:2019-04-11 12:37:28

标签: indexeddb ionic4

我发现了几篇文章,询问您是否以及如何在单个IndexedDB数据库中创建多个对象存储。我认为那不是我真正的问题。我在一个onupgradeneeded事件中创建了2个对象存储,并且在Google Chrome的开发人员控制台中看到了两个存储。所以我想这可行。

一个对象存储存储锻炼,其他锻炼通过ID引用锻炼(我尝试将它们合并到一个对象存储中,但是在更新信息时太麻烦了)。当我尝试从第一个对象库中检索锻炼和从第二个对象库中检索相应的锻炼时,应用程序不再能找到第二个对象库。似乎只有第一个对象存储可用。

以下代码有望更好地解释该问题:

db.service.ts

数据库初始化:

private db: IDBDatabase;

constructor() { }

public init(): Promise<void> {
    if(this.db) {
        this.db.close();
    }
    return new Promise(resolve => {
        const req = indexedDB.open('workoutsDB', 1);
        req.onupgradeneeded = e => {
            const db = (e.target as any).result;
            const workouts = db.createObjectStore(
                'workouts', {keyPath: 'id'});
            workouts.put({id: '1', name: '5x5'});
            const exercises = db.createObjectStore(
                'exercises', {keyPath: 'id'});
            exercises.put({id: '1', workout: '1', name: 'Squats'});
            exercises.put({id: '2', workout: '1', name: 'Bench presses'});
        }
        req.onsuccess = e => {
            this.db = (e.target as any).result;
            resolve();
        }
    });
}

进行锻炼:

public getWorkout(id): Promise<Workout> {
    return new Promise<Workout>(resolve => {
        var tx = this.db.transaction('workoutsDB', 'readwrite');
        var store = tx.objectStore('workouts');  // <= THIS WORKS!!!
    });
}

进行锻炼:

public getExercises(workoutId): Promise<Exercise[]> {
    return new Promise<Exercise[]>(resolve => {
        var tx = this.db.transaction('workoutsDB', 'readwrite');
        var store = tx.objectStore('exercises'); // <= ERROR!!!
    });
}

从离子页面中调用函数getWorkout(id)getExercises(workoutId)如下:

workout.page.ts

workout: Workout;
exercises: Exercises[] = [];

constructor(private db: DbService) { }

ngOnInit() {
    var id = this.route.snapshot.paramMap.get('id');
    this.db.init().then(() => getWorkout(id));
}

getWorkout(id) {
    this.db.getWorkout(id).then(workout => {
        this.workout = workout;
        this.db.getExercises(id).then(exercises => {
            this.exercises = exercises;
        });
    });
}

我不确定自己在做什么错。显然,进行锻炼需要我首先检索相应的锻炼。我以为不同交易之间或某些事物之间可能存在冲突,但我无法找出问题所在。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

this.db.transaction的第一个参数是错误的。它应该是您将在事务中使用的所有对象存储的名称的数组(或者,如果只是单个对象存储,则可以是仅包含该名称的字符串)。相反,您将数据库的名称放在此处。很有可能是您的错误。

如果没有,请编辑您的帖子以包含您看到的特定错误消息,这将使人们更轻松地为您提供帮助。或包含一个我们可以运行的最小示例,以自己观察错误。