React-Native中Sqlite整理使用

使用的第三方插件: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<len; i++){
                    result.push(results.rows.item(i))
                }
                callback&&callback(result)
            });
        },(error)=>{
            console.log(error);
        });
    }
    insertUserData(data){
        let len = data.length;
        if (!db) {
            this.open();
        }
        db.transaction((tx)=>{
            for(let i=0; i<len; i++){
                let user = data[i];
                let sql = "replace INTO tbUser(name,sex,address)"+
                    "values(?,?,?)";
                tx.executeSql(sql,[user.name,user.sex,user.address],()=>{
                    },(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()
}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值