====== SQLite ====== expoに含まれるデータベース [[https://docs.expo.io/versions/latest/sdk/sqlite/|SQLite]] [[https://www.dbonline.jp/sqlite/|SQLite入門]] ===== 基本 ===== 当たり前だが、パラメーター変数(?置換え)を使用する場合は、順番に気をつける必要がある。。。 import { Constants, SQLite } from 'expo'; const db = SQLite.openDatabase('SampleDatabase.db'); ・・・ componentDidMount(e){ db.transaction(tx => { tx.executeSql( 'create table if not exists items (id integer primary key not null, done int, value text);' ); }); db.transaction( tx => { tx.executeSql('insert into items (done, value) values (0, ?)', ["safa"]); tx.executeSql('select * from items', [], (_, { rows }) => console.log(JSON.stringify(rows)) ); }, null, console.log("test") ); ==== executeSql ==== tx.executeSql(sqlStatement, arguments, successコールバック関数, errorコールバック関数) sqlStatement:SQL arguments:SQLに?を使用すると、置換え変数にできる。(プリペアードステートメント) success,error:それぞれ自身のトランザクションと、結果の2つのパラメータが返る。 executeSql = async (sql, params = []) => { return new Promise((resolve, reject) => db.transaction(tx => { tx.executeSql( sql , params, (_, { rows }) => { console.log("sql done"), //resolve(rows._array) resolve(rows.length) } , reject) })) } async componentDidMount(e){ //成功コールバック関数 let suc=function(){ console.log("success") } //エラーコールバック関数 let fai=function(){ console.log("fail") } console.log("----- start -----") await this.executeSql('select * from items',[]).then((val)=>console.log("resulat=" + val)) .catch(()=>console.log("err")) console.log("----- end -----") [00:43:58] ----- start ----- [00:43:58] sql done [00:43:58] resulat=0 [00:43:58] ----- end ----- ==== ROWID ==== SQLiteにはデータをINSERTすると自動でROWIDがつく。 SELECTでは明記しないと取得できないので注意。 [[https://www.sqlite.org/autoinc.html|SQLite Autoincrement]] [[https://www.dbonline.jp/sqlite/table/index8.html|ROWIDの利用]] db.transaction( tx => { tx.executeSql('select *,ROWID from items', [], (_, { rows }) => { console.log(JSON.stringify(rows)) console.log({count:rows.length}) } ); }, null, ); ==== await/asycnするためには? ==== [[https://stackoverflow.com/questions/47345000/react-native-handling-async-calls-to-sqllite-db|React Native : Handling Async calls to sqllite db]] excuteはコールバックしているので、Promiseを返すようにする必要がある。 executeSql = async (sql, params = []) => { return new Promise((resolve, reject) => db.transaction(tx => { tx.executeSql('select * from items', [], (_, { rows }) => { console.log("sql done"), resolve(rows._array) } , reject) })) console.log("----- start -----") await this.executeSql(null,null) console.log("----- end -----") [08:05:41] ----- start ----- [08:05:41] sql done [08:05:41] ----- end ----- ===== 以下だだのメモ ===== //db.transaction(callback, error, success) console.log("----- drop start -----") db.transaction((tx)=>{console.log("callback")}, console.log("error"), console.log("success")) console.log("----- drop end -----") [06:56:31] ----- drop start ----- [06:56:31] error [06:56:31] success [06:56:31] ----- drop end ----- [06:56:31] callback executeSql = async (sql, params = []) => { return new Promise((resolve, reject) => db.transaction(tx => { tx.executeSql('select * from items', [], (_, { rows }) => { console.log("sql done"), resolve(rows._array) } , reject) })) } async getDB(){ await db.transaction((tx)=>{return "callback"}, console.log("error"), console.log("success")) } async componentDidMount(e){ // db.transaction(callback, error, success) console.log("----- drop start -----") await console.log(this.getDB()) console.log("----- drop end -----") } [07:12:05] ----- drop start ----- [07:12:05] error [07:12:05] success [07:12:05] Promise { [07:12:05] "_40": 0, [07:12:05] "_55": null, [07:12:05] "_65": 0, [07:12:05] "_72": null, [07:12:05] } [07:12:05] ----- drop end -----