我正在开发一个离子应用程序。为了使用 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 的两个实例时,一个父级和另一个的一个子级,当我删除父级时,子级不会在浏览器上删除。