react-native 海量本地存儲數據使用 react-native-sqlite-storage

在開發app涉及到聊天功能,聊天數據的存儲就成了不可避免的問題。此時就需要使用 react-native-sqlite-storage 來解決這個問題。

1、環境

react-native 版本0.61、node.js版本12.15.0

2、安裝

npm install --save react-native-sqlite-storage

react-native0.61版本默認link,是不需要手動link的

3、android配置

①配置 項目名稱/android/app/build.gradle 文件

// file: android/settings.gradle
...
 
include ':react-native-sqlite-storage'
project(':react-native-sqlite-storage').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sqlite-storage/src/android')

暫時未用到其他配置

4、ios配置  (暫時未測試)

5、使用方式

import React from 'react';
import {
    ToastAndroid,
} from 'react-native';
import SQLiteStorage from 'react-native-sqlite-storage';
SQLiteStorage.DEBUG(true);
let database_name = "msg.db";//數據庫文件
let database_version = "1.0";//版本號
let database_displayname = "MySQLite";
let database_size = -1;//-1應該是表示無限制
let db;
export default class SQLite extends React.Component {
    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;
    }
    createTable() {
        if (!db) {
            this.open();
        }
        //創建關係用戶表
        db.transaction((tx) => {
            tx.executeSql('CREATE TABLE IF NOT EXISTS USER(' +
                'id INTEGER PRIMARY KEY  AUTOINCREMENT,' +//表id
                'useruuid VARCHAR,' +//用戶uuid
                'unreadNum INTEGER,' +//未讀數量
                'online INTEGER,' +//是否在線
                'relation VARCHAR,' +//關係類型 friend strange me system
                'url VARCHAR,' +//頭像
                'name VARCHAR,' +//名稱
                'nickname VARCHAR,' +//暱稱
                'sex INTEGER,' +//性別
                'age INTEGER,' +//年齡
                'remark VARCHAR,' +//備註
                'telephone VARCHAR,' +//電話
                'platform VARCHAR,' +//平臺
                'style VARCHAR,' +//樣式
                'recordtime INTEGER)' //刷新時間
                , [], () => {
                    this._successCB('executeSql', '創建關係用戶表成功!');
                }, (err) => {
                    this._errorCB('executeSql', err, '創建關係用戶表失敗!');
                });
        }, (err) => {//所有的 transaction都應該有錯誤的回調方法,在方法裏面打印異常信息,不然你可能不會知道哪裏出錯了。
            this._errorCB('transaction', err);
        }, () => {
            this._successCB('transaction');
        })
        //創建聊天信息表
        db.transaction((tx) => {
            tx.executeSql('CREATE TABLE IF NOT EXISTS msg(' +
                'id INTEGER PRIMARY KEY  AUTOINCREMENT,' +//msg表id
                'messageid INTEGER,' +//消息id
                'isread INTEGER,' +//消息id
                'classify VARCHAR,' +//消息實體類型
                'content VARCHAR,' +//消息內容
                'recordtime INTEGER,' +//消息時間
                'senderuuid VARCHAR,' +//發送者uuid
                'receiver VARCHAR,' +//接收者uuid
                'format VARCHAR)'//暫時無用
                , [], () => {
                    this._successCB('executeSql', '創建消息表成功!');
                }, (err) => {
                    this._errorCB('executeSql', err, '創建消息表失敗!');
                });
        }, (err) => {//所有的 transaction都應該有錯誤的回調方法,在方法裏面打印異常信息,不然你可能不會知道哪裏出錯了。
            this._errorCB('transaction', err);
        }, () => {
            this._successCB('transaction');
        })
    }
    deleteData() {
        if (!db) {
            this.open();
        }
        db.transaction((tx) => {
            tx.executeSql('delete from user', [], () => {

            });
        });
    }
    dropTable() {
        db.transaction((tx) => {
            tx.executeSql('drop table user', [], () => {

            });
        }, (err) => {
            this._errorCB('transaction', err);
        }, () => {
            this._successCB('transaction');
        });
    }
    insertUserData(userData) {
        let len = userData.length;
        if (!db) {
            this.open();
        }
        this.createTable();
        db.transaction((tx) => {
            for (let i = 0; i < len; i++) {
                let user = userData[i];
                let useruuid = user.useruuid;
                let unreadNum = user.unreadNum || 0;
                let online = user.online || 0;
                let relation = user.relation || 'me';
                let url = user.url || '';
                let name = user.name || '';
                let sex = user.sex || 0;
                let age = user.age || 0;
                let nickname = user.nickname || '';
                let telephone = user.telephone || '';
                let platform = user.platform || 'android';
                let style = user.style || '';
                let recordtime = user.recordtime || (new Date().getTime());
                let sql = "INSERT INTO user(useruuid,unreadNum,online,relation,url,name,nickname,telephone,platform,style,recordtime,sex,age)" +
                    "values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
                tx.executeSql(sql, [useruuid, unreadNum, online, relation, url, name, nickname, telephone, platform, style, recordtime, sex, age], () => {
                    console.log("插入數據成功");
                }, (err) => {
                    console.log('插入數據', err);
                }
                );
            }
        }, (error) => {
            this._errorCB('transaction', error);
            ToastAndroid.show("數據插入失敗", ToastAndroid.SHORT);
        }, () => {
            this._successCB('transaction insert data');
            ToastAndroid.show("成功插入 " + len + " 條用戶數據", ToastAndroid.SHORT);
        });
    }
    insertMsgData(msgData) {
        let len = msgData.length;
        if (!db) {
            this.open();
        }
        this.createTable();
        console.log(len);

        db.transaction((tx) => {
            for (let i = 0; i < len; i++) {
                let msg = msgData[i];
                let messageid = msg.messageid;
                let isread = msg.isread || 0;
                let classify = msg.classify || 0;
                let content = msg.content || 'me';
                let senderuuid = msg.senderuuid || '';
                let receiver = msg.receiver || '';
                let format = msg.format || '';
                let recordtime = msg.recordtime || (new Date().getTime());
                let sql = "INSERT INTO msg(messageid,isread,classify,content,recordtime,senderuuid,receiver,format)" +
                    "values(?,?,?,?,?,?,?,?)";
                tx.executeSql(sql, [messageid, isread, classify, content, recordtime, senderuuid, receiver, format], () => {
                    console.log("插入數據成功");
                }, (err) => {
                    console.log('插入數據', err);
                }
                );
            }
        }, (error) => {
            this._errorCB('transaction', error);
            ToastAndroid.show("數據插入失敗", ToastAndroid.SHORT);
        }, () => {
            this._successCB('transaction insert data');
            ToastAndroid.show("成功插入 " + len + " 條信息數據", ToastAndroid.SHORT);
        });
    }
    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(err);
    }
    render() {
        return null;
    }
};

db.transaction((tx)=>{})表示提交事務

tx.executeSql('sql執行語句', [], () => {});  表示執行sql

具體sql執行語句規範可以參考 菜鳥教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章