使用的第三方插件:react-native-sqlite-storage https://github.com/andpor/react-native-sqlite-storage
具体配置步骤,见github
参考例子见:https://blog.csdn.net/xukongjing1/article/details/70141157
本文主要描述具体的使用,包括对数据库版本升级的处理(上述链接的例子上没有找到数据库升级处理,参数中的版本号也不确定是何用途,因此暂时采用自己的创建一个存储当前数据库版本的数据表这样的笨办法简单实现)
import React, { Component } from 'react';
import {
ToastAndroid,
} from 'react-native';
import SQLiteStorage from 'react-native-sqlite-storage';
SQLiteStorage.DEBUG(true);
var database_name = "test.db";//数据库文件
var database_version = "1.0";//最新的版本号,可用于和数据库中存储的版本号进行对比,如果此值大,则表示需要升级数据表,则需要删除原有的表重新建表
var database_displayname = "MySQLite";
var database_size = -1;
var db;
export default class SQLite extends Component {
constructor(props){
super(props)
this.init()
}
init(){
if (!db) {
this.open();
}
//this.executeSql("drop table dbver")
this.createUserTable()
//检查当前数据库版本是否是最新的
this.getDbVersion("userdb",(ver)=>{
if(ver==null){
this.ceateDbVerTable(()=>{
this.updateUserDbverion(database_version)
})
return;
}
//当前版本号大于已存在的版本号,则视为需要升级数据库,需要删除数据表重建
if(parseFloat(database_version)>parseFloat(ver)){
this.dropUserTable(()=>{this.createUserTable()})
}
this.updateUserDbverion(database_version)
})
}
/**
* [getDbVersion description] 获取某个数据库的版本号
* @param {Function} callback [description]
* @return {[type]} [description]
*/
getDbVersion(dbname,callback){
this.executeSql(`select * from dbver where name='${dbname}'`,[],(tx,results)=>{
var len = results.rows.length;
if(len>0){
let obj=results.rows.item(0)
callback(obj.version)
}else{
callback(null)
}
},(err)=>{
callback(null)
})
}
/**
* 更新某一个数据库的版本号,如用户关系数据库userdb
* @param {[type]} ver [description]
* @return {[type]} [description]
*/
updateUserDbverion(ver){
this.executeSql(`replace into dbver(name,version) values('userdb',${ver})`)
}
executeSql(sql,param=[],callback=()=>{},errCallback=()=>{}){
if (!db) {
this.open();
}
db.transaction((tx)=>{
tx.executeSql(sql,param,(tx,results)=>{
callback&&callback(tx,results)
this._successCB('executeSql success: '+sql);
},(err)=>{
errCallback&&errCallback(err)
console.log("executeSql"+err);
}
);
},(error)=>{
errCallback&&errCallback(error)
this._errorCB('transaction executeSql', error+sql);
},()=>{
errCallback&&errCallback("transaction error")
this._successCB('transaction executeSql: '+sql);
});
}
/**
* 创建存储数据库版本号的数据表
* @param {Function} callback [description]
* @return {[type]} [description]
*/
ceateDbVerTable(callback){
this.executeSql(`CREATE TABLE IF NOT EXISTS dbver(name varchar PRIMARY KEY ,version varchar)`,[],()=>{
callback&&callback()
})
}
componentWillUnmount(){
if(db){
this._successCB('close');
db.close();
}else {
console.log("SQLiteStorage not open");
}
}
open(){
db = SQLiteStorage.openDatabase(
database_name,
database_version,
database_displayname,
database_size,
()=>{
this._successCB('open');
},
(err)=>{
this._errorCB('open',err);
});
return db;
}
createUserTable(){
//,address VARCHAR
this.executeSql(`CREATE TABLE IF NOT EXISTS tbUser(id INTEGER primary key AUTOINCREMENT,name varchar,sex varchar,address text)`)
}
deleteUserData(){
this.executeSql(`delete from tbUser`)
}
dropUserTable(callback){
this.executeSql(`drop table tbUser`,[],callback)
}
queryUserData(sql,callback){
if (!db) {
this.open();
}
//查询
db.transaction((tx)=>{
tx.executeSql(sql, [],(tx,results)=>{
var len = results.rows.length;
let result=[]
//遍历处理返回数组的格式,方便界面上渲染处理
for(let i=0; i{
console.log(error);
});
}
insertUserData(data){
let len = data.length;
if (!db) {
this.open();
}
db.transaction((tx)=>{
for(let i=0; i{
},(err)=>{
console.log(err);
}
);
}
},(error)=>{
this._errorCB('transaction', error);
},()=>{
this._successCB('transaction insert data');
});
}
close(){
if(db){
this._successCB('close');
db.close();
}else {
console.log("SQLiteStorage not open");
}
db = null;
}
_successCB(name){
console.log("SQLiteStorage "+name+" success");
}
_errorCB(name, err){
console.log("SQLiteStorage "+name);
console.log(JSON.stringify(err));
}
render(){
return null;
}
}
使用方式:
import SQLite from "./SQLite.js"
var sqLite = new SQLite();
//查询
queryData(){
sqLite.queryData("select * from tbUser where sex='女'",(resData)=>{
//处理结果
......
});
}
insertData(){
var userData = [];
let user1={
name:"张三",
sex:"女",
address:"成都市郫都区"
}
let user2={
name:"李四",
sex:"男",
address:"成都市金牛区"
}
userData.push(user1)
userData.push(user2)
sqLite.insertUserData()
}