0

我正在开发一个离子应用程序。为了使用 broswer 测试 sqlite 数据库,我遵循了使用 sql.js 库的本教程。

教程:https ://www.techiediaries.com/mocking-native-sqlite-plugin/

库:https ://github.com/kripken/sql.js/

我需要做一些级联删除但是当我运行时

PRAGMA foreign_keys=ON

级联删除在浏览器上不起作用(适用于真实设备)

如果我再跑

PRAGMA foreign_keys

在浏览器中的结果是

foreign_keys[{"foreign_keys":0}]

有没有办法使用 sql.js 启用级联删除?我在文档中找不到任何关于它的信息,但其他所有语句都可以正常工作

sqliteMock

declare var SQL;
@Injectable()
export class SQLiteMock {
    public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
        var db;
        var storeddb = localStorage.getItem("database");

        if(storeddb)
        {
            var arr = storeddb.split(',');
            db = new SQL.Database(arr);
        }
        else
        {
            db = new SQL.Database();
        }

        return new Promise((resolve,reject)=>{
            resolve(new SQLiteObject(db));
        });
    }

    public deleteDatabase(config: SQLiteDatabaseConfig): Promise<any>{
        return new Promise((resolve,reject)=>{
            localStorage.removeItem("database");
        });
    };
}

@Injectable()
export class SQLiteObject {
    _objectInstance: any;
    constructor(_objectInstance: any) {
        this._objectInstance = _objectInstance;
    };
    public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
        var db;

        console.log("Open Mock SQLite Database.");
        var storeddb = localStorage.getItem("database");

        var arr = storeddb.split(',');
        if (storeddb) {
            db = new SQL.Database(arr);
        }
        else {
            db = new SQL.Database();
        }

        return new Promise((resolve, reject) => {
            resolve(new SQLiteObject(db));
        });
    }
    executeSql(statement: string, params: any): Promise<any> {
        return new Promise((resolve, reject) => {
            try {
                var st = this._objectInstance.prepare(statement, params);
                var rows: Array<any> = [];
                while (st.step()) {
                    var row = st.getAsObject();
                    rows.push(row);
                }
                var payload = {
                    rows: {
                        item: function (i) {
                            return rows[i];
                        },
                        length: rows.length
                    },
                    rowsAffected: this._objectInstance.getRowsModified() || 0,
                    insertId: this._objectInstance.insertId || void 0
                };

                //save database after each sql query 
                var arr: ArrayBuffer = this._objectInstance.export();
                localStorage.setItem("database", String(arr));
                resolve(payload);
            } catch (e) {
                reject(e);
            }
        });
    };
}

数据库创建者

@Injectable()
export class ConnectionBddProvider {
  public db: any = null;
  listfavoris: FavorisModel[] = [];
  favoris: FavorisModel = null;
  constructor(public platform: Platform, private alertCtrl: AlertController, private serveur: ConnectionServerProvider, private device: Device) {

  }

  CreateBdd(): Promise<any> {
      let sql: any;
      let lParamSql: SQLiteDatabaseConfig = null;
      if(this.device.isVirtual == false){
        console.log("Real Device")
        //--- sur device
        sql = new SQLite();
        lParamSql = { name: 'test.db', location: 'default'};
      }
      else{
        console.log("Virtual Device")
        sql = new SQLiteMock()
        lParamSql = { name: 'test.db', location: 'default', createFromLocation: 1};
      }
      return sql.create(lParamSql)
      .then((db: any) => { 
        this.db = db;
      }).catch((error) => console.error(error));
  }

 CreateTMOBILEFAVORIS(): Promise<any> {
    return this.db.executeSql(`CREATE TABLE IF NOT EXISTS TMOBILEFAVORIS (
              IdFavoris integer PRIMARY KEY AUTOINCREMENT, 
              IdFavorisParent int, 
              Nom varchar(255), 
              Description varchar(4000), 
              FOREIGN KEY(IdFavorisParent) REFERENCES TMOBILEFAVORIS(IdFavoris) ON DELETE CASCADE 
            )`, {})
    .then(() => console.log('create TMOBILEFAVORIS ok'))
    .catch(error => console.error(error)); 
  }

  enableForeignKeys(): Promise<any> {
    return this.db.executeSql('PRAGMA foreign_keys=ON', [])
    .then((data) => {
      console.log("PRAGMA maybe ok");
    })
    .catch((error) => {
      console.error(error);
      console.log("erreur pragma");
    }); 
  }

  checkForeignKeysEnabled(): Promise<any> {
    return this.db.executeSql('PRAGMA foreign_keys', [])
    .then((data) => {
      console.log("PRAGMA res: " + JSON.stringify(data));
    })
    .catch((error) => {
      console.error(error);
      console.log("erreur pragma");
    }); 
  }
}

应用初始化

this.bddService.CreateBdd().then(() => {
   this.bddService.enableForeignKeys().then(( ) => { 
       this.bddService.checkForeignKeysEnabled().then(( ) => {      
          this.bddService.CreateTMOBILEFAVORIS().then(() => {
             this.serveur.calculTokenConnexion().then(() => {                      
                this.nav.setRoot(FavorisPage);            
             })
          })
       })
    })
 });

当我创建表 tmobilefavoris 的两个实例时,一个父级和另一个的一个子级,当我删除父级时,子级不会在浏览器上删除。

4

0 回答 0